Want to add custom post statuses to your WordPress blog posts? Post statuses are essential editorial tools that help organize articles by their stage in the publishing process. In this guide, we'll walk you through simple ways to implement custom post statuses in WordPress, drawing from years of managing multi-author sites.

Post statuses indicate the current stage of a blog post during editing. For instance, unfinished posts are saved as "Draft," while published ones shift to "Published."

These statuses guide how WordPress handles and displays content. Drafts, for example, are automatically hidden from public areas like your homepage.
By default, WordPress includes these post statuses:
Beyond these, you can create custom statuses to fit your workflow—like "Not Suitable" for fully written but unpublishable posts.
Let's dive into proven methods to add them.
This approach is straightforward and ideal for multi-author blogs, offering robust workflow management.
Install and activate the Edit Flow plugin. See our step-by-step WordPress plugin installation guide for details.
Once active, find "Edit Flow" in your admin menu, leading to its settings.

Enable features as needed, then click "Edit Statuses" under "Custom Statuses."
Edit Flow auto-adds these:

Create your own by entering a name and description, then "Add New Status."

Your status appears for editing or deletion.
On a new post (Posts » Add New), edit the status dropdown below "Publish."

Select from all statuses, including customs. View by status at Posts » All Posts.

Note: WordPress's post status API has limitations in the admin UI, requiring a JavaScript workaround. This method works but may need updates with core improvements.
To proceed, add this code to your theme's functions.php or a site-specific plugin. New to code? Check our guide on safely editing functions.php.
<?php
function wpb_custom_post_status() {
register_post_status( 'rejected', array(
'label' => _x( 'Rejected', 'post' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Rejected <span class="count">(%s)</span>', 'Rejected <span class="count">(%s)</span>' ),
) );
}
add_action( 'init', 'wpb_custom_post_status' );
// Add to admin dropdown with jQuery
add_action( 'admin_footer-post.php', 'wpb_append_post_status_list' );
function wpb_append_post_status_list() {
global $post;
if ( $post->post_type == 'post' ) {
$complete = '';
$label = 'Rejected';
if ( $post->post_status == 'rejected' ) {
$complete = ' selected="selected"';
}
echo '<script>
jQuery(document).ready(function($){
$("select#post_status").append( "<option value=\"rejected\" ' . $complete . '>Rejected</option>" );
$(".misc-pub-section label").append( "' . $label . '" );
});
</script>';
}
}
?>Replace "rejected" and "Rejected" with your custom status. This registers it and adds to the dropdown via jQuery.

This should empower your WordPress editorial process. Explore our 55+ essential WordPress tips for more.
Subscribe to our YouTube channel for video tutorials, and follow us on Twitter and Facebook.