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
    Interview with a Pornhub Web Developer

    Regardless of your stance on pornography, it would be impossible to deny the massive impact the adult website industry has had on pushing the web forward. From pushing the browser's video limits to pushing ads through WebSocket so ad blockers don't detect them, you have...

  • By
    Introducing MooTools Templated

    One major problem with creating UI components with the MooTools JavaScript framework is that there isn't a great way of allowing customization of template and ease of node creation. As of today, there are two ways of creating: new Element Madness The first way to create UI-driven...

Incredible Demos

  • By
    MooTools onLoad SmoothScrolling

    SmoothScroll is a fantastic MooTools plugin but smooth scrolling only occurs when the anchor is on the same page. Making SmoothScroll work across pages is as easy as a few extra line of MooTools and a querystring variable. The MooTools / PHP Of course, this is a...

  • By
    pointer Media Query

    As more devices emerge and differences in device interaction are implemented, the more important good CSS code will become.  In order to write good CSS, we need some indicator about device capabilities.  We've used CSS media queries thus far, with checks for max-width and pixel ratios.

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!