the_content e is_main_query

12

Estou filtrando o conteúdo com o filtro the_content . Tudo funciona perfeitamente, trecho que minhas alterações são aplicadas às consultas personalizadas também. Minhas alterações aparecem na barra lateral também se o widget usar uma consulta personalizada

Para combater isso, estou usando is_main_query() para segmentar apenas a consulta principal, mas não está funcionando. As alterações ainda são aplicadas a todas as consultas. O que é engraçado, todas as outras verificações condicionais como is_single() e is_category() estão funcionando se eu segmentar páginas específicas, exceto que todas as alterações afetam qualquer outra consulta personalizada nessa página, se eu usar is_main_query() ou não

Estou sentindo falta de algo aqui. Como aplico minhas alterações à consulta principal usando somente o filtro the_content

add_filter('the_content', 'custom_content');

function custom_content($content){

    if(is_main_query()){ // << THIS IS NOT WORKING
        // My custom content that I add to the_content()    
    }
    return $content;
}
    
por Pieter Goosen 27.09.2014 / 16:41

3 respostas

11

Para ser honesto, a função in_the_loop() é o que você está procurando:

add_filter( 'the_content', 'custom_content' );

function custom_content( $content ) {
    if ( in_the_loop() ) {
        // My custom content that I add to the_content()    
    }
    return $content;
}

O que in_the_loop faz é verificar se global para $wp_query (que é o objeto de consulta principal) da postagem atual é -1 < $current_post < $post_count .

Isso acontece quando a consulta principal está em loop, porque antes de iniciar o loop, a postagem atual é -1 e depois que o loop termina, a postagem atual é redefinida como -1 novamente.

Portanto, se in_the_loop() for true, significa que o objeto de consulta principal está em loop, que é o que você precisa nesse caso (e é o mesmo resultado da adição da ação em loop_start e da remoção em loop_end , como a resposta que @ialocin escreveu: na verdade, funciona pela mesma razão e tem o meu +1).

O benefício da abordagem @ ialocin é quando você deseja segmentar um objeto de consulta diferente do principal, porque in_the_loop() só funciona para a consulta principal.

    
por gmazzap 28.09.2014 / 05:33
7

Isto é meramente uma adição à resposta do @ Otto. Apenas para torná-lo um pouco melhor compreensível. Basicamente, o que @Otto está dizendo, você tem que inverter a lógica, o que significa: se você puder determinar com segurança a consulta principal, você pode adicionar - e remover - sua conexão com o filtro the_content .

Por exemplo, a consulta principal pode ser reconhecida de forma confiável na ação pre_get_posts , então isso funcionaria:

function wpse162747_the_content_filter_callback( $content ) {
    return $content . 'with something appended';
}

add_action( 'pre_get_posts', 'wpse162747_pre_get_posts_callback' );
function wpse162747_pre_get_posts_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

Como você deve remover o filtro quando não for mais necessário, acho que a ação loop_end deve ser um bom lugar para isso e como contraparte podemos usar loop_start . Qual ficaria assim:

add_action( 'loop_start', 'wpse162747_loop_start_callback' );
function wpse162747_loop_start_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

add_action( 'loop_end', 'wpse162747_loop_end_callback' );
function wpse162747_loop_end_callback( $query ) {
    if ( $query->is_main_query() ) {
        remove_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}
    
por Nicolai 27.09.2014 / 18:11
5

Você está usando is_main_query() incorretamente. A função global is_main_query () retorna true a menos que a variável global $ wp_query tenha sido redefinida.

Provavelmente não há uma maneira 100% confiável de saber, dentro de um filtro the_content, se o loop atual em que você está ou não é a consulta principal ou não. O filtro de conteúdo apenas filtra o conteúdo. Não tem nenhuma forma de saber qual loop está sendo usado.

Em vez disso, você deve adicionar seu filtro quando precisar e removê-lo quando não precisar.

    
por Otto 27.09.2014 / 16:50