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

Lokale Installation von WordPress und WooCommerce

Über eine lokale Installation von WordPress auf deinem Computer kannst du WooCommerce testen, Updates einspielen und Anpassungen durchführen - alles r ...

Mehr erfahren

WooCommerce einrichten Teil 1 - Grundeinstellungen & Produkte

Die Onlineshop-Erweiterung WooCommerce ist ein mächtiges Werkzeug mit unzähligen Einstellungsmöglichkeiten. Der nachfolgende Leitfaden zeigt dir, wie du ...

Mehr erfahren

Online-Kurse mit WordPress erstellen und mit WooCommerce verkaufen

Online-Kurse sind zeitgemäß und vermitteln ortsunabhängiges Wissen an Lernende. Über den Verkauf von Online-Kursen mit WooCommerce kannst du dein eigen ...

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>