Shortcode siempre se muestra en la parte superior de la página

10 abr 2012, 15:27:41
Vistas: 24.8K
Votos: 20

Estoy usando un shortcode para obtener diferentes loops a través de loops-name.php. Por alguna razón, siempre aparece en la parte superior de la página. Investigué y encontré que usar echo en lugar de return causa ese problema, pero en mi código no estoy usando echo. Aquí está el shortcode:

// configuración del shortcode para su uso
function friendly_loop_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
'category' => '',
'module' => ''
), $atts ) );

include(locate_template('loop-'.$module.'.php'));
 }

¿Alguna idea de por qué está sucediendo esto?

6
Comentarios

¿Shortcode para incluir un archivo? Me parece un poco extraño.

Rutwick Gangurde Rutwick Gangurde
10 abr 2012 15:39:48

'con mi código no estoy usando echo' - ¿los archivos loop-module.php están haciendo echo o devolviendo su salida?

Michael Michael
10 abr 2012 15:45:44

No por ahora - el archivo solo tiene una etiqueta de párrafo con "test" escrito para poder ver cómo funciona.

john joe john joe
10 abr 2012 16:54:24

usa get_template_part('loop',$module) en su lugar, es más elegante, más rápido de escribir, soporta temas padre/hijo, y es el método recomendado para incluir plantillas en WordPress (¡sí, locate_template puede hacer algunas de esas cosas pero mira cuánto menos legible es!)

Tom J Nowell Tom J Nowell
11 abr 2012 13:00:56

posible duplicado de El resultado de un shortcode aparece ANTES del contenido de la página

Chip Bennett Chip Bennett
11 abr 2012 15:06:07

Originalmente lo intenté con get_template_part pero, si la memoria no me falla, no podía pasarle mi variable de categoría.

john joe john joe
11 abr 2012 16:07:05
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 2
3
23

Puedes almacenar en búfer la salida de esta manera:

ob_start();
include(locate_template('loop-'.$module.'.php'));
return ob_get_clean();

EDITO. Probé esto y funcionó bien.

function friendly_loop_shortcode( $atts, $content = null ) {
     extract( shortcode_atts( array(
         'category' => '',
         'module' => ''
     ), $atts ) );

     ob_start();
     include(locate_template('loop-'.$module.'.php'));
     $output = ob_get_clean();
     //print $output; // depuración
     return $output;
}

if (!is_admin()) {
     add_shortcode('test', 'friendly_loop_shortcode' );
}
10 abr 2012 16:02:00
Comentarios

No utilices el buffer de salida si existen otras alternativas.

fuxia fuxia
10 abr 2012 22:42:14

Me temo que eso no funcionó.

john joe john joe
11 abr 2012 09:38:03

¿qué salió mal? Lo intenté y actualicé la respuesta

offroff offroff
11 abr 2012 10:54:24
6
12

Tu archivo incluido está esencialmente haciendo echo de HTML. Por ejemplo:

<?php
 //Algo de PHP
 echo 'test';
 //Más PHP
 ?>

Es lo mismo que:

<?php
 //Algo de PHP 
 ?>
 test
<?php
 //Más PHP
 ?>

Ambos se imprimen inmediatamente en lugar de retornarse. Como se imprimen, aparecen antes del contenido de la página. Necesitas retornar algo para que se incluya en el contenido.

Como señaló @RutwickGangurde - es inusual incluir un archivo de plantilla en un shortcode.

10 abr 2012 15:46:26
Comentarios

Gracias, no lo sabía. ¿Entonces necesito poner todo en una variable y retornarla? En cuanto a incluir un archivo de plantilla - bueno, quiero hacerlo lo más fácil posible para los usuarios del tema personalizar el tema y tener un archivo de shortcode enorme anidado lejos del directorio raíz del tema no es realmente ideal para ellos.

john joe john joe
10 abr 2012 17:06:31

Mira la respuesta de @offroff - eso debería funcionar

Stephen Harris Stephen Harris
10 abr 2012 17:50:18

"bueno, quiero hacerlo lo más fácil posible para los usuarios del tema personalizar el tema" - ¿Cuántas capas de abstracción son necesarias? Tienes un archivo de plantilla personalizado dentro de un shortcode. No veo cómo eso facilita las cosas para los usuarios. Si quieres proporcionar la capacidad de añadir contenido estático a todas las entradas, simplemente define un dynamic_sidebar() dentro del Loop, y permite que los usuarios añadan Widgets.

Chip Bennett Chip Bennett
11 abr 2012 15:12:41

La mayoría de los usuarios del tema no apreciarán tener que revisar un archivo enorme de shortcodes para cambiar una simple clase CSS en el frontend. Si divido todo usando el sistema estándar de loop-name.php, les resultará mucho más rápido encontrar lo que necesitan. No es lo ideal, pero tengo que mantenerlos contentos ;)

john joe john joe
11 abr 2012 16:10:58

Muy bien explicado;

Diego Somar Diego Somar
20 ene 2018 19:11:39

Esta es la respuesta correcta, porque la causa del problema fue un "echo" indirecto del HTML, en lugar de construir el HTML en una variable y "return" al final de la función. En la documentación de WordPress, puedes encontrar esta advertencia: *** Recuerda usar return y no echo - cualquier cosa que se haga echo será enviada al navegador, pero no aparecerá en el lugar correcto de la página.***

aldemarcalazans aldemarcalazans
1 jul 2020 21:54:13
Mostrar los 1 comentarios restantes