Mengapa save_post bertindak ketika membuat posting baru?

31

Saya terkejut dengan fakta bahwa fungsi saya yang saya tempelkan ke save_post aksi kebakaran ketika saya mengklik tautan "Posting Baru" di Dashboard Admin. Catatan - ini sebelum saya menekan Saveatau Update, dan langsung menyala, bukan setelah waktu yang berlalu atau pembaruan otomatis.

Di sisi lain, ketika saya kemudian ketik sesuatu dan tekan tombol PublishatauUpdate atau Save Draft, pernyataan gema yang saya letakkan di dalam penangan tindakan saya tidak bergema, sehingga tampak bahwa tindakan TIDAK menembak di waktu lain. Ini mungkin tidak berhubungan.

Ini kode saya:

add_action('save_post', 'MyNS\save_event_metabox', 10, 2);
function save_event_metabox($post_id, $post){
  echo "<h1>YES!</h1>";
}

YA ini bergema (di bagian atas halaman) ketika saya menekan tautan "Posting Baru" tetapi TIDAK menggema ketika saya mengetik sesuatu dan kemudian tekan Updateatau Publishatau Save Draft. Ini tampaknya bertentangan dengan dokumentasi padasave_post aksi dan wp_insert_post()fungsi.

Adakah yang bisa membersihkan ini untuk saya?

Tom Auger
sumber
Luar Biasa !!! saya mengalami situasi yang sama saat menyimpan bidang metabox khusus. tahu apa yang bisa saya gunakan ??
Prasath Nadarajah

Jawaban:

39

Ketika Anda mengklik 'Posting Baru', Anda cukup memuat halaman wp-admin/post-new.php.

Dengan demikian, WordPress akan selalu membuat posting baru ('Draf Otomatis') untuk memastikan semua fitur lain (seperti unggahan media) dan plugin berfungsi seperti biasa, bahkan sebelum Anda benar-benar menyimpan konsep atau mempublikasikan posting.

Dan ini, pada gilirannya, memicu save_post. Karena itu gema Anda.

Oke, jadi mengapa saya tidak mendapatkan gema saat memperbarui atau menerbitkan?

Di antara menyimpan dan memuat halaman berikut, WordPress sebenarnya mengirim GETredirect kembali ke halaman yang sama, yang tampak transparan (Anda dapat menyaksikan ini dengan monitor HTTP, seperti HttpFox ).

Dengan kata lain;

  1. Anda mengklik UpdateatauPublish
  2. Browser mengirim data ke server
  3. WordPress menanganinya, dan dalam proses memicu save_post
  4. WordPress mengirim kembali header redirection, dan keluar, sebelum output browser apa pun terjadi (termasuk gema Anda) *
  5. Browser mengikuti pengalihan dan memuat halaman 'edit posting'.

Redirect mungkin tampak tidak perlu (karena Anda bisa saja POSTke halaman yang sama), tetapi itu adalah bagian dari teknik yang dikenal sebagai Post / Redirect / Dapatkan menghindari pengiriman formulir duplikat .

Jika Anda mencoba untuk mencetak pesan khusus berdasarkan hasil dari fungsi yang dikaitkan save_post, periksa pertanyaan / jawaban ini .

* Tidak sepenuhnya benar, gema Anda sebenarnya akan terjadi sebelum header redirect dikirim, tetapi browser akan membuangnya, atau sesuatu terjadi begitu cepat sehingga tidak pernah dirender.

TheDeadMedic
sumber
Luar biasa. Terima kasih atas jawaban yang begitu lengkap dan terperinci! Demi belajar lebih banyak, bagaimana Anda menemukan pengetahuan ini sejak awal?
Tom Auger
Melalui frustrasi yang sama yang Anda alami;) Dapatkan IDE yang bagus (saya menggunakan phpDesigner) dan hanya mempelajari file admin yang relevan.
TheDeadMedic
1
Tepat pada kakak. Terima kasih telah hadir di sana dengan keahlian Anda!
Tom Auger
Sepotong informasi yang luar biasa. Saya menjadi gila karena di server lokal saya sepertinya berfungsi "ok", tetapi tidak di server produksi saya ... sepertinya di server lokal saya tidak menerapkan teknik post / redirect / get dengan benar karena tidak mengirimkan tajuk pengalihan (tidak tahu mengapa).
The WebMacheter