apa cara yang benar untuk mengait saat memperbarui posting

19

saya mencoba untuk menghubungkan ketika posting diperbarui tetapi semua kait saya coba tidak pernah dijalankan kecuali updated_post_meta

add_action('updated_post_meta', 'my_function');

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

Saya sudah mencoba ini add_action('save_post', 'my_function');tetapi tidak ada id yang di-echo, atau mungkin pesan ini sudah di-echo tetapi tidak pernah di-render karena redirect header dikirim.

terburu-buru
sumber
2
Anda memiliki spasi setelahnya save_post, apakah itu salah ketik di sini, atau apakah itu dalam kode asli Anda? juga, aktifkan debug saat mengembangkan.
Milo
@Milo maaf salah ketik, tetapi tidak dalam kode asli
rusly
jika itu masalahnya, maka Anda akan melihat output Anda di sudut kiri atas layar saat membuat posting baru. menyimpan pos yang ada terjadi sebelum arahan ulang, sehingga Anda tidak akan melihat apa pun kecuali Anda mengaktifkan debugging.
Milo

Jawaban:

55

Ketika sebuah posting diperbarui ada beberapa kait yang dipecat:

  • 'pre_post_update'adalah tindakan yang dipecat tepat sebelum posting diperbarui, argumen yang diberikan adalah 2: $post_IDdan $dataitu adalah array dari semua kolum basis data lain dari tabel posting
  • 'transition_post_status'adalah sebuah hook yang diluncurkan saat pembaruan, dan memberikan 3 argumen: $ new_post_status, $old_post_statusdan $post(objek).
  • Lalu, ada 2 pengait transisi lainnya yang dipecat, tetapi dinamai dinamis, artinya tindakan efektif yang dipecat tergantung pada status kiriman lama dan baru. "{$old_status}_to_{$new_status}"dan "{$new_status}_{$post->post_type}". Pertama melewati satu-satunya objek posting sebagai argumen, yang kedua melewati id posting dan objek posting. Temukan dokumentasi di sini .
  • 'edit_post'yang lolos 2 argumen: $post_IDdan $post(objek)
  • 'post_updated'yang lulus 3 argumen: $post_ID, $post_after(pasca objek setelah update), $post_before(pasca objek sebelum update)
  • Kait dinamis lain: "save_post_{$post->post_type}"itu tergantung pada jenis posting, misalnya untuk posting standar 'save_post_post'dan untuk halaman ini 'save_post_page', buku ini lulus 3 argumen: $post_ID, $post(object) dan $updateitu adalah boolean (true atau false) itu benar ketika Anda melakukan update, di Bahkan kail ini dipecat juga ketika sebuah pos disimpan untuk pertama kalinya.
  • ' save_post' yang diaktifkan saat pembaruan dan penyimpanan pertama, dan memberikan 3 argumen yang sama dari hook sebelumnya.
  • ' save_post_{$post_type}' yang diaktifkan saat pembaruan dan penyimpanan pertama, dan meneruskan 2 argumen pertama yang sama dari hook sebelumnya.
  • Akhirnya Anda memiliki ' wp_insert_post' , yang dipecat saat pembaruan dan penyimpanan pertama, dan meneruskan 3 argumen yang sama dari 2 kait sebelumnya.

Hook ini dipecat setiap kali sebuah posting diperbarui, baik melalui halaman admin di backend dan melalui ketika diperbarui "secara manual" menggunakan wp_update_postatau wp_insert_postfungsi.

Ketika posting diperbarui menggunakan halaman admin ada kait tambahan yang dipecat, contohnya adalah 'update_post_redirect'atau 'post_updated_messages'. (Lihat ini dan ini jawaban WPSE untuk contoh penggunaan).

Perhatikan bahwa jika Anda ingin menggunakan beberapa argumen hook, itu bukan argumen pertama, Anda harus menyatakannya secara eksplisit add_action.

Misalnya jika Anda ingin menggunakan '$update'argumen (yang ke-3) dari 'save_post'kail yang perlu Anda tambahkan 3sebagai $accepted_argsparam add_action( lihat dokumen ):

// 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 );
}

Catatan terakhir mengenai penentuan waktu : Anda harus yakin bahwa add_actiondipanggil sebelum tindakan dipicu, atau tidak akan melakukan apa pun.

Misalnya kode ini:

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

tidak akan melakukan apa-apa, karena tindakan ditambahkan setelah kait ditembakkan. Ini sederhana untuk mengenalinya, dalam kode dunia nyata tidak selalu demikian.

gmazzap
sumber
Saya berpikir bahwa hook tindakan 'save_post' juga dipecat ketika menekan Tambah Baru (Posting, Halaman, CPT) di dasbor. Untuk melihat diri Anda, jalankan saja kode ini. 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 );Mengapa tindakan 'save_post' berjalan di Add New, bukan di Publish? Untuk membuat posting konsep otomatis saya kira.
lowtechsun
@lowtechsun Seperti yang dikatakan dalam A, kait dipecat setiap kali posting diperbarui, yaitu disimpan dalam DB. Ketika Anda menekan "Tambah Baru", dekat dengan pemuatan halaman, WP membuat posting konsep yang disimpan dalam DB sehingga dia kait dipecat.
gmazzap
Terima kasih telah kembali padaku. Baru tahu tentang ini kemarin dan berpikir konsep ini membingungkan. Artinya pertama saya buka halaman untuk menambahkan posting baru. Pada tahap ini saya pikir saya belum membuat pos. Hanya sekali saya menekan Publikasikan saya akan berpikir posting baru dibuat. Mengambil ini lebih lanjut saya berharap WP tidak menghapus posting konsep otomatis jika saya menekan Tambah Baru tetapi kemudian meninggalkan halaman tanpa menekan Terbitkan?
lowtechsun
2

Mengapa tidak terhubung post_updated_messages. Dengan begitu Anda dapat menampilkan pesan ini sama seperti postingan wordpress default yang diperbarui.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Cari contoh di sini:

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

dibawah post_updated_messages

Jacob Rambo
sumber