So vermeiden Sie Endlosschleifen im Rückruf von save_post


12

Ich habe diese Seite viel benutzt, um meine Probleme zu lösen, aber diesmal ist es mir nicht gelungen, mein Problem zu finden und zu beantworten.

Ich bekomme eine Endlosschleife, wenn ich wp_update_posteine Funktion verwende, die aufgerufen wird save_post. Ich weiß, dass dies ein häufiges Problem ist, aber ich kann nicht herausfinden, wie ich es vermeiden kann.

Ich möchte die Reihenfolge meiner Beiträge speichern (die vom Beitragstyp 'Abschnitt' ist). Also habe ich eine benutzerdefinierte Meta-Box erstellt, die einige sortierbare HTML-Elemente enthält. In jedem Element gibt es ein verstecktes Eingabe-Tag mit dem Namen = 'sectionorder []'. Wenn ich also auf das Standard-WordPress-Update 'Update' klicke, wird ein Array mit allen IDs der Beiträge (in der richtigen Reihenfolge) per POST gesendet. Hier ist also der Code, mit dem ich das Array abrufe und die Reihenfolge speichern möchte:

    // Update section sort order
$sectionorder = $_POST['sectionorder'];
if (isset($sectionorder)) { // Avoid error if there is no sections added yet
    foreach( $sectionorder as $no => $sectionID ) {
        $post_update = array();
        $post_update['ID'] = $sectionID;
        $post_update['menu_order'] = $no;
        wp_update_post( $post_update );
    }
}

Das Problem ist jedoch, dass eine Endlosschleife gestartet wird. Wie vermeide ich das? Vielleicht kann ich das ganz anders machen?

Schätzen Sie Ihre Hilfe!

Antworten:


26

Sie können den Rückruf aus dem save_postHook entfernen , den Beitrag aktualisieren und den Rückruf erneut zum Hook hinzufügen. Der Codex gibt ein Beispiel .

add_action('save_post', 'wpse51363_save_post');

function wpse51363_save_post($post_id) {

    //Check it's not an auto save routine
     if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
          return;

    //Perform permission checks! For example:
    if ( !current_user_can('edit_post', $post_id) ) 
          return;

    //Check your nonce!

    //If calling wp_update_post, unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'wpse51363_save_post');

    // call wp_update_post update, which calls save_post again. E.g:
    wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));

    // re-hook this function
    add_action('save_post', 'wpse51363_save_post');
}

Beeindruckend. Danke für die schnelle Antwort. Klappt wunderbar! Ich weiß nicht, warum ich dieses Codebeispiel selbst nicht gesehen habe.
Elgehelge

@Stephen, ich benutze update_post_metain einer Funktion, an save_postdie ich angeschlossen bin , soll ich auch aushaken und danach wieder einhaken update_post_meta?
Anagio

Nein, update_post_metawird (im Allgemeinen) save_postnicht ausgelöst.
Stephen Harris

Nachdem ich eine Stunde verschwendet hatte, fand ich dies und das sparte auch mehr Stunden, danke.
Manchumahara

13

Ich habe nicht den Ruf, etwas zu kommentieren, also füge ich eine Antwort hinzu, obwohl Stephens ausgezeichnet und korrekt ist. Es werden nur keine Instanzen behandelt, in denen Sie die Priorität der Aktion festlegen möchten.

Wenn Sie beim Hinzufügen der Aktion die Priorität festlegen, beim Entfernen jedoch keine Priorität angeben, wird weiterhin eine Endlosschleife angezeigt.

add_action('save_post', 'wpse51363_save_post', 25 );

// Die falsche Art, damit umzugehen - führt zu einer Endlosschleife

remove_action('save_post', 'wpse51363_save_post');
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post');

// Der RICHTIGE Weg, dies zu handhaben - wird nur einmal ausgeführt

remove_action('save_post', 'wpse51363_save_post', 25 );
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post', 25 );

1
Wow, danke! Ich war verrückt, um herauszufinden, warum ich immer noch die Endlosschleife bekam, selbst wenn ich hinzufügte remove_action/add_action.
Banjer

1
WordPress Codex :: Plugin API / Aktionsreferenz / Beitrag speichern :: Endlosschleifen vermeiden Sie demonstrieren dies. Wenn Sie sich WordPress Codex :: Funktionsreferenz ansehen / Aktion entfernen :: Verwendung "Die Priorität der Funktion (wie definiert, als die Funktion ursprünglich verknüpft war)." Wenn nicht angegeben, wird die Standardpriorität (10) verwendet. A / K / A - Sie müssen die gleiche Priorität wie beim Hinzufügen der Aktion angeben, um die Aktion tatsächlich zu entfernen.
Michael Ecklund

Dies ist die Antwort, nach der ich gesucht habe. Vielen Dank :)
manuman94
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.