Was ist der richtige Weg, um beim Update Post zu haken

19

Ich versuche zu haken, wenn Post aktualisiert wird, aber alle Haken, die ich versuche, nie ausgeführt, außer updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

Ich habe dies versucht, add_action('save_post', 'my_function');aber es wurde keine ID als Echo ausgegeben, oder diese Nachricht wurde bereits als Echo ausgegeben, aber nie wiedergegeben, da der Redirect-Header gesendet wurde.

frech
quelle
2
Sie haben ein Leerzeichen danach save_post, ist das hier ein Tippfehler, oder war das in Ihrem ursprünglichen Code? Aktivieren Sie außerdem das Debuggen während der Entwicklung.
Milo
@ Milo sorry Tippfehler, aber nicht im Originalcode
Rusly
Wenn dies der Fall ist, sollten Sie Ihre Ausgabe in der oberen linken Ecke des Bildschirms sehen, wenn Sie einen neuen Beitrag erstellen. Das Speichern eines vorhandenen Posts erfolgt vor einer Umleitung, sodass Sie nichts sehen, es sei denn, Sie haben das Debuggen aktiviert.
Milo

Antworten:

55

Wenn ein Beitrag aktualisiert wird, werden einige Hooks ausgelöst:

  • 'pre_post_update'ist eine Aktion, die unmittelbar vor der Aktualisierung des Posts ausgelöst wird. Das übergebene Argument ist 2: $post_IDund $datadas ist ein Array aller anderen Datenbankspalten der Post-Tabelle
  • 'transition_post_status'ist ein Hook, der beim Update ausgelöst wird und 3 Argumente übergibt: $ new_post_status $old_post_statusund $post(object).
  • Dann gibt es noch zwei andere Übergangshooks, die aber dynamisch benannt sind. Dies bedeutet, dass die effektive Aktion vom alten und vom neuen Beitragsstatus abhängt. "{$old_status}_to_{$new_status}"und "{$new_status}_{$post->post_type}". Übergeben Sie zuerst das einzige Post-Objekt als Argument, die zweite Übergabe die Post-ID und das Post-Objekt. Finden Dokumentation hier .
  • 'edit_post'die 2 Argumente übergeben: $post_IDund $post(Objekt)
  • 'post_updated'dass Pass 3 Argumente $post_ID, $post_after(post - Objekt nach dem Update), $post_before(post - Objekt vor der Aktualisierung)
  • Ein weiterer dynamischer Haken: "save_post_{$post->post_type}"die auf Post - Typ abhängig ist , zB für Standard Beiträge ist 'save_post_post'und für die Seiten ist 'save_post_page', wobei dieser Haken Pass 3 Argumente: $post_ID, $post(Objekt) und $updatedas ist ein boolean (wahr oder falsch) , die wahr ist , wenn Sie ein Update durchführen, in Tatsache ist, dass dieser Haken auch ausgelöst wird, wenn ein Beitrag zum ersten Mal gespeichert wird.
  • ' save_post' wird sowohl beim Update als auch beim ersten Speichern ausgelöst und übergibt die gleichen 3 Argumente des vorherigen Hooks.
  • ' save_post_{$post_type}' wird sowohl beim Aktualisieren als auch beim ersten Speichern ausgelöst und übergibt dieselben ersten beiden Argumente des vorherigen Hooks.
  • Schließlich haben Sie ' wp_insert_post' , das wird sowohl beim Update als auch beim ersten Speichern ausgelöst, und übergeben die gleichen 3 Argumente der vorherigen 2 Hooks.

Diese Hooks werden jedes Mal ausgelöst, wenn ein Beitrag aktualisiert wird, sowohl über die Administrationsseiten im Backend als auch über die Funktionen wp_update_postoder, wenn sie "manuell" aktualisiert werden wp_insert_post.

Wenn der Beitrag über Admin-Seiten aktualisiert wird, werden zusätzliche Hooks ausgelöst. Ein Beispiel ist 'update_post_redirect'oder 'post_updated_messages'. (Siehe diese und diese WPSE-Antwort für Verwendungsbeispiele).

Beachten Sie, dass, wenn Sie ein Hook-Argument verwenden möchten, dies nicht das erste ist, das Sie explizit beim add_actionAufruf deklarieren müssen .

Wenn Sie beispielsweise das '$update'Argument (das ist das dritte) des Hooks verwenden möchten, 'save_post'müssen Sie es 3als $accepted_argsParameter hinzufügen add_action( siehe Dokumentation ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

Letzter Hinweis zum Timing : Sie müssen sicher sein, dass der add_actionAufruf erfolgt, bevor die Aktion ausgelöst wird. Andernfalls wird keine Aktion ausgeführt.

ZB dieser Code:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

wird nichts tun, da die Aktion hinzugefügt wird, nachdem der Hook ausgelöst wurde. Hier ist es einfach zu erkennen, in der realen Welt ist Code nicht immer so.

gmazzap
quelle
Ich denke, dass der Aktions-Hook 'save_post' auch ausgelöst wird, wenn Sie im Dashboard auf Add New (Post, Page, CPT) klicken. Um sich selbst zu sehen, führen Sie diesen Code aus. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Warum wird die Aktion 'save_post' beim Hinzufügen von Neu statt beim Veröffentlichen ausgeführt? Um den Auto-Draft-Beitrag zu machen, nehme ich an.
Lowtechsun
@lowtechsun Wie im A gesagt, werden die Hooks jedes Mal ausgelöst, wenn ein Beitrag aktualisiert, dh in der DB gespeichert wird. Wenn Sie auf "Add New" (Neu hinzufügen) klicken, erstellt WP einen Entwurfspost, der in der Datenbank gespeichert ist, damit die Hooks ausgelöst werden.
gmazzap
Danke, dass du auf mich zurückkommst. Hab erst gestern davon erfahren und fand das Konzept verwirrend. Das heißt, ich öffne zuerst die Seite, um einen neuen Beitrag hinzuzufügen. Zu diesem Zeitpunkt dachte ich, ich hätte noch keinen Beitrag erstellt. Erst wenn ich auf "Veröffentlichen" klicke, wird der neue Beitrag erstellt. Ich hoffe, dass WP den Auto-Draft-Beitrag löscht, wenn ich auf Add New drücke, aber dann die Seite verlasse, ohne Publish zu drücken.
Lowtechsun
2

Warum Haken nicht in post_updated_messages. Auf diese Weise können Sie diese Nachricht genau wie den aktualisierten WordPress-Standardpost anzeigen.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Hier finden Sie ein Beispiel:

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

unter post_updated_messages

Jacob Rambo
quelle