จะขอ update_post_meta และ delete_post_meta ได้อย่างไร?


29

ฉันยังคงดิ้นรนที่จะทำให้หัวของฉันเกี่ยวกับเรื่องนี้ดังนั้นฉันจึงติดอยู่กับการพยายามทำงานต่อไปนี้:

หากupdate_post_metaถูกไล่ออกจากนั้นตรวจสอบเพื่อดูว่าmeta_keyมีค่าเท่ากับบางสิ่งหรือไม่ (ฉันต้องการทริกเกอร์โค้ดบางส่วนหากใช้เมตา_keyที่เจาะจง) หากคีย์เมตาที่ฉันกำลังค้นหาอยู่ให้รันโค้ดบางอย่างที่จะต้องรู้ว่า$post->IDเมตาคีย์นั้นกำลังได้รับการอัปเดต

ฉันจำเป็นต้องขอdelete_post_metaย้อนกลับด้วยเช่นกัน

ทุกคนสามารถให้ฉันกับโค้ดตัวอย่างบางอย่างสำหรับ hooking เข้าupdate_post_metaและdelete_post_meta?

คำตอบ:


45

update_post_metaตะขอจะเรียกว่าจากทั่วไปมากขึ้นupdate_metadata()ฟังก์ชั่นเพื่อให้คุณอาจจะไม่ได้พบว่ามันโดยตรง ตะขอสามอัน ได้แก่ :

  • update_post_metadataตัวกรองที่อนุญาตให้คุณ "จี้" อัปเดตข้อมูลเมตาและทำอย่างอื่น หากคุณเชื่อมต่อฟังก์ชั่นที่ส่งกลับบูลีนการดำเนินการจะหยุดลงที่นั่นและบูลีนจะถูกส่งคืน
  • update_post_metaแอ็คชันที่ถูกเรียกก่อนที่ข้อมูลจะถูกอัพเดตในฐานข้อมูล
  • updated_post_metaการกระทำที่ได้รับการเรียกหลังจากที่มีการอัพเดทข้อมูลในฐานข้อมูล

ถ้าคีย์เมตาไม่ได้อยู่ในฐานข้อมูลยังupdate_metadata()ผ่านการควบคุมadd_metadata()ซึ่งมีตะขอที่คล้ายกันadd_post_metadata, และadd_post_meta added_post_metaสิ่งนี้เกิดขึ้นก่อนที่จะupdate[d]_post_metaถูกเรียก ดังนั้นหากคุณต้องการทำอะไรบางอย่างเมื่อคีย์ meta ถูกเพิ่มหรืออัปเดตให้แน่ใจว่าได้ใส่ทั้งในupdate*และและadd*hooks - แต่โปรดสังเกตว่าในขณะที่updated_*และadded_*การกระทำผ่านพารามิเตอร์ที่คล้ายกันupdate_*และadd_*ไม่ ( add_post_metaไม่ผ่านเมตา ID ก่อน) .

delete_metadata()มีตะขอที่คล้ายกัน: delete_post_metadata, และdelete_post_metadeleted_post_meta

รหัสตัวอย่าง:

add_action( 'added_post_meta', 'wpse16835_after_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'wpse16835_after_post_meta', 10, 4 );
function wpse16835_after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_do_something( $post_id, $meta_value );
    }
}

add_action( 'deleted_post_meta', 'wpse16835_deleted_post_meta', 10, 4 );
function wpse16835_deleted_post_meta( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_undo_something( $post_id );
    }
}

ขอบคุณมากสำหรับสิ่งนี้ ฉันรู้เกี่ยวกับการupdate_post_metaใช้update_metadataและในนั้นมีตะขอadded_post_metaและupdated_post_metaแต่นั่นเท่าที่ฉันจะได้รับ ฉันไม่เข้าใจวิธีใช้ แต่ตอนนี้ผมคิดว่าผมได้รับมัน :)
เบรดี้

3
โดยเฉพาะอย่างยิ่งตะขอคือupdated_{$post_type}_meta
Benjamin Intal

8

คำตอบของ ม.ค. ครอบคลุมค่อนข้างมากยกเว้นกรณีที่ข้อมูลเมตาแบบกำหนดเองถูกลบออกจากหน้าแก้ไขโพสต์ สิ่งนี้จะเกิดขึ้นแบบอะซิงโครนัสทันทีที่คุณคลิกปุ่ม "ลบ" ภายใต้เมทาดาทาผ่านการเรียกไปที่ wp-admin / admin-ajax.php น่าเสียดายที่การเรียกผ่านdelete_metadata()ฟังก์ชันใน meta.php และการเรียกdelete_meta()ใน wp-admin / include / post.php แทน (เพื่อไม่ให้สับสนกับ wp-include / post.php)

มีการกระทำ 2 อย่างที่ยังสามารถใช้ได้แม้ว่าdelete_postmeta(ก่อนการลบ) และdeleted_postmeta(หลังจากการลบ) ทั้งสองยอมรับพารามิเตอร์เดียว$midซึ่งเป็น ID ของข้อมูลเมตา ( ไม่ใช่คีย์) คุณสามารถดึงข้อมูลเมตาดาต้าได้โดยใช้:

$meta = get_post_meta_by_id($mid);  

ซึ่งส่งคืนวัตถุที่มี meta_id, post_id, meta_key abd meta_value แน่นอนตามเวลาที่deleted_postmetaเรียกว่าข้อมูลเมตาได้ถูกลบไปแล้วget_post_meta_by_id()จะไม่ทำงาน (ชนิดใดที่ทำให้การกระทำนั้นไร้ประโยชน์)

กันไปสำหรับการปรับปรุงข้อมูลเมตาที่กำหนดเองจากหน้าแก้ไขโพสต์ update_metadata()ฟังก์ชั่น (และการกระทำของตน) ใน meta.php จะไม่เรียก แต่update_meta()ฟังก์ชั่นในงาน wp-admin / includes / post.php แทน สองการกระทำอีกครั้งที่นี่และupdate_postmeta updated_postmetaargs คือ $ meta_id, $ post_id, $ meta_key, $ meta_value

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