web-dev-qa-db-fra.com

save_post + insert_post = boucle infinie

J'essaie de créer automatiquement un nouveau message lorsqu'un message contenant un certain champ personnalisé est enregistré - en reliant une fonction insert_post à save_post.

Cela génère une boucle infinie.

J'ai trouvé des réponses à ce problème, suggérant de vérifier le type de publication avant de l'insérer.

Cependant, le code suivant donne toujours une boucle infinie, des idées?

add_action('save_post', 'createGallery');

function createGallery () {
    global $post;
    if ( $post->post_type == 'activity' ) {
        $gallerypost = array(
            'post_content' => 'the text of the post',
            'post_status' => 'publish', 
            'post_title' => 'Photo album', 
            'post_type' => 'post', 
            'post_author' => 1);  
        wp_insert_post( $gallerypost );
    }
}
4
ptriek

En effet, la première fois que vous parcourez la boucle, $post est la publication actuelle. Mais la deuxième fois que vous contournez la boucle, $ post n’a pas changé. La même chose arrive les 3ème, 4ème, 5ème, etc.

Comme la variable $ post est la publication en cours de cette page, et non la publication que vous venez de sauvegarder/insérer, la boucle si l'instruction sera toujours vraie et une boucle infinie est nécessaire. Au lieu de vérifier la variable $post, vous devriez vérifier l'ID de la publication en cours de sauvegarde. Si nous regardons l'appel qui exécute l'action save_post:

do_action('save_post', $post_ID, $post);

Nous voyons maintenant que save_post a des paramètres !! Donc, si nous indiquons en ajoutant que la fonction accepte 1 paramètres:

add_action('save_post', 'createGallery',1,1);

Ajoutez ensuite le paramètre post ID et utilisez-le à la place:

function createGallery ($post_ID) {
    if ( get_post_type($post_ID) == 'activity' ) {
        $gallerypost = array(
            'post_content' => 'the text of the post',
            'post_status' => 'publish', 
            'post_title' => 'Photo album', 
            'post_type' => 'post', 
            'post_author' => 1);  
        wp_insert_post( $gallerypost );
    }
}

Alors votre boucle infinie devrait être parti! Si ce n'est pas le cas, vous avez considérablement progressé dans la précision de votre code puisque vous travaillez maintenant sur les données correctes.

Je tiens à vous avertir que le changement de 'post_type' => 'post', en 'post_type' => 'activity', réintroduirait la boucle infinie.

3
Tom J Nowell