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
    Create Namespaced Classes with MooTools

    MooTools has always gotten a bit of grief for not inherently using and standardizing namespaced-based JavaScript classes like the Dojo Toolkit does.  Many developers create their classes as globals which is generally frowned up.  I mostly disagree with that stance, but each to their own.  In any event...

  • 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...

Incredible Demos

  • By
    Basic AJAX Requests Using MooTools 1.2

    AJAX has become a huge part of the modern web and that wont change in the foreseeable future. MooTools has made AJAX so simple that a rookie developer can get their dynamic pages working in no time. Step 1: The XHTML Here we define two links...

  • By
    Animated AJAX Record Deletion Using MooTools

    I'm a huge fan of WordPress' method of individual article deletion. You click the delete link, the menu item animates red, and the item disappears. Here's how to achieve that functionality with MooTools JavaScript. The PHP - Content & Header The following snippet goes at the...

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!