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!
https://davidwalsh.name/wordpress-publish-post-hook By David Walsh on January 14, 2016