Eu tenho uma função que define um campo personalizado em um tipo de postagem. Digamos que o campo seja "subtítulo".
Quando a postagem é salva, desejo validar a entrada e exibir uma mensagem de erro na tela de edição da postagem, se necessário. 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);
Estou tentando vincular isso à ação save_post, mas não consigo descobrir como lidar com erros. Não parece haver um objeto de erro passado para a função e, se eu criar meu próprio objeto WP_Error e o devolver, ele não será respeitado por qualquer mecanismo que solte erros na página de pós-edição.
Atualmente, tenho uma mensagem de erro na página dentro da minha caixa de meta personalizada, mas isso é menos do que o ideal - eu prefiro ter um grande erro vermelho, alto, como o WP normalmente exibe.
Alguma ideia?
ATUALIZAR:
Com base na resposta de @Denis, tentei algumas coisas diferentes. O armazenamento de erros como global não funcionou, porque o Wordpress faz um redirecionamento durante o processo save_post, que mata o global antes que você possa exibi-lo.
Acabei armazenando-os em um meta-campo. O problema é que você precisa limpá-las ou elas não desaparecerão quando você navegar para outra página, então tive que adicionar outra função anexada ao admin_footer que apenas apaga os erros.
Eu não esperava que o tratamento de erros para algo tão comum (atualizando postagens) fosse tão desajeitado. Estou perdendo algo óbvio ou essa é a melhor abordagem?
// 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);
imediatamente após a instrução if no final de wpse_5102_admin_notice_handler()
?
admin_footer
gancho se limpar os erros no final da função do manipulador de avisos. Simplifica as coisas um pouco.