Funktion, die ausgeführt wird, wenn ein Beitrag in den Papierkorb verschoben wird.

9

Hallo, gibt es eine Aktion, die ausgeführt werden kann, während ein Beitrag in den Papierkorb verschoben wird? Ich habe versucht, delete_post und delete_post. Es funktioniert nur zweimal für jede Aktion (vor und nach der Aktion, wie im Codex geschrieben) und die Ausgabe wird nur angezeigt, wenn der Beitrag aus dem Papierkorb gelöscht wird. Beispiel Ich möchte eine E-Mail an den Autor senden, in der angegeben wird, dass sein Beitrag aus irgendeinem Grund in den Papierkorb verschoben wurde, und einige user_meta aktualisieren. wenn ich benutze

add_action('deleted_post', 'emailUser');

oder

add_action('delete_post', 'emailUser');

Es funktioniert nur, wenn der Beitrag aus dem Papierkorb gelöscht wird. . .

Update: Es funktioniert für Müllposts mit

add_action('trash_post', 'emailUser');

Das Problem der doppelten Ausführung der Funktion besteht jedoch weiterhin. . .

Harjeet Singh
quelle
1
Schreiben Sie die Lösung unten und markieren Sie sie als Antwort
Ashfame
Es ist nicht die richtige Antwort, da die doppelte Ausführung der Funktion immer noch da ist ...
Harjeet Singh

Antworten:

10

Dies wird den Trick machen!

add_action('trash_post','my_trash_post_function',1,1);
function my_trash_post_function($post_id){
    if(!did_action('trash_post')){
        // do stuff
    }
}

Hier fügen wir die Funktion hinzu und um zu verhindern, dass der Hook mehr als einmal mit did_action ausgeführt wird:

http://codex.wordpress.org/Function_Reference/did_action

Wie immer nimmt diese Art von Haken die Form {post_status}_{post_type}, so trash_post, trash_page, trash_customposttype, publish_pageusw.

Tom J Nowell
quelle
2

Diese Aktion wird einmal aufgerufen, wenn der Beitrag in den Papierkorb verschoben wird, und dann erneut, wenn der Papierkorb geleert wird.

Ihre Funktion kann prüfen, ob eine Option mit der Post-ID im Namen vorhanden ist. Wenn die Option nicht vorhanden ist, wird die E-Mail gesendet und die Option festgelegt. Wenn die Option vorhanden ist (z. B. ein zweites Mal aufgerufen wird), würden Sie die E-Mail nicht senden.

Denken Sie dann daran, die Option zu löschen, damit Ihre Datenbank nicht mit ihnen gefüllt wird!

add_action( 'delete_post', 'emailUser' );

function emailUser( $postid ) {

   if ( ! get_option( 'user_emailed_' . $postid ) ) {
      // send email here
      update_option( 'user_emailed_' . $postid, 'anything' );
   } else {
      delete_option( 'user_emailed_' . $postid );
   }

}

Lassen Sie mich wissen, ob das funktioniert!

Simon Blackbourn
quelle
Sie können die Transients-API anstelle von Optionen verwenden, sodass Sie sich keine Gedanken über das Löschen von Optionen aus der Datenbank machen müssen. codex.wordpress.org/Transients_API
Bainternet
Danke Simon, das funktioniert super. . . . Ich weiß nicht, warum ich das verpasst habe. . ..
Harjeet Singh
Bainternet, ich habe die Transienten gesehen und sie sind get_option in meinem Fall ziemlich ähnlich und ich würde mich auch für das Löschobjekt an get_option halten, da die Ausführung auch von der Serverleistung und der Berechnung der Codeausführungszeit vor und nach dem Löschen von abhängen würde Post könnte schwierig werden.
Harjeet Singh
Es ist überhaupt nicht erforderlich, Optionsfelder oder Transienten hinzuzufügen / zu bearbeiten und zusätzliche Abfragen hinzuzufügen. Rufen Sie stattdessen einfach did_action auf, um zu überprüfen, ob der Hook bereits ausgelöst wurde.
Tom J Nowell
1
add_action('trash_post', 'trash_post_function_name');

Der obige Hook hat in WP 4.7.5 bei mir nicht funktioniert.

Das hat bei mir funktioniert

add_action('wp_trash_post', 'trash_post_function_name');
Mohamed Salem Lamiri
quelle