มีวิธีตั้งค่าฟิลด์กำหนดเองเริ่มต้นเมื่อสร้างโพสต์หรือไม่


11

เมื่อฉันสร้างโพสต์ใหม่หลังจากคลิก "เพิ่มใหม่"เมื่อตัวแก้ไขโพสต์แสดงแทนที่จะต้องใช้เมนูดร็อปดาวน์และเลือกฟิลด์ที่กำหนดเองเพื่อใช้ฉันต้องการมีอินพุตฟิลด์ที่กำหนดเองเริ่มต้นอยู่แล้ว ปลายเปิด.

มองเห็นได้แทนที่จะเป็น:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการที่จะมีสิ่งที่ชอบ:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันรู้ว่ามีปลั๊กอินสำหรับ (CPT, ฟิลด์เพิ่มเติม, ฯลฯ ) แต่ฉันต้องการวิธีง่ายๆในการใช้ฟังก์ชันพื้นฐาน

ฉันลองทำสิ่งนี้ (ฉันใช้ประเภทผลิตภัณฑ์โพสต์ที่กำหนดเอง):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

แต่ดูเหมือนจะไม่ทำงาน ฉันคิดว่า hook อาจผิด (เพราะedit_postมาหลังจากอัปเดต) แต่ฉันไม่เห็น hook สำหรับ "new post" (หลังจากผู้ใช้คลิกที่ "new post" ใน wp admin) มีผู้ใด ?

หรืออาจเป็นความคิดทั้งหมดที่ผิดและมีวิธีอื่นหรือไม่

คำตอบ:


9

เบ็ดการดำเนินการsave_postเรียกว่าเมื่อบันทึก แต่ฉันไม่ทราบว่าคุณสามารถเพิ่มข้อมูลเมตาในเวลานี้ แต่มันควรจะเป็นไปได้ในการสร้าง / updated_post_metaปรับปรุงข้อมูลเมตาของคุณหลังจากที่โพสต์ได้รับการบันทึกไว้กับตะขอกระทำ

แก้ไข

ในการเลือกเมตาบางฟิลด์ (ฟิลด์ที่กำหนดเอง) ไว้ล่วงหน้าบนหน้าจอการสร้างโพสต์คุณต้องเพิ่มค่าเมตาเหล่านี้ก่อนด้วยค่าที่ว่างเปล่า

หากคุณดูที่post_custom_meta_box()ฟังก์ชั่น (ซึ่งเป็นการเรียกกลับสำหรับ metabox ที่ใช้postcustom) ในไฟล์wp-admin/includes/meta-boxes.phpคุณจะเห็นว่าฟังก์ชันกำลังใช้list_meta()เพื่อสร้างเขตข้อมูลเมตาที่เลือกไว้ล่วงหน้า

ตอนนี้ให้ดูที่การไหลของโปรแกรมจนกระทั่งเมตาโบอกซ์นี้ปรากฏขึ้น (เรากำลังมองหา action action / filter hook ที่เราสามารถใช้ได้ที่นี่):

  1. WordPress โหลดไฟล์ post-new.php
  2. ไฟล์นี้จะสร้างโพสต์เริ่มต้นในฐานข้อมูลในบรรทัดที่มีฟังก์ชั่น39 get_default_post_to_edit()นั่นเป็นสิ่งที่ดี โดยทั่วไปโพสต์อยู่ในฐานข้อมูลเป็นแบบร่างอัตโนมัติแล้ว น่าเสียดายที่ตอนนี้ยังไม่มีการแก้ไขข้อมูลหรือเพิ่มสิ่งใหม่ ๆ
  3. ในขั้นตอนต่อไปไฟล์edit-form-advaned.phpจะถูกรวมไว้ ไฟล์นี้จะสร้างหน้าผู้ดูแลระบบของหลุมและรวมถึงสารที่จำเป็นทั้งหมดตามsupportsพารามิเตอร์ของประเภทโพสต์
  4. ในบรรทัด136metabox ฟิลด์ที่กำหนดเองpostcustomรวมอยู่และฟังก์ชั่นดังกล่าวเรียกว่า อีกครั้งไม่มีแอคชั่นฮุคที่เราสามารถใช้ได้

ข้อสรุป

ฉันคิดว่าวิธีเดียวที่คุณสามารถทำได้คือใช้ jQuery หรือpostcustomเมตาโบท็อกซ์เกินพิกัดและเพิ่มค่าเมตาก่อนที่จะเรียกใช้list_meta()ฟังก์ชัน

เช่น

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

สิ่งที่เป็นฉันไม่ได้พยายามที่จะเพิ่มอะไรในบันทึกสำหรับตอนนี้ฉันพยายามที่จะแสดงบางส่วนปัจจัยการผลิตฟิลด์ที่กำหนดเองเปิดแล้วเมื่อ arrvies ผู้ใช้บนหน้าการแก้ไข (ดูการอัปเดตกับหน้าจอ)
mike23

อา. ตอนนี้ฉันเข้าใจปัญหาของคุณแล้ว ฉันแก้ไขคำตอบของฉันแล้ว
rofflox

3

นี่เป็นวิธีที่เหมาะสมในการเพิ่มการสนับสนุนฟิลด์ที่กำหนดเอง (คุณไม่ได้รับฟิลด์ว่างเมื่อแก้ไขโพสต์)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');

1

คุณควรใช้การกระทำ save_post และแยกการทำงานของคุณโดยการตรวจสอบประเภทโพสต์ขณะที่มันทำงานในทุกประเภทโพสต์ เห็นได้ชัดว่ามีตรรกะมากกว่านี้คุณจะต้องสร้างมันขึ้นมาเพื่อให้มันทำงานได้ คุณควรตั้งค่าฟิลด์โพสต์เมตาที่ตรวจสอบว่าคุณได้ตั้งค่าเริ่มต้นหนึ่งครั้งเพื่อให้ผู้ใช้ของคุณจะไม่ผิดหวังหากพวกเขาต้องการปล่อยให้ฟิลด์โพสต์เมตาว่างเปล่า

หากคุณต้องการให้ค่าเริ่มต้นเป็นโมฆะ (ตามที่เห็นในตัวอย่างโค้ดของคุณ) ดังนั้นอย่าสร้างฟังก์ชันเพราะสิ่งนี้จะเป็นการเพิ่มเขตข้อมูลค่าใช้จ่ายและโพสต์เมตาที่ไม่ได้เติมด้วยค่าเริ่มต้น

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');

1

ฉันกำลังมองหาคำอธิบายเมตาที่ไม่ซ้ำกันสำหรับแต่ละโพสต์ที่กำหนดเองในเว็บไซต์ WP ที่ฉันกำลังพัฒนา ดังนั้นฉันจึงมองหาฟิลด์กำหนดเองเริ่มต้นและลงจอดที่นี่

ฉันรู้ว่านี้คือการโพสต์เก่าสวย แต่ฉันคิดว่าฉันต้องการโพสต์คำตอบง่ายๆผมพบว่าที่mariokostelac.com

kg เป็นเนมสเปซของฉันคุณสามารถตั้งชื่อฟังก์ชันตามที่คุณต้องการ ฉันค่อนข้างใหม่ใน hooks และ WP ที่กำหนดเองโดยทั่วไป แต่ฉันเชื่อว่า wp_insert_post เป็นตะขอที่คุณกำลังมองหา

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}

FYI: get_post_type()มี นอกจากนี้เมื่อทำการเปรียบเทียบแบบหลวมคุณควรใช้ไวยากรณ์เงื่อนไขสไตล์ YODA
ไกเซอร์

@kaiser คุณหมายถึงอะไรกับสไตล์ YODA? นอกจากนี้ยังเป็นเหตุผลที่get_post_type($post_id) ดีกว่า$_GET['post_type']?
Aziz

1
ใช้ค่า'page' === $_GET['post_type']ก่อนที่จะเปรียบเทียบ: มิฉะนั้นเมื่อคุณลืมหนึ่ง=คุณสามารถจบลงในสถานการณ์ที่คุณกำหนดค่าแทนการเปรียบเทียบสองค่า และนั่นจะกลายเป็นขยะในฐานข้อมูลของคุณ คุณอาจต้องการใช้การเปรียบเทียบ=== แบบปลอดภัย (เป็นค่าpageหรือไม่และเป็นค่าประเภทstringใด)
kaiser

1
@kasier ฉันเห็น - ดังนั้นรหัสสุดท้ายเป็นสิ่งที่ชอบ'page' === get_post_type($post_id) ?
Aziz

-1

หากใครต้องการใช้ฟิลด์ที่กำหนดเองตามประเภทโพสต์ฉันปล่อยให้รหัสด้านล่างของวิธีที่ฉันทำและทำงานได้ดีสำหรับฉัน :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ('wp_insert_post', 'awh_field_type');

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.