Art des Post-Status-Übergangs erkennen

Ich habe eine function auf meiner Website, die ausgeführt werden soll, wenn ein neuer Beitrag veröffentlicht wird (E-Mail Push-Benachrichtigung), mit Ausnahme des gleichen Artikels aktualisiert (dh publish_to_publish Übergang, ich möchte nicht unnötige Push-Benachrichtigungen senden)

Ich weiß, dass ich die Action-Hooks {alt_status} bis {new_status} verwenden kann, aber das bedeutet, dass ich alle zu publish Übergänge angeben muss ( new_to_publish , draft_to_publish , etc.).

Meine Frage ist:

  1. Kann ich stattdessen den publish_post Hook verwenden und feststellen, ob es publish_to_publish sodass ich es explizit negieren kann? etwas wie:

     function send_email() { if ($transition == 'publish_to_publish') return; //(else) send email } add_action('publish_post', 'send_email', 10, 1); 
  2. Wenn nicht, wie verknüpfe ich mehrere Hooks mit derselben Aktion? Liste ich sie einfach so auf:

     add_action('new_to_publish', 'send_mail', 10, 1); add_action('future_to_publish', 'send_mail', 10, 1); add_action('draft_to_publish', 'send_mail', 10, 1); 

Oder gibt es einen eleganteren Weg – wie ein Array zu passieren?

Solutions Collecting From Web of "Art des Post-Status-Übergangs erkennen"

Wenn nicht, wie verknüpfe ich mehrere Hooks mit derselben Aktion? Liste ich sie einfach so auf:

 add_action('new_to_publish', 'save_new_post', 10, 1); add_action('future_to_publish', 'save_new_post', 10, 1); add_action('draft_to_publish', 'save_new_post', 10, 1); 

Dies ist genau der richtige Weg. Hängen Sie den gleichen Callback an jeden der Statusübergangs-Hooks an, auf denen der Callback ausgetriggers werden soll.

Das können wir tun, indem wir den transition_post_status . Alles, was wir tun müssen, ist zu überprüfen, dass der alte Status nicht publish . Wir können auch andere Status ausschließen, indem wir ein Array dieser Status erstellen und gegen $old_status

Hinweis, dies erfordert PHP 5.4+ und ist nicht getestet

 add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) { // First check if our new status is publish before we do any work if ( 'publish' !== $new_status ) return; // Create the array of post statuses to check against $statuses = ['publish', 'pending', 'private', 'trash']; // If the old status is an the $statuses array, bail if ( in_array( $old_status, $statuses ) ) return; // Everything checked out, lets do what we are suppose to do // send email }, 10, 3 );