Tengo una función que define un campo personalizado en un tipo de publicación. Digamos que el campo es "subtítulo".
Cuando se guarda la publicación, quiero hacer una validación en la entrada y mostrar un mensaje de error en la pantalla de edición de la publicación si es necesario. Algo como:
// 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);
Estoy tratando de conectar esto a la acción save_post, pero no puedo entender cómo manejar los errores. No parece haber un objeto de error pasado a la función, y si creo mi propio obj WP_Error y lo devuelvo, no se respeta por ningún mecanismo que escupe errores en la página de edición posterior.
Actualmente tengo un mensaje de error en la página dentro de mi metacuadro personalizado, pero esto es menos que ideal: prefiero tener un error grande, rojo y arriba como el que normalmente se muestra WP.
¿Algunas ideas?
ACTUALIZAR:
Según la respuesta de @Denis, probé algunas cosas diferentes. El almacenamiento de errores como global no funcionó, porque Wordpress realiza una redirección durante el proceso save_post, que mata al global antes de que pueda visualizarlo.
Terminé almacenándolos en un metacampo. El problema con esto es que debe eliminarlos, o no desaparecerán cuando navegue a otra página, por lo que tuve que agregar otra función adjunta al admin_footer que simplemente elimina los errores.
No hubiera esperado que el manejo de errores para algo tan común (actualizar publicaciones) fuera tan torpe. ¿Me estoy perdiendo algo obvio o este es el mejor enfoque?
// 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);
inmediatamente después de la declaración if al final de wpse_5102_admin_notice_handler()
?
admin_footer
enganche si elimina los errores al final de su función de controlador de notificaciones. Simplifica las cosas solo un poco.