El enlace agregado a the_content parece ser llamado varias veces

2

Tengo el siguiente código en ejecución en un complemento:

 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 alguna razón, en páginas de publicaciones individuales, el HTML se imprime varias veces:

¿Alguienpuedepensarporquéestosería?Leí aquí que debo agregar al condicional para verificar is_singular () e is_main_query (), por lo que se vería como if(!in_category('Stories') || !is_singular() || !is_main_query() , pero eso parece impedir que el HTML se imprima en una página de publicación. ¿Alguna idea?

    
pregunta Ed King 05.05.2016 - 12:14

2 respuestas

4

Es normal que se acceda al contenido varias veces. Por ejemplo, los complementos de SEO deben hacer esto para acceder a él y generar metadatos desde.

También es un gancho de filtro . Los filtros nunca deben mostrarse en la página, están diseñados para modificar el valor pasado y devolverlo.

Si desea hacer algo en ese momento, pero solo dentro del bucle, entonces in_the_loop() es la condición que necesita.

    
respondido por el Rarst 05.05.2016 - 12:19
6

Estaba teniendo el mismo problema. Mi filtro the_content se llamaba varias veces y esto estaba desacelerando la carga de la página porque mi filtro the_content estaba llamando a una API externa. Así que en mi caso, la API fue consultada varias veces para los mismos datos.

Intenté usar in_the_loop() , is_singular() y is_main_query() pero a veces, dependiendo del tema, no se pudieron limitar las llamadas a mi filtro una vez.

Así que agregué una constante a mi filtro y eso parece haber solucionado el problema.

Este es un ejemplo de cómo limitar sus llamadas al filtro the_content a una 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 ayude!

Eric

    
respondido por el Eric 17.02.2017 - 19:06

Lea otras preguntas en las etiquetas