I have a function that defines a custom field on a post type. Say the field is "subhead".
When the post is saved, I want to do some validation on the input, and display an error message on the post edit screen if necessary. Something like:
// 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); I'm trying to hook this to the save_post action, but I can't figure out how to handle errors. There doesn't appear to be an error object passed into the function, and if i create my own WP_Error obj and return it, it's not respected by whatever mechanism spits out errors on the post edit page.
I currently have an on-page error message inside my custom meta box, but this is less than ideal--I'd rather have a big, red, up-at-the-top error like WP normally displays.
Any ideas?
UPDATE:
Based on @Denis' answer, I tried a few different things. Storing errors as a global didn't work, because Wordpress does a redirect during the save_post process, which kills the global before you can display it.
I ended up storing them in a meta field. The problem with this is that you need to clear them out, or they won't go away when you navigate to another page, so I had to add another function attached to the admin_footer that just clears out the errors.
I wouldn't have expected that error handling for something so common (updating posts) would be this clunky. Am I missing something obvious or is this the best approach?
// 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' );
admin_footerhook if you clear out the errors at the end of your notice handler function. Simplifies things just a bit.update_option('my_admin_errors', false);immediately after the if statement at the end ofwpse_5102_admin_notice_handler()?