Home / admin / Update: Create custom post status messages in admin
  • How to Update: Create custom post status messages in admin


    Adding this snippet to the functions.php of your wordpress theme will let you create custom post status messages.

    This is an updated version of the (Create custom post status messages in admin) adding some additional features. Only users with the "publish_posts" capability can change the status while everyone sees what the status (if set) is. 1. Restricting add status with the capability publish_posts 2. Remove status notification selecting none. ( click code to copy )

    wordpress snippet : PHP

    add_filter( 'display_post_states', 'custom_post_state' );
    function custom_post_state( $states ) {
    	global $post;
    	$show_custom_state = get_post_meta( $post->ID, '_status' );
    	// We are using "None" as a way to disable this feature for the current post.
    	if ( $show_custom_state && $show_custom_state[0] != 'None' ) $states[] = '<span class="custom_state ' . strtolower( $show_custom_state[0] ) . '">' . $show_custom_state[0] . '</span>';
    	return $states;
    add_action( 'admin_head', 'status_css' );
    function status_css()
    	echo '
    	<!-- Styling of Custom Statuses -->
    	<style type="text/css">
    		.custom{border-top:solid 1px #e5e5e5;}
    			padding:3px 6px 3px 6px;
    // Only those with the capability should be able to change things.
    if ( current_user_can( 'publish_posts' ) ) {
    	// Insert our "Custom Status" into the Post Publish Box
    	add_action( 'post_submitbox_misc_actions', 'custom_status_metabox' );
    	function custom_status_metabox() {
    		global $post;
    		$custom = get_post_custom( $post->ID );
    		$status = $custom["_status"][0];
    		$i = 0;
    		// Available Statuses
    		$custom_status = array( 'None', 'Spelling', 'Review', 'Errors', 'Source', 'Rejected', 'Final' );
    		echo '
    		<div class="misc-pub-section custom">Custom status:
    		<select name="ourstatus">';
    			for ( $i = 0; $i < count( $custom_status ); $i++ ) {
    				echo '<option value="' . $custom_status[$i] . '"';
    				if ( $status == $custom_status[$i] ) echo ' selected="selected"';
    				echo '>' . $custom_status[$i] . '</option>';
    		echo '</select></div>';
    	// Save
    	add_action( 'save_post', 'save_status' );
    	function save_status( $post_id ) {
    		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return $post_id;
    		update_post_meta( $post_id, "_status", $_POST["ourstatus"] );
    My first post show me some love :)
  • Drew Jaynes

    Thanks for the update on this. I went through the original version line-by-line a couple of times and couldn’t figure out why I couldn’t set statuses with spaces / dashes / underscores in them. The pages just completely refused to match the styles and array values if they contained anything other than alphanumeric characters. Ideas?

    • Gabriel Merovingi

      Hey Drew. 

      I just tried this code and put in some values like “Special Offer”, “Used/Old” and “20% off!” and it works like a charm. Not sure what could be the issue if your using the code above just at it is.

      • Drew Jaynes

        Hmm, weird. I’ll give it another go. How did you match the style names when the array values had spaces and or symbols?

        • Gabriel Merovingi

          The examples I gave above resulted of course in the style defaulting to the custom_state (gray box) but that can probably be adjusted with cleaning up the names you use or by giving them a custom value which you will have to match in the custom_post_state function.

          Personally I always go for keeping things simple. If I would use this function with special character statuses I would assign some simpler css style names. 

          An example of this would be:

          if ( $show_custom_state[0] == ‘20% Off!’ ) $style = ‘orange’;
          elseif ($show_custom_state[0] == ‘Used/Old’ ) $style = ‘red’;

        • Drew Jaynes

          Durr, dunno why I didn’t think of just calling the array values separately. Thanks!

  • Drew Jaynes

    Any particular reason -webkit-border-radius was left out of custom_state in the CSS?

    • No just forgot to add in -webkit- and border-radius, updated!

  • Zach Shallbetter

    This conflicts with the “Higlight Post_States” function. Causes the status to loose it’s layout and break a line.

  • Zach Shallbetter

    This conflicts with the “Higlight Post_States” function. Causes the status to loose it’s layout and break a line.

    • Hi Zach,
      Yes this is true, I posted an updated version for you on paste bin that you can use. I did not change much to the snippet just after the comment on line 05.
      ” // We are using “None” as a way ”

      This is just a simple update and should be tweaked a little better but if you place the following code into the functions.php and replace both snippets this will solve the issue. I put both snippets into pastebin for you.


      • Anonymous


      • rogerthat213

        Hi. Thanks for this as I’ve also made use of this change to display both the default and custom post states. I have a minor styling issue though. I’m not too fond of the comma that is placed in between 2 post states. Is there any way to remove this at all? Thanks for your time and great code!

        • Ill look into this and the other suggestions for an updated version in the near future.

  • Anonymous

    I was just playing with this a bit further and it’s utterly terrific. What would make it really really amazing, is if you could assign more than one status to a post. So say the post had spelling and content issues both would show up.

    • Hi Zach ya that would be a great idea, ill see about doing an updated version of the snippet for something along that lines. Could be very cool!

  • Anonymous

    This and the other “draft” snipp no longer work with WordPress 3.3.1

  • Velio

    Hi guys, hi Gabriel, i just wondering about Status label translation to different language? If i change them i must to change css labels too in order to have style results, but if the language is Cyrillic? Any idea how to separate the code in order to give him a different from same label css style?