У меня есть функция, которая определяет настраиваемое поле для типа сообщения. Скажите, что поле "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.
Любые идеи?
ОБНОВИТЬ:
Основываясь на ответе @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);
сразу после оператора if в конце wpse_5102_admin_notice_handler()
?
admin_footer
ловушки, если очистите ошибки в конце своей функции обработчика уведомлений. Упрощает вещи немного.