Comment éviter une boucle infinie dans le rappel save_post

9

Je me sers beaucoup de ce site pour résoudre mes problèmes, mais cette fois-ci, je n'ai pas réussi à trouver ni à répondre à mon problème.

J'obtiens une boucle infinie lorsque j'utilise wp_update_post dans une fonction appelée sur save_post . Je sais qu’il s’agit d’un problème courant, mais je ne vois pas comment l’éviter.

Je souhaite enregistrer l'ordre de mes publications (qui est du type "section"). J'ai donc créé une boîte à méta personnalisée contenant des éléments html pouvant être triés. Dans chaque élément, il y a une balise d'entrée cachée avec name = 'sectionorder []'. Ainsi, lorsque je clique sur le bouton standard «Mise à jour» de WordPress, un tableau contenant tous les identifiants des publications (dans l'ordre) est envoyé via POST. Voici donc le code où je récupère le tableau et souhaite enregistrer la commande:

    // 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 );
    }
}

Mais le problème est qu’il commence une boucle infinie. Comment puis-je éviter cela? Peut-être que je peux le faire d'une manière complètement différente?

Appréciez votre aide!

    
posée elgehelge 07.05.2012 - 12:21

2 réponses

22

Vous pouvez supprimer le rappel du crochet save_post , mettre à jour le message, puis rajouter l'appel au crochet. Le Codex donne un exemple .

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');
}
    
réponse donnée Stephen Harris 07.05.2012 - 12:43
11

Je n'ai pas encore la réputation de commenter, alors j'ajoute une réponse même si Stephen est excellent et correct. Il ne gère tout simplement pas les cas où vous souhaitez définir la priorité de l'action.

Si vous définissez la priorité lors de l'ajout de l'action mais que vous ne spécifiez pas la priorité lorsque vous la supprimez, vous obtiendrez une boucle infinie.

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

// La mauvaise façon de gérer cela - conduit à une boucle infinie

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

// La bonne façon de gérer cela - ne s'exécute qu'une fois

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 );
    
réponse donnée Charles Jaimet 20.06.2014 - 20:05

Lire d'autres questions sur les étiquettes