Mam funkcję, która definiuje niestandardowe pole typu posta. Powiedzmy, że pole to „subhead”.
Gdy post zostanie zapisany, chcę przeprowadzić weryfikację danych wejściowych i w razie potrzeby wyświetlić komunikat o błędzie na ekranie edycji postu. Coś jak:
// 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);
Próbuję podłączyć to do działania save_post, ale nie mogę wymyślić, jak radzić sobie z błędami. Wydaje się, że do funkcji nie został przekazany obiekt błędu, a jeśli utworzę własny WP_Error obj i zwrócę go, żaden mechanizm nie wyrzuca go na stronę po edycji.
Obecnie mam komunikat o błędzie na stronie w moim niestandardowym polu meta, ale jest to mniej niż idealne - wolałbym mieć duży, czerwony błąd, jak zwykle wyświetlany WP.
Jakieś pomysły?
AKTUALIZACJA:
Na podstawie odpowiedzi @Denis próbowałem kilku różnych rzeczy. Przechowywanie błędów jako globalne nie działało, ponieważ Wordpress dokonuje przekierowania podczas procesu save_post, który zabija globalny, zanim będzie można go wyświetlić.
W końcu przechowałem je w polu meta. Problem polega na tym, że musisz je wyczyścić, inaczej nie znikną one, gdy przejdziesz do innej strony, więc musiałem dodać kolejną funkcję dołączoną do admin_footer, która po prostu usuwa błędy.
Nie spodziewałbym się, że obsługa błędów w przypadku czegoś tak powszechnego (aktualizacja postów) byłaby tak niezręczna. Czy brakuje mi czegoś oczywistego, czy jest to najlepsze podejście?
// 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);
natychmiast po instrukcji if na końcu wpse_5102_admin_notice_handler()
?
admin_footer
haka, jeśli usuniesz błędy na końcu funkcji obsługi powiadomień. Upraszcza to trochę.