save_post + insert_post = loop infinito

4

Estou tentando criar automaticamente uma nova postagem quando uma postagem contendo um determinado campo personalizado for salva - conectando uma função insert_post em save_post.

Isso gera um loop infinito.

Encontrei algumas respostas para esse problema, sugerindo que eu verifique o tipo de postagem antes de inserir.

No entanto, o código a seguir ainda dá um loop infinito, alguma idéia?

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 );
    }
}
    
por ptriek 23.11.2011 / 13:19

1 resposta

3

Isso ocorre porque a primeira vez que você passa pelo loop $post é a postagem atual. Mas a segunda vez que você dá a volta, o $ post não mudou. A mesma coisa acontece no 3º, 4º, 5º, etc

Como a variável $ post é a postagem atual dessa página, não a postagem que você acabou de salvar / inserida, a declaração loops if será sempre verdadeira e um loop infinito será obrigatório. Em vez de verificar a variável $post , você deve verificar o ID da postagem que está sendo salva. Se olharmos para a chamada que executa a ação save_post :

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

Agora vemos que save_post tem parâmetros !! Então, se indicarmos ao adicionar que a função aceita 1 parâmetros:

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

Em seguida, adicione o parâmetro de ID do post e use-o:

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

Então o seu loop infinito deve sumir! Se não for, você deu um salto considerável para tornar seu código mais preciso, já que agora está trabalhando nos dados corretos.

Gostaria de avisar que a alteração de 'post_type' => 'post', para 'post_type' => 'activity', reintroduziria o loop infinito.

    
por Tom J Nowell 23.11.2011 / 13:50