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

Incredible Demos

  • By
    Creating the Treehouse Frog Animation

    Before we start, I want to say thank you to David for giving me this awesome opportunity to share this experience with you guys and say that I'm really flattered. I think that CSS animations are really great. When I first learned how CSS...

  • By
    CSS pointer-events

    The responsibilities taken on by CSS seems to be increasingly blurring with JavaScript. Consider the -webkit-touch-callout CSS property, which prevents iOS's link dialog menu when you tap and hold a clickable element. The pointer-events property is even more JavaScript-like, preventing: click actions from doing...

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!