Adventskalender Tag 10 – Rekursion in Hooks verhindern

Adventskalender Tag 10 – Rekursion in Hooks verhindern 1

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

Das könnte dich auch interessieren

WooCommerce-Bestellwert erhöhen

Die Umsätze in WooCommerce erhöhen, ohne mehr Pakete zu versenden? Ist das Zauberei? Nein, das geht ganz ohne Hokuspokus – und zwar mit der Erhöhung d ...

Mehr erfahren

WooCommerce SEO - Produktbilder und Produktgalerie

Im letzten WooCommerce SEO Beitrag hier im MarketPress-Blog ging es um Produktseiten, Produktbeschreibungen und Produktkategorien. Heute sind die Produktbi ...

Mehr erfahren

WooCommerce SEO - Produktseiten, Produktbeschreibungen & Produktkategorien

Mit der Suchmaschinenoptimierung für WooCommerce kann man gar nicht früh genug anfangen. Startvorteile im Rennen um die besten Plätze sichert sich, wer ...

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>