ฉันมีฟังก์ชั่นที่กำหนดฟิลด์ที่กำหนดเองในประเภทโพสต์ สมมติว่าฟิลด์นั้นเป็น "subhead"
เมื่อบันทึกโพสต์แล้วฉันต้องการตรวจสอบความถูกต้องของอินพุตและแสดงข้อความแสดงข้อผิดพลาดบนหน้าจอแก้ไขโพสต์หากจำเป็น สิ่งที่ต้องการ:
// 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);
ฉันพยายามเชื่อมโยงสิ่งนี้กับการกระทำ save_post แต่ฉันไม่สามารถหาวิธีจัดการข้อผิดพลาดได้ ดูเหมือนจะไม่มีวัตถุข้อผิดพลาดที่ส่งผ่านไปยังฟังก์ชั่นและถ้าฉันสร้าง WP_Error obj ของฉันเองและส่งคืนมันก็ไม่ได้รับความเคารพจากกลไกใด ๆ ที่แยกแยะข้อผิดพลาดในหน้าแก้ไขการโพสต์
ขณะนี้ฉันมีข้อความแสดงข้อผิดพลาดบนหน้าภายในกล่องเมตาที่กำหนดเองของฉัน แต่นี่น้อยกว่าอุดมคติ - ฉันควรมีข้อผิดพลาดขนาดใหญ่สีแดงขึ้นไปด้านบนอย่าง WP แสดงขึ้นตามปกติ
ความคิดใด ๆ
UPDATE:
จากคำตอบของ @Denis ฉันได้ลองทำหลายอย่าง การจัดเก็บข้อผิดพลาดในโลกไม่ทำงานเนื่องจาก Wordpress ทำการเปลี่ยนเส้นทางในระหว่างกระบวนการ save_post ซึ่งจะฆ่าโลกก่อนที่คุณจะสามารถแสดงได้
ฉันลงเอยเก็บไว้ในเมตาดาต้า ปัญหาเกี่ยวกับสิ่งนี้คือคุณต้องล้างพวกมันออกหรือพวกมันจะไม่หายไปเมื่อคุณนำทางไปยังหน้าอื่นดังนั้นฉันต้องเพิ่มฟังก์ชั่นอื่น ๆ ที่แนบมากับ admin_footer ที่เพิ่งกำจัดข้อผิดพลาดออกไป
ฉันไม่คาดหวังว่าการจัดการข้อผิดพลาดสำหรับบางสิ่งที่พบบ่อยมาก ฉันขาดอะไรบางอย่างที่ชัดเจนหรือเป็นวิธีที่ดีที่สุดหรือไม่
// 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' );
update_option('my_admin_errors', false);
ทันทีหลังจากที่คำสั่งถ้าในตอนท้ายของwpse_5102_admin_notice_handler()
?
admin_footer
เบ็ดถ้าคุณล้างข้อผิดพลาดในตอนท้ายของฟังก์ชั่นจัดการการแจ้งเตือนของคุณ ลดความซับซ้อนของสิ่งต่าง ๆ เพียงเล็กน้อย