อะไรคือวิธีที่ถูกต้องที่จะขอเมื่ออัพเดทโพสต์


19

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

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

ฉันได้ลองแล้วadd_action('save_post', 'my_function');แต่ไม่มี id ถูก echo out หรือบางทีข้อความนี้ได้ถูก echo แต่ไม่แสดงผลเนื่องจากส่วนหัวของการเปลี่ยนเส้นทางถูกส่งไป


2
คุณมีช่องว่างหลังจากsave_postนั้นพิมพ์ผิดที่นี่หรือว่าในรหัสเดิมของคุณ? นอกจากนี้ยังช่วยให้การแก้จุดบกพร่องขณะที่การพัฒนา
Milo

@Milo ขออภัย typo แต่ไม่ได้อยู่ในรหัสเดิม
rusly

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

คำตอบ:


55

เมื่อโพสต์ได้รับการปรับปรุงจะมีตะขอบางตัวที่ถูกเปิดใช้งาน:

  • 'pre_post_update'คือการดำเนินการก่อนที่การโพสต์จะได้รับการอัปเดตอาร์กิวเมนต์ที่ผ่านเป็น 2: $post_IDและ$dataนั่นคืออาร์เรย์ของcolums ฐานข้อมูลอื่น ๆทั้งหมดของตารางโพสต์
  • 'transition_post_status'เป็นฮุกที่ใช้ในการอัพเดทและส่งผ่านอาร์กิวเมนต์ 3 รายการ: $ new_post_status $old_post_statusและ$post(วัตถุ)
  • จากนั้นจะมีการเปิดใช้ตะขอการเปลี่ยนแปลงอีก 2 รายการ แต่เป็นชื่อแบบไดนามิกหมายความว่าการดำเนินการที่มีประสิทธิภาพเริ่มขึ้นกับสถานะเก่าและโพสต์ใหม่ และ"{$old_status}_to_{$new_status}" "{$new_status}_{$post->post_type}"ขั้นแรกให้ส่งผ่านเฉพาะวัตถุที่โพสต์เป็นอาร์กิวเมนต์ที่สองผ่านรหัสโพสต์และวัตถุที่โพสต์ ค้นหาเอกสารที่นี่
  • 'edit_post'อาร์กิวเมนต์ส่งผ่าน 2 ข้อ: $post_IDและ$post(วัตถุ)
  • 'post_updated'ผ่าน 3 อาร์กิวเมนต์: $post_ID, $post_after(วัตถุโพสต์หลังการอัพเดท), $post_before(วัตถุโพสต์ก่อนการอัพเดท)
  • ตะขอแบบไดนามิกอื่น: "save_post_{$post->post_type}"ที่ขึ้นอยู่กับประเภทโพสต์เช่นการโพสต์มาตรฐานคือ'save_post_post'และสำหรับหน้าเว็บที่เป็น'save_post_page'เบ็ดนี้ผ่าน 3 ข้อโต้แย้ง: $post_ID, $post(วัตถุ) และ$updateที่เป็นแบบบูล (จริงหรือเท็จ) ที่เป็นจริงเมื่อคุณดำเนินการปรับปรุงใน ความจริงเบ็ดนี้ถูกไล่ออกเมื่อบันทึกโพสต์เป็นครั้งแรก
  • ' save_post'ที่ใช้ทั้งในการอัปเดตและการบันทึกครั้งแรกและส่งผ่านอาร์กิวเมนต์ 3 ตัวของ hook ก่อนหน้านี้
  • ' save_post_{$post_type}'ที่ถูกเปิดใช้งานทั้งในการอัปเดตและการบันทึกครั้งแรกและส่งผ่านอาร์กิวเมนต์ 2 ตัวแรกของ hook ก่อนหน้านี้
  • ในที่สุดคุณก็มี' wp_insert_post'ที่ถูกเปิดใช้งานทั้งในการอัปเดตและการบันทึกครั้งแรกและส่งผ่านอาร์กิวเมนต์ 3 ตัวของ hooks 2 ตัวก่อนหน้า

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

