WordPress Publish Post Hook

By  on  

One of the best parts of WordPress is its hook/action system; this special hook system is WordPress' way of assigning callbacks when certain events occur. One event that there seems to be a lot of confusion over is which hook to use to detect when a post is initially published. There's the publish_post hook but that fires when you click the "Update" button after a post has already been published; that's not ideal.

Scour the WordPress documentation and forums and you're sure to see a dozen other solutions but none work as well as the transition_post_status hook:

// Add the hook action
add_action('transition_post_status', 'send_new_post', 10, 3);

// Listen for publishing of a new post
function send_new_post($new_status, $old_status, $post) {
  if('publish' === $new_status && 'publish' !== $old_status && $post->post_type === 'post') {
    // Do something!
  }
}

The transition_post_status occurs when a post goes from one status to another; you can check out the post status list to see other possible values. I've also added a post_type check to ensure the post is a blog post and not a page.

Whew, took me a while to find what I needed here -- hopefully this saves you a lot of searching and pain!

Recent Features

  • By
    Creating Scrolling Parallax Effects with CSS

    Introduction For quite a long time now websites with the so called "parallax" effect have been really popular. In case you have not heard of this effect, it basically includes different layers of images that are moving in different directions or with different speed. This leads to a...

  • By
    Page Visibility API

    One event that's always been lacking within the document is a signal for when the user is looking at a given tab, or another tab. When does the user switch off our site to look at something else? When do they come back?

Incredible Demos

  • By
    jQuery Random Link Color Animations

    We all know that we can set a link's :hover color, but what if we want to add a bit more dynamism and flair? jQuery allows you to not only animate to a specified color, but also allows you to animate to a random color. The...

  • By
    Jack Rugile’s Favorite CodePen Demos

    CodePen is an amazing source of inspiration for code and design. I am blown away every day by the demos users create. As you'll see below, I have an affinity toward things that move. It was difficult to narrow down my favorites, but here they are!

Discussion

  1. Manny Fleurmond

    Alternatives are {$old_status}_to_{$new_status}, which takes one argument of the post in question and is a bit more precise and {$new_status}_{post_type}

  2. Well if a post is already published and we want to edit in such a way that its automatically go in the recent one !! then what is the best procedure for it ?

  3. X-R

    Hi !
    THanks for the tips very useful !
    unfortunatly, I can’t get this work,
    it seems that the hook is only called when created a new post,

    even with simple

    function intercept_all_status_changes( $new_status, $old_status, $post ) {
        d($new_status);
    }  
    add_action( 'transition_post_status', 'intercept_all_status_changes', 10, 3 );

    Do you confirm it works for you ?

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!