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 intentando enganchar esto a la acción save_post, pero no puedo entender cómo manejar los errores. No parece que se haya pasado un objeto de error a la función, y si creo mi propio WP_Error obj y lo devuelvo, no es respetado por ningún mecanismo que escupe errores en la página de edición de publicaciones.
Actualmente tengo un mensaje de error en la página dentro de mi meta caja personalizada, pero esto no es lo ideal. Prefiero tener un error grande, rojo, arriba como el de WP, como se muestra normalmente.
¿Alguna idea?
ACTUALIZAR :
Basado en la respuesta de @Denis, probé algunas cosas diferentes. El almacenamiento de errores como un global no funcionó, porque Wordpress redirecciona durante el proceso save_post, lo que mata al global antes de poder mostrarlo.
Terminé almacenándolos en un campo meta. El problema con esto es que necesitas borrarlos o no desaparecerán cuando navegues a otra página, así que tuve que agregar otra función adjunta al admin_footer que simplemente borra los errores.
No hubiera esperado que el manejo de errores para algo tan común (actualización de publicaciones) fuera tan torpe. ¿Me estoy perdiendo algo obvio o es este 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' );