Saya memiliki fungsi yang mendefinisikan bidang khusus pada jenis posting. Katakanlah bidangnya adalah "subjudul".
Ketika posting disimpan, saya ingin melakukan validasi pada input, dan menampilkan pesan kesalahan pada layar edit posting jika perlu. Sesuatu seperti:
// Handle post updating
function wpse_update_post_custom_values($post_id, $post) {
// Do some checking...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors->add('oops', 'There was an error.');
}
return $errors;
}
add_action('save_post','wpse_update_post_custom_values',1,2);
Saya mencoba mengaitkan ini dengan tindakan save_post, tapi saya tidak tahu cara menangani kesalahan. Tampaknya tidak ada objek kesalahan yang diteruskan ke fungsi, dan jika saya membuat objek WP_Error saya sendiri dan mengembalikannya, itu tidak dihormati oleh mekanisme apa pun yang meludahkan kesalahan pada halaman edit posting.
Saat ini saya memiliki pesan kesalahan pada halaman di dalam kotak meta khusus saya, tetapi ini kurang dari ideal - Saya lebih suka memiliki kesalahan besar, merah, atas-di-the-top seperti yang biasanya ditampilkan WP.
Ada ide?
MEMPERBARUI:
Berdasarkan jawaban @Denis, saya mencoba beberapa hal berbeda. Menyimpan kesalahan sebagai global tidak berfungsi, karena Wordpress melakukan redirect selama proses save_post, yang membunuh global sebelum Anda dapat menampilkannya.
Saya akhirnya menyimpannya di bidang meta. Masalah dengan ini adalah bahwa Anda perlu menghapusnya, atau mereka tidak akan hilang ketika Anda menavigasi ke halaman lain, jadi saya harus menambahkan fungsi lain yang melekat pada admin_footer yang baru saja menghapus kesalahan.
Saya tidak mengira bahwa penanganan kesalahan untuk sesuatu yang sangat umum (memperbarui posting) akan menjadi kikuk ini. Apakah saya kehilangan sesuatu yang jelas atau ini pendekatan terbaik?
// Handle post updating
function wpse_5102_update_post_custom_values($post_id, $post) {
// To keep the errors in
$errors = false;
// Do some validation...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors .= 'whoops...there was an error.';
}
update_option('my_admin_errors', $errors);
return;
}
add_action('save_post','wpse_5102_update_post_custom_values',1,2);
// Display any errors
function wpse_5102_admin_notice_handler() {
$errors = get_option('my_admin_errors');
if($errors) {
echo '<div class="error"><p>' . $errors . '</p></div>';
}
}
add_action( 'admin_notices', 'wpse_5102_admin_notice_handler' );
// Clear any errors
function wpse_5102__clear_errors() {
update_option('my_admin_errors', false);
}
add_action( 'admin_footer', 'wpse_5102_clear_errors' );
sumber
admin_footer
hook jika Anda menghapus kesalahan di akhir fungsi handler pemberitahuan Anda. Menyederhanakan hal-hal sedikit saja.update_option('my_admin_errors', false);
segera setelah pernyataan if pada akhirwpse_5102_admin_notice_handler()
?Jawaban:
Simpan kesalahan di kelas Anda atau sebagai global, mungkin dalam transient atau meta, dan tampilkan dalam pemberitahuan admin pada permintaan POST. WP tidak memiliki fitur penangan pesan flash.
sumber
Saya menyarankan untuk menggunakan sesi karena ini tidak akan membuat efek aneh ketika dua pengguna mengedit secara bersamaan. Jadi inilah yang saya lakukan:
Sesi tidak dimulai oleh wordpress. Jadi, Anda perlu memulai sesi di plugin Anda, functions.php atau bahkan wp-config.php:
Saat menyimpan posting, tambahkan kesalahan dan pemberitahuan ke sesi:
Cetak pemberitahuan dan kesalahan lalu bersihkan pesan di sesi:
sumber
Berdasarkan pospi 's saran untuk digunakan transien , saya datang dengan berikut ini. Satu-satunya masalah adalah tidak ada kait untuk meletakkan pesan di bawah
h2
tempat pesan lain pergi, jadi saya harus melakukan hack jQuery untuk mendapatkannya di sana.Pertama, simpan pesan kesalahan yang ada pada
save_post
penangan Anda (atau yang serupa). Saya memberikannya waktu singkat 60 detik, jadi itu ada cukup lama untuk pengalihan terjadi.Kemudian, cukup ambil pesan kesalahan itu di halaman berikutnya dan tampilkan. Saya juga menghapusnya agar tidak ditampilkan dua kali.
Karena
admin_notices
kebakaran sebelum konten halaman utama dibuat, pemberitahuan tersebut bukan ke tempat pesan edit lainnya dikirim, jadi saya harus menggunakan jQuery ini untuk memindahkannya ke sana:Karena ID pos adalah bagian dari nama sementara, ini harus berfungsi di sebagian besar lingkungan multi-pengguna kecuali ketika beberapa pengguna secara bersamaan mengedit posting yang sama.
sumber
acme_plugin_error_msg_POSTID
. Anda bisa menambahkan ID pengguna seperti ituacme_plugin_error_msg_POSTID_USERID
.Saat
save_post
dijalankan, pos sudah tersimpan di database.Melihat ke kode inti WordPress, lebih khusus pada fungsi
wp-includes/post.php
'supdate_post()
, tidak ada cara built-in untuk mencegat permintaan sebelum disimpan di database.Namun, kami dapat mengaitkan
pre_post_update
dan menggunakanheader()
danget_post_edit_link()
mencegah agar pos tidak disimpan.Jika Anda memberi tahu pengguna apa yang salah, lihat intisari ini: https://gist.github.com/Luc45/09f2f9d0c0e574c0285051b288a0f935
sumber
Mengapa Anda tidak memvalidasi bidang Anda dengan bantuan beberapa Javascript? Saya pikir ini akan menjadi pendekatan terbaik untuk ini.
sumber
Mencoba menggunakan skrip di atas, saya mengalami masalah aneh. Dua pesan ditampilkan di layar edit, setelah pembaruan posting. Satu menunjukkan keadaan konten dari penyimpanan sebelumnya dan satu lagi dari saat ini. Misalnya, jika saya menyimpan posting dengan benar dan kemudian membuat kesalahan, yang pertama adalah "kesalahan" dan yang kedua adalah "ok" - meskipun mereka dihasilkan dalam waktu yang sama. Jika saya mengubah skrip dan hanya menambahkan satu pesan (mis. "Kesalahan"), awali satu pembaruan dengan "kesalahan" dan setelah itu yang lain dengan pesan "ok", "kesalahan" tetap (ditampilkan untuk kedua kalinya). Saya harus menyimpan dengan "ok" sekali lagi untuk menghilangkannya. Saya benar-benar tidak tahu apa yang salah, saya sudah mengujinya di tiga server lokal yang berbeda dan ada masalah yang sama pada masing-masing dari mereka.
sumber
Saya telah menulis sebuah plugin yang menambahkan penanganan kesalahan flash untuk layar edit posting dan mencegah posting diterbitkan sampai bidang yang diperlukan diisi:
https://github.com/interconnectit/required-fields
Ini memungkinkan Anda untuk membuat setiap kolom tulisan wajib, tetapi Anda dapat menggunakan API yang disediakannya untuk membuat setiap kolom khusus yang diperlukan juga dengan pesan kesalahan yang dapat disesuaikan dan fungsi validasi. Ini default untuk memeriksa apakah bidang kosong atau tidak.
sumber