Der heutige Adventskalenderbeitrag richtet sich speziell an die Entwickler unter uns, die mit Rekursionen zu kämpfen haben. Angenommen, wir befinden uns innerhalb eines save_post
-Hook-Kontext und möchten aus welchen Gründen auch immer wp_update_post()
nutzen, sieht die Funktion in etwa so aus:
add_action( 'save_post', 'marketpress_save_post_data' ); function marketpress_save_post_data() { // Several Checkups ... // Update the post wp_update_post( array( 'ID' => $_POST[ 'post_ID' ], 'post_status' => 'publish' ) ); // Save all the rest of the data ... }
Das Problem hierbei ist, dass wp_update_post()
den ‘save_post
‘-Hook triggert. Damit befinden wir uns in einer Endlosschleife. Absichern können wir das Ganze, indem wir einfach eine temporär definierte Konstante nutzen:
add_action( 'save_post', 'marketpress_save_post_data' ); function marketpress_save_post_data() { // Several Checkups ... // double execute prevention if ( ! defined( 'MP_SAVE_POST_DATA' ) ) { define( 'MP_SAVE_POST_DATA', TRUE ); // Update the post wp_update_post( array( 'ID' => $_POST[ 'post_ID' ], 'post_status' => 'publish' ) ); // Save all the rest of the data ... } }
Dieses Beispiel kann man nutzen, um andere mögliche Rekursionen, wie zum Beispiel bei wp_update_user()
, zu nutzen.
Und was ist wenn schon ein anderes Plugin oder Theme die gleiche globale Variable definiert hat? Autsch…
Was halten wir denn davon:
Durch das
wird die Variable
beim ersten Aufruf der Funktion einmalig mit dem Wert initialisiert der die Funktion
zurück gibt (z.B. 1)
Wird die Funktion erneut aufgerufen, gibt die Funktion
einen um 1 erhöhte Wert zurück, die Variable
hingegen hat den gleichen Wert wie beim ersten Aufruf.