it-swarm.com.de

So vermeiden Sie eine Endlosschleife im save_post-Rückruf

Ich habe diese Seite viel benutzt, um meine Probleme zu lösen, aber diesmal konnte ich mein Problem nicht finden und beantworten.

Ich erhalte eine Endlosschleife, wenn ich wp_update_post in einer Funktion verwende, die für save_post aufgerufen wird. 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 Posts speichern (die vom Post-Typ "Abschnitt" sind). 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 name = 'sectionorder []'. Wenn ich also auf die Standard-Schaltfläche "Update" von WordPress klicke, wird ein Array mit allen IDs der Posts (in der angegebenen Reihenfolge) per POST gesendet. Hier ist also der Code, in dem ich das Array abrufe und die Bestellung 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 aber, dass es eine Endlosschleife startet. Wie vermeide ich das? Vielleicht kann ich das ganz anders machen?

Schätzen Sie Ihre Hilfe!

10
elgehelge

Sie können den Rückruf aus dem Hook save_post entfernen, den Beitrag aktualisieren und den Anruf dann wieder dem 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');
}
22
Stephen Harris

Ich habe nicht ganz den Ruf, etwas zu kommentieren, deshalb füge ich eine Antwort hinzu, obwohl Stephen's ausgezeichnet und korrekt ist. Instanzen, bei denen die Priorität der Aktion festgelegt werden soll, werden nicht verarbeitet.

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

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

// Die falsche Vorgehensweise 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 );
13
Charles Jaimet