Apakah mungkin dalam tindakan save_post untuk menentukan apakah itu posting baru yang dibuat atau posting yang ada sedang diperbarui?
save-post
wp-update-post
hereswhatidid
sumber
sumber
Jawaban:
Sejak WordPress versi 3.7. - IIRC -
save_post
hook - informasi lebih lanjut tentang hook dan penggunaannya di Code Reference:save_post
dan Codex:save_post
- memiliki parameter ketiga$update
yang dapat digunakan untuk menentukan hal itu.catatan:
$update
tidak selalutrue
- Anda dapat melihat dan mengujinya sendiri dengan kode di bawah ini. Ini tidak didokumentasikan dengan baik, mungkin jauh dari nama yang optimal, dan karenanya menciptakan harapan yang menyesatkan. Kode di bawah ini dapat digunakan untuk debugging, bermain-main dengan kapan untuk mencegat eksekusi kode, karena jika tidak, Anda tidak akan melihat informasi / pesan. Saya pikir, biang keladinya dalam perilaku menipu adalah penanganan revisi dan penyelamatan otomatis - yang bisa dinonaktifkan, tetapi saya tidak merekomendasikannya, dan belum mengujinya. Tidak yakin apakah ini menjamin Tiket Trac , jadi saya tidak membukanya, jika menurut Anda, ikuti tautannya dan lakukan sendiri. Selain itu, seperti yang dinyatakan dalam komentar, jika Anda memiliki masalah khusus, posting pertanyaan baru.sumber
$update
parameter adalah selalu benar bahkan ketika itu adalah posting baru. Jadi parameter ini tidak berguna. Tidak yakin apakah itu pernah berhasil sama sekali, tetapi pasti tidak berfungsi seperti yang didokumentasikan dalam versi terbaru dari wordpress 4.8.wp_publish_post
, maka ya. Tapi itu tidak benar untuk penggunaannyawp_insert_post
. Saya telah menulis fungsi debug, saya menambahkannya ke jawabannya.save_post
kait memiliki parameter-3 yang selalu diatur ke TRUE, jadi tidak yakin apa ini ada hubungannya dengan kait lainnya, tidak berbicara tentang kait lainnya. Saya sedang berbicara tentang jawaban Anda. Ini salah.wp_insert_post()
,wp_publish_post()
. Yang terakhir hanya posting masa depan, ada$update
diatur untuk selalutrue
. Kalau tidak, dalam halwp_insert_post()
,$update
tidak selalutrue
.Cara saya melakukan pemeriksaan ini (dalam fungsi terkait) adalah membandingkan tanggal posting dan tanggal yang dimodifikasi (dalam GMT untuk standarisasi)
Ini berfungsi karena meskipun pada saat pembuatan posting memiliki tanggal 'dimodifikasi' yang melekat padanya, yang persis sama dengan tanggal 'dibuat', tetapi kami mengizinkan varian 1 detik, jika kedua detik berlalu selama pembuatan pos.
sumber
post_date_gmt
is2019-03-12 01:31:30
dan thepost_modified_gmt
is2019-03-12 01:31:31
. :(Saya akhirnya hanya memeriksa keberadaan nilai khusus sebelum menyetelnya. Dengan begitu, jika itu adalah kiriman yang baru dibuat, nilai khusus belum akan ada.
sumber
Contoh jawaban ialocin dengan paremeter "perbarui":
sumber
if($update)
atau menjaga blok baru terlebih dahulu tetapi menggunakanif( ! $update )
. Yang terakhir akan mendapatkan OP menjadi praktik yang lebih baik dan lebih disukai daripada metode Anda dengan standar pengkodean WordPress dalam kasus-kasus seperti operator ternaryAnda dapat menggunakan kait tindakan pre_post_update untuk kode pembaruan dan save_post untuk kode posting baru. Ini berfungsi sebelum sebuah posting diperbarui.
sumber
save_post
hook dipecat baik ketika posting dibuat dan diperbarui (setelah WordPress telah disimpan ke database).pre_post_update
dipecat ketika posting diperbarui, tetapi sebelum posting diperbarui - ini bisa menjadi penting.Seperti Darshan Thanki mengisyaratkan (dan Stephen Harris lebih lanjut diuraikan), Anda dapat menggunakan
pre_post_update
untuk keuntungan Anda.Alasan mengapa saya menggunakan global adalah karena
function is_new_post() use ( &$new_post )
tidak valid dalam PHP (mengejutkan ...) jadi menarik variabel itu ke dalam lingkup fungsi tidak berfungsi - maka global.Perhatikan bahwa ini benar-benar hanya dapat digunakan secara andal di dalam / setelah
save_post
acara (yang biasanya cukup, setidaknya untuk apa yang kita lakukan dengannya).sumber
Ketika save_post dipicu, semua informasi tentang pos itu sudah tersedia, jadi secara teori Anda bisa menggunakan
ini belum teruji. =)
sumber
save_post
pos itu sendiri sudah disimpan ke database - demikian jugaget_posts
akan mengembalikan pos saat ini.Pendekatan lain yang menggunakan fungsi built-in dan tidak ada penambahan ke database akan melibatkan
get_post_status()
.Namun perhatikan bahwa mungkin tidak tepat jika Anda berencana untuk mengatur kembali status ke "draft" nanti - instruksi Anda akan diulangi saat berikutnya Anda akan memperbarui posting. Tergantung pada konteksnya, Anda mungkin ingin mempertimbangkan berbagai string yang dapat dikembalikan dengan
get_post_status()
membangun skenario yang lebih tepat.Lihat Codex untuk get_post_status () dan Status Posting
sumber
save_post()
dieksekusi untuk pertama kalinya, tetapi selama eksekusiget_post_status()
sudah kembali 'terbitkan' dan bukan 'draft', meskipun itu hanya dalam proses penerbitan.