เมื่อโพสต์ที่มีการปรับปรุงโดยใช้หน้าผู้ดูแลระบบมีตะขอเพิ่มเติมยิงตัวอย่างเป็นหรือ'update_post_redirect' 'post_updated_messages'(ดูที่นี่และ คำตอบของ WPSE นี้สำหรับตัวอย่างการใช้งาน)

โปรดทราบว่าหากคุณต้องการใช้ประโยชน์จากอาร์กิวเมนต์ hooks บางตัวนั่นไม่ใช่ข้อแรกคุณต้องประกาศอย่างชัดเจนในการadd_actionโทร

เช่นหากคุณต้องการใช้'$update'อาร์กิวเมนต์ (นั่นคืออันดับที่ 3) ของ'save_post'hook คุณต้องเพิ่ม3เป็น$accepted_argsparam on add_action( ดูเอกสาร ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

ข้อสังเกตสุดท้ายเกี่ยวกับเวลา : คุณต้องแน่ใจว่าadd_actionมีการเรียกใช้ก่อนที่การกระทำจะเริ่มขึ้นมิฉะนั้นจะไม่ทำอะไรเลย

เช่นรหัสนี้:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

จะไม่ทำอะไรเลยเพราะมีการเพิ่มการกระทำหลังจากเบ็ดถูกไล่ออก ที่นี่ง่ายต่อการจดจำในรหัสโลกแห่งความจริงไม่ได้เป็นเช่นนั้นเสมอไป


ฉันคิดว่าตะขอการกระทำ 'save_post' นั้นถูกไล่ออกเช่นกันเมื่อกดปุ่ม Add New (Post, Page, CPT) ในแดชบอร์ด หากต้องการดูตัวเองเพียงเรียกใช้รหัสนี้ function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );ทำไมการกระทำ 'save_post' จึงทำงานบนเพิ่มใหม่แทนที่จะเป็นเผยแพร่ เพื่อให้โพสต์ร่างอัตโนมัติฉันคิดว่า
lowtechsun

@lowtechsun เหมือนกับที่กล่าวไว้ใน A ตะขอจะถูกยิงทุกครั้งที่มีการอัปเดตโพสต์เช่นบันทึกไว้ใน DB เมื่อคุณกดปุ่ม "เพิ่มใหม่" ใกล้กับการโหลดหน้าเว็บ WP จะสร้างโพสต์ฉบับร่างที่เก็บไว้ในฐานข้อมูลเพื่อให้เขาถูกไล่ออก
gmazzap

ขอบคุณที่กลับมาหาฉัน เพิ่งค้นพบเกี่ยวกับเรื่องนี้เมื่อวานนี้และคิดว่าแนวคิดเรื่องนี้สับสน ความหมายก่อนอื่นฉันเปิดหน้าเพื่อเพิ่มโพสต์ใหม่ ในขั้นตอนนี้ฉันคิดว่าฉันยังไม่ได้สร้างโพสต์ เพียงครั้งเดียวผมตีเผยแพร่ฉันจะคิดว่าการโพสต์ใหม่จะถูกสร้างขึ้น ทำสิ่งนี้ต่อไปฉันหวังว่า WP จะลบโพสต์ร่างอัตโนมัติถ้าฉันกด Add New แล้วออกจากหน้าโดยไม่กดปุ่ม Publish?
lowtechsun

2

post_updated_messagesทำไมไม่ขอใน ด้วยวิธีนี้คุณสามารถแสดงข้อความนี้ได้เช่นเดียวกับการโพสต์ wordpress เริ่มต้นที่อัปเดต

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

ค้นหาตัวอย่างที่นี่:

http://codex.wordpress.org/Function_Reference/register_post_type

ภายใต้ post_updated_messages

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