I am building an add-on to an events module that checks for availability, since there wasn't a function for that in that module. Now that I have built the logic, there are three emails I will need to send:

  • One if the post is being submitted for the first time (ie 'New appointment')

  • One if the post has been published by the site admin, as normal users won't be able to publish by themselves (ie 'Your appointment has been approved')

  • One for if the post has been edited, AFTER it has been published already (ie 'Your appointment has been edited')

I have hooked into save_post and publish_post for those first two, but I want an entirely different email sent upon editing a PUBLISHED post. How can I test for whether the post is already published and this is just an edit, versus it being published for the first time?

2 Answers 2


Hook into edit_post to catch changes. And take a look at wp_transition_post_status() which is called on inserts and updates:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("{$old_status}_to_{$new_status}", $post);
    do_action("{$new_status}_{$post->post_type}", $post->ID, $post);

On publish you hook into

  • draft_to_publish,
  • pending_to_publish and
  • auto-draft_to_publish.

For edits hook into publish_to_publish.


A mini plugin that notifies all authors during post publish or edit.

 * Plugin Name: (#56779) Notify authors
add_action( 'transition_post_status', 'wpse_56779_notify_authors', 10, 3 );
function wpse_56779_notify_authors( $new_status, $old_status, $post )
    if ( 'publish' !== $new_status )

    $subject = 'publish' === $old_status
        ? __( 'Edited: %s', 'your_textdomain' )
        : __( 'New post: %s', 'your_textdomain' );

    $authors = new WP_User_Query( array( 'role' => 'Author' ) );
    foreach ( $authors as $author )
            sprintf( $subject, $post->post_title ),
            // Headers
            // Attachments
        // Slow down
        sleep( 5 );
  • Yeah, I didn't quite understand how to use those, but that's what I needed to do! Now my emails are finely tuned. Thanks!
    – fasad
    Jun 29, 2012 at 12:57

Use this....

function save_func($ID, $post,$update) {

   if($update == false) {
     // do something if its first time publish
   } else {
     // Do something if its update

add_action( 'save_post', 'save_func', 10, 3 );
  • this not answers the question, $update is false only on the post creation not when published
    – mmm
    May 29, 2017 at 17:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.