Home >CMS Tutorial >WordPress >Displaying Errors from the save_post Hook in WordPress
Handling and Displaying Errors from the WordPress save_post
Hook: Three Approaches
WordPress lacks a single, standardized method for managing and displaying errors originating from the save_post
hook. However, several effective strategies exist, each with its own strengths and weaknesses. This article explores three prominent approaches: using the $_SESSION
global, leveraging WordPress transients, and employing GET parameters in redirects.
The complexity stems from WordPress's post-saving redirect. After the save_post
hook executes, the user is redirected, breaking the execution thread and losing access to global variables. Therefore, a mechanism is needed to transfer error information from the save action to the redirected page.
Method 1: Utilizing the $_SESSION
Global
This straightforward method stores the error message in the $_SESSION
global variable. It's simple to implement and avoids database interaction.
<code class="language-php">if ( !session_id() ) { session_start(); } if ($error) { $_SESSION['my_plugin_errors'] = $error->get_error_message(); } // ...in admin_notices hook... add_action( 'admin_notices', 'my_error_message' ); function my_error_message() { if ( isset( $_SESSION['my_plugin_errors'] ) ) { ?> <div class="error"> <p><?php echo $_SESSION['my_plugin_errors']; ?></p> </div> <?php unset( $_SESSION['my_plugin_errors'] ); } }</code>
Method 2: Employing WordPress Transients
Transients provide a WordPress-native caching mechanism. They store data with an expiration time, utilizing the object cache if available, or falling back to the database.
<code class="language-php">if ($error) { set_transient("my_save_post_errors_{$post_id}_{$user_id}", $error, 45); } // ...in admin_notices hook... add_action( 'admin_notices', 'my_error_message' ); function my_error_message() { if ( $error = get_transient( "my_save_post_errors_{$post_id}_{$user_id}" ) ) { ?> <div class="error"> <p><?php echo $error->get_error_message(); ?></p> </div> <?php delete_transient("my_save_post_errors_{$post_id}_{$user_id}"); } }</code>
Method 3: Appending a GET Parameter to the Redirect URL
This mirrors WordPress's own approach for displaying update messages. The error code is added as a query parameter to the redirect URL.
<code class="language-php">if ($error) { add_filter('redirect_post_location', function( $location ) use ( $error ) { return add_query_arg( 'my-plugin-error', $error->get_error_code(), $location ); }); } // ...in admin_notices hook... add_action( 'admin_notices', 'my_error_message' ); function my_error_message() { if ( isset( $_GET['my-plugin-error'] ) ) { // Handle error based on error code (switch statement) ?> <div class="error"> <p><?php // Display error message based on $_GET['my-plugin-error'] ?></p> </div> <?php } }</code>
Conclusion
The optimal method depends on the specific context. Transients offer a good balance between WordPress integration and performance, while the GET parameter approach provides the best performance but requires more careful management of error messages. The $_SESSION
method is simplest but less reliable in diverse WordPress environments. Choose the method that best suits your needs and project scale.
The above is the detailed content of Displaying Errors from the save_post Hook in WordPress. For more information, please follow other related articles on the PHP Chinese website!