Ho una funzione che definisce un campo personalizzato su un tipo di post. Supponiamo che il campo sia "sottotitolo".
Quando il post viene salvato, voglio fare un po 'di validazione sull'input e, se necessario, visualizzare un messaggio di errore nella schermata di modifica del post. Qualcosa di simile a:
// 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);
Sto cercando di agganciarlo all'azione save_post, ma non riesco a capire come gestire gli errori. Non sembra esserci un oggetto errore passato nella funzione, e se creo il mio oggetto WP_Error e lo restituisco, non viene rispettato da qualunque meccanismo spenga errori nella pagina di modifica post.
Al momento ho un messaggio di errore on-page all'interno della mia meta box personalizzata, ma questo è meno che ideale - Preferirei avere un grosso errore rosso al top come normalmente visualizza WP.
Qualche idea?
AGGIORNARE:
Sulla base della risposta di @Denis, ho provato alcune cose diverse. La memorizzazione degli errori come globale non ha funzionato, perché Wordpress esegue un reindirizzamento durante il processo save_post, che uccide il globale prima di poterlo visualizzare.
Ho finito per memorizzarli in un meta campo. Il problema è che devi eliminarli, altrimenti non andranno via quando navighi in un'altra pagina, quindi ho dovuto aggiungere un'altra funzione allegata a admin_footer che cancella gli errori.
Non mi sarei aspettato che la gestione degli errori per qualcosa di così comune (aggiornamento dei post) sarebbe stata così goffa. Mi sto perdendo qualcosa di ovvio o è questo l'approccio migliore?
// 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);
immediatamente dopo l'istruzione if alla fine di wpse_5102_admin_notice_handler()
?
admin_footer
gancio se cancelli gli errori alla fine della tua funzione di gestione degli avvisi. Semplifica un po 'le cose.