Adventskalender Tag 10 – Rekursion in Hooks verhindern

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.

Newsletter abonnieren

Schaue unsere Datenschutzverordnung an

Das könnte dich auch interessieren

Neues Plugin: B2B Market für WooCommerce

B2B Market ist die erste deutschsprachige Lösung für B2B-Shops mit WooCommerce und WordPress. Verkaufe an B2B und an B2C, erfülle die gesetzlichen Anfor ...

Mehr erfahren

WooCommerce Projekte vorgestellt: Die Beer Ambassadors - Bierspezialitäten im Abo

Die Beer Ambassadors haben einen ganz besonderen Onlineshop auf die Beine gestellt - mit WooCommerce und German Market. Wir haben die beiden Gründer Thoma ...

Mehr erfahren

Die Übersicht: 5 DSGVO Plugins für WordPress und WooCommerce

Auch nach dem Inkrafttreten der EU-Datenschutzverordnung suchen viele Portal- und Shopbetreiber nach einer Lösung, um die gesetzlichen Anforderungen zu er ...

Mehr erfahren

Kommentare

1 Kommentar

  1. Und was ist wenn schon ein anderes Plugin oder Theme die gleiche globale Variable definiert hat? Autsch…

    Was halten wir denn davon:

    static $done_hook = did_action( 'save_post' );
    
    if ( $done_hook <= did_action( 'save_post' ) ) {
      // do stuff only once
    }
    

    Durch das

    static

    wird die Variable

    $done_hook

    beim ersten Aufruf der Funktion einmalig mit dem Wert initialisiert der die Funktion

    did_action( 'save_post' )

    zurück gibt (z.B. 1)
    Wird die Funktion erneut aufgerufen, gibt die Funktion

    did_action( 'save_post' )

    einen um 1 erhöhte Wert zurück, die Variable

    $done_hook

    hingegen hat den gleichen Wert wie beim ersten Aufruf.

Schreibe eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Du kannst folgende HTML Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>