Rufen Sie eine function auf, wenn Sie einen benutzerdefinierten Beitragstyp einfügen und aktualisieren

Hier habe ich benutzerdefinierte Post-Typ namens products und Taxonomie ist product_categories . Was ich brauche ist, wann immer ich den Beitrag in Produkten hinzufüge, ich muss function1 aufrufen, wenn ich den Beitrag aktualisiere, dann muss ich function2 aufrufen. Wie macht man das?

Ich habe auf Google gesucht und diese Lösung gefunden:

 add_action('save_post', 'save_in_filter', 10, 2); function save_in_filter($post_id, $post){ function1(); } function mynewproduct(){ myfunction(); } 

Aber was passiert, wenn ich auf “Neuen Post hinzufügen” klicke, dann wird plötzlich die function1 () ausgeführt, aber was ich brauche ist, dass function1 nach dem Einfügen der Daten ausgeführt wird, nicht bevor die Daten eingefügt werden.

Wenn ein Post zu Produkten hinzugefügt wird (post_type=products) ich function1() ausführen. Wenn ein Beitrag in Produkten aktualisiert wird, muss ich function2(); ausführen function2(); Warum post_updated, save_post funktioniert nicht richtig?

Solutions Collecting From Web of "Rufen Sie eine function auf, wenn Sie einen benutzerdefinierten Beitragstyp einfügen und aktualisieren"

Dies ist die ursprüngliche Antwort, aber es ist wenig errorshaft, siehe unten für die aktualisierte

Sie können folgenden Ansatz verwenden.

Das my_action_updated_post_meta wird ausgeführt, nachdem der Post-Insert oder das Update durchgeführt wurde:

 // define the updated_post_meta callback function my_action_updated_post_meta( $array, $int, $int ) { global $post; // see your updated post print_r($post); // make your action here... die('after update'); }; // add the action add_action( 'updated_post_meta', 'my_action_updated_post_meta', 10, 3 ); 

Hier ist die Dokumentationsseite der function.

Aktualisieren

Ich habe bemerkt, dass die obige Antwort ein wenig errorshaft ist – die Aktion updated_post_meta (für Post-Updates) wird auch beim Öffnen des _edit_lock für die Edition im Admin-Panel _edit_lock (da der _edit_lock dann gesetzt ist), auch wenn keine echte Änderung vorgenommen wird.

Also habe ich den Ansatz geändert.

Ich verwende eine globale Variable $my_updated_flag zu wissen, dass eine “echte” Änderung vorgenommen wurde. Ich setzte diese Variable auf “1” durch post_updated Aktion. Also, wenn $my_updated_flag == 1 wir wissen, dass dies nicht nur eine _edit_lock Änderung ist. Um Post- $post->post_status == 'draft' und Update-Aktionen zu unterscheiden, überprüfe ich den $post->post_status == 'draft' da neue Posts zu diesem Zeitpunkt den Status “Entwurf” haben.

 $my_updated_flag = 0; // define the updated_post_meta callback function action_updated_post_meta( $meta_id, $post_id, $meta_key, $meta_value = '' ) { global $post, $my_updated_flag; if ($my_updated_flag == 1) { if ($post->post_status == 'draft') { die('post_inserted'); } else { die('post_updated'); } $my_updated_flag = 0; } }; add_action( 'updated_post_meta', 'action_updated_post_meta', 10, 4 ); function action_post_updated( $array, $int, $int ) { global $my_updated_flag; $my_updated_flag = 1; }; add_action( 'post_updated', 'action_post_updated', 10, 3 ); 

Schauen post_updated zum Beispiel den post_updated Hook an ..

 // Hook to all private or public post types updating add_action( 'post_updated', 'my_function' ); function my_function( $post_id ){ $post_status = get_post_status( $post_id ); switch ( $post_status ) { case 'draft': case 'auto-draft': case 'pending': case 'inherit': case 'trash': return; case 'future': case 'publish': case 'private': // continue } 'do something; }