Gancho adicionado ao the_content parece ser chamado várias vezes

2

Eu tenho o seguinte código em execução em um plug-in:

 add_filter('the_content','thousand_pay');

//Callback function
function thousand_pay($content)
{
    echo $content;

    if( !in_category( 'Stories') )

    {
        return;
    }
    ?>
<hr></hr>
[Some HTML]
<?php

    return
}

Por algum motivo, nas páginas de postagens individuais, o HTML é impresso várias vezes:

Alguémpodepensaremporqueissoseria?Euli aqui que talvez precise adicionar à condicional para verificar is_singular () e is_main_query (), então seria parecido com if(!in_category('Stories') || !is_singular() || !is_main_query() , mas isso parece impedir que o HTML seja impresso em uma página de postagem. Alguma idéia?

    
por Ed King 05.05.2016 / 12:14

2 respostas

4

É normal que o conteúdo seja acessado várias vezes. Por exemplo, plugins SEO precisam fazer isso para acessá-lo e gerar metadados de.

Também é um gancho filtro . Os filtros nunca devem ecoar nada na página, eles devem modificar o valor passado e devolvê-lo.

Se você quiser fazer algo nesse ponto, mas apenas dentro do loop, então in_the_loop() é a condição que você precisa.

    
por Rarst 05.05.2016 / 12:19
6

Eu estava tendo o mesmo problema. Meu filtro the_content estava sendo chamado várias vezes e isso estava diminuindo o carregamento da página, pois o filtro the_content estava chamando uma API externa. Então, no meu caso, a API estava sendo consultada várias vezes para os mesmos dados.

Eu tentei usar in_the_loop() , is_singular() e is_main_query() , mas às vezes, dependendo do tema, as pessoas falharam em limitar as chamadas para o meu filtro uma vez.

Então, adicionei uma constante ao meu filtro e isso parece ter corrigido o problema.

Veja um exemplo de como limitar suas chamadas ao filtro the_content para uma única vez:

add_filter( 'the_content', 'se225721_the_content' );

function se225721_the_content( $content ) {

    if ( ! in_the_loop() ) {
        return $content;
    }

    if ( ! is_singular() ) {
        return $content;
    }

    if ( ! is_main_query() ) {
        return $content;
    }

    $content = ucwords( $content );

    remove_filter( 'the_content', 'se225721_the_content' );

    return $content;
}

Espero que ajude!

Eric

    
por Eric 17.02.2017 / 19:06