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:
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);
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?
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 );