Show Admin Message on Redirect

Here’s an updated version of your code that also handles the notification message using the Transients API.

/**
 * If post status is pending, set transient containing error message and
 * change the redirect location.
 * Filters slashed post data just before it is inserted into the database.
 *
 * @param array $data    An array of slashed post data.
 * @param array $postarr An array of sanitized, but otherwise unmodified post data.
 * 
 */
add_filter( 'wp_insert_post_data', 'wpse242399_wp_insert_post_data', 99, 2 );
function wpse242399_wp_insert_post_data( $data, $postarr ) {
    if ( $data['post_type'] !== 'revision' && $data['post_status'] === 'pending' ) {

        set_transient( get_current_user_id() . '_wpse242399_post_pending_notice', 
            __( 'Your post has been submitted for review.', 'your-text-domain' )
        );

        add_filter( 'redirect_post_location', 'wpse242399_redirect_post_location', 99 );
    }

    return $data;
}

/**
 * Remove the filter for the redirect location
 * and perform the redirect.
 */
function wpse242399_redirect_post_location( $location ) {
    remove_filter( 'redirect_post_location', __FUNCTION__, 99 );

    return add_query_arg( [
            'post_type' => 'event',
            'author'    => get_current_user_id(),
        ], admin_url( 'edit.php' )
    );
}

/**
 * Check to see if it's necessary to display a message.
 * If so, delete the transient and output the message.
 */
add_action( 'admin_notices', 'wpse242399_admin_notices' );
function wpse242399_admin_notices() {
    $message = get_transient( get_current_user_id() . '_wpse242399_post_pending_notice' );

    if ( $message ) {
        delete_transient( get_current_user_id() . '_wpse242399_post_pending_notice' );

        printf( '<div class="%1$s"><p>%2$s</p></div>',
            'notice notice-success is-dismissible wpse242399_post_pending_notice',
            $message
        ); 
    }
}

Leave a Comment