ฉันจะบันทึกข้อมูลเมตาสำหรับประเภทโพสต์ที่กำหนดเองเฉพาะได้อย่างไร


16

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

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

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

ฉันใส่ข้างบนfunctions.phpแล้วและคาดเดาว่าอาจเป็นส่วนหนึ่งของปัญหา ฉันเดาว่าฉันต้อง จำกัด การกระทำ 'save_post' เพื่อให้เกิดการโพสต์ประเภทที่กำหนดเองของฉันเท่านั้น


เป็นคำถามที่ดี Bobby Jack แต่ฉันขอให้คุณตั้งชื่อคำถามซ้ำอีกครั้งกับ "วิธีบันทึกเฉพาะข้อมูลเมตาสำหรับประเภทโพสต์ที่กำหนดเองเฉพาะ"; ชื่อของคุณนั้นกว้างเกินไปสำหรับคนที่จะรู้จักเมื่อพวกเขากำลังมองหาทางแก้ไขปัญหานี้
MikeSchinkel

@ ไมค์: เสร็จแล้ว (เห็นด้วยกับคำแนะนำของคุณขอบคุณ!)
บ๊อบบี้แจ็ค

คำตอบ:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

ว่าควรจะทำงาน เพียงแทนที่ 'your_post_type' ด้วยชื่อประเภทโพสต์ นอกจากนี้ข้อเท็จจริงที่รู้จักกันน้อย: เบ็ด 'save_post' จะส่ง ID ของโพสต์เป็นอาร์กิวเมนต์

แก้ไข

ฉันปรับปรุงฟังก์ชั่นเพื่อสะท้อนความคิดเห็นของแจน ขอบคุณแจน!


1
มันยังเพิ่มการโพสต์ตัวเองเป็นอาร์กิวเมนต์ที่สองดังนั้นคุณไม่จำเป็นต้องใช้ตัวแปรทั่วโลก
Jan Fabry

โซลูชันนี้ใช้งานได้ ... ฉันเคยใช้กับโครงการลูกค้ามาก่อนด้วยความสำเร็จมากมาย
EAMann

Brilliant- ทำงานเหมือนจับใจ และฉันสมมติว่ามันสมเหตุสมผลที่จะทำ "if ($ post-> post_type == 'animal') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} ถ้า ($ โพสต์ -> post_type == 'ยานพาหนะ') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']);} // ... ฯลฯ ... เพื่อจัดการโพสต์ที่แตกต่างกันหลายประเภท (ขออภัยสำหรับ ความสามารถในการจัดรูปแบบไม่ดีสำหรับความคิดเห็น!)
Bobby Jack

จริง ๆ แล้วมีโพสต์หลายประเภทฉันขอแนะนำให้ใช้คำสั่ง switch แทน มาร์กอัปน้อยลงประสิทธิภาพเร็วขึ้นและง่ายต่อการเพิ่มเคสในอนาคต
EAMann

@EAMann - Yup, ผ่านไปครึ่งทางเขียนว่าฉันตระหนักสวิทช์จะดีกว่า แต่ความเห็นไม่ได้เป็นสถานที่ที่เหมาะที่จะเริ่มต้นการแก้ไขโค้ดเพื่อให้ผมได้ขี้เกียจ;)
บ๊อบบี้แจ็ค

4

หากคุณต้องการจัดการโพสต์หลายประเภทฉันขอแนะนำคำสั่งสวิตช์พื้นฐาน:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

โดยทั่วไปแล้วเคสจะเหมือนกับif($post->post_type) == 'post_type_1') {}แต่ไม่ต้องการบล็อก if-else หลายอัน defaultบล็อกในกรณีที่สวิทช์จับที่โพสต์ประเภทไม่ได้อยู่ในชุดของคุณเอง


4

@John P Bloch และ @EAMann ได้รับคำตอบที่ดีเยี่ยมแล้ว

  1. พิจารณาprefixing meta_keys ของคุณด้วยการขีดเส้นใต้ การทำเช่นนั้นจะซ่อนไว้จากรายการฟิลด์ที่กำหนดเองที่แสดงบนหน้าจอแก้ไขโพสต์เช่น

    ฟังก์ชัน save_my_metadata ($ post_id, $ post = false) {
       ถ้า ($ หลัง> post_type == 'your_post_type')
          update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }
    
    เห็นได้ชัดว่าหมายความว่าคุณต้องใช้ metabox แบบกำหนดเองเพื่อให้สามารถแก้ไขฟิลด์ได้เช่นกัน นี่คือหน้าจอแก้ไขสำหรับบริบท:



  2. อีกสิ่งที่คุณสามารถทำได้คือเพิ่มตะขอของคุณเองเพื่อให้การบันทึกประเภทโพสต์ง่ายขึ้นนั่นคือตะขอของคุณอาจ " save_{$post_type}_post" สำหรับประเภทโพสต์มันจะเป็นmovie save_movie_postนี่คือสิ่งที่คุณต้องเพิ่มลงในfunctions.phpไฟล์ธีมของคุณหรือในปลั๊กอินที่อื่น:

    add_action ('save_post', 'save_custom_post_type_posts', 10,2);
    ฟังก์ชั่น save_custom_post_type_posts ($ post_id, $ post = false) {
       do_action ( "บันทึก _ {$ หลัง> post_type} _POST");
    }
    
    เมื่อถึงตอนนั้นคุณสามารถเขียนรหัสต้นฉบับของคุณใหม่ได้เช่น (รวมถึงเคล็ดลับขีดล่างจาก # 1 ด้านบน):

    add_action ( 'save_my_postype_post', 'save_my_postype_metadata' 10,2);
    ฟังก์ชั่น save_my_postype_metadata ($ post_id, $ โพสต์) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

โดยส่วนตัวแล้วฉันชอบที่จะทำตามรูปแบบด้านล่างสำหรับการเพิ่มตัวจัดการเมตาที่กำหนดเองให้กับประเภทโพสต์ ด้วยด้านล่างนี้คุณสามารถเพิ่มการสนับสนุน meta ให้กับประเภทโพสต์โดยเพียงแค่เพิ่มคีย์สนับสนุน ('คำบรรยาย' ในตัวอย่างด้านล่าง) ไปยังอาร์เรย์สนับสนุนสำหรับประเภทโพสต์โดยการเรียก add_post_type_support ('my_post_type', 'subtitle');

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

หวังว่าบางสิ่งเช่นนี้จะถูกเพิ่มเข้าไปในแกนหลักในไม่ช้า


0

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

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

รับประเภทโพสต์: get_post_type()หรือ$post->post_type;


0

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

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

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