El shortcode siempre se muestra en la parte superior de la página

15

Estoy usando un código corto para extraer diferentes bucles a través de loops-name.php. Por alguna razón, siempre está en la parte superior de la página. Lo busqué en Google y usar echo en lugar de return causa ese problema, pero con mi código no estoy usando echo. Aquí está el código corto:

// setup the shortcode for use
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?

john joe
fuente
Código corto para incluir un archivo? Me resulta un poco extraño.
Rutwick Gangurde
1
'con mi código no estoy usando echo' - ¿los archivos loop-module.php hacen eco o devuelven su salida?
Michael
No en este momento: el archivo solo tiene una etiqueta de párrafo con "prueba" escrita para que pueda ver cómo funciona.
john joe
utilice get_template_part('loop',$module)en su lugar, es más bonita, más rápido para escribir, temas soportes padre / hijo, y es el método recomendado de incluir plantillas en wordpress (sí locate_template pueden hacer algunas de esas cosas pero mira cuánto menos legible que es!)
Tom J Nowell

Respuestas:

16

Puede almacenar el resultado de la siguiente manera:

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

EDITAR. Intenté esto, 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; // debug
     return $output;
}

if (!is_admin()) {
     add_shortcode('test', 'friendly_loop_shortcode' );
}
offroff
fuente
44
No utilice el almacenamiento en búfer de salida si hay otras formas.
fuxia
Me temo que eso no funcionó.
John Joe
¿Qué salió mal? Traté y actualicé la respuesta
offroff
8

Su archivo incluido es esencialmente un eco de HTML. Por ejemplo

<?php
 //Some PHP
 echo 'test';
 //Some more PHP
 ?>

Es lo mismo que

<?php
 //Some PHP 
 ?>
 test
<?php
 //Some more PHP
 ?>

Ambos se imprimen inmediatamente en lugar de ser devueltos. Desde su impresión aparece antes del contenido de la página. Debe devolver algo para que se incluya en el contenido.

Como señaló @RutwickGangurde, es inusual incluir un archivo de plantilla en un código corto.

Stephen Harris
fuente
1
Gracias, no lo sabía. ¿Entonces necesito poner todo en una variable y devolverlo? En cuanto a incluir un archivo de plantilla, bueno, quiero que sea lo más fácil posible para los usuarios del tema personalizar el tema y tener un enorme archivo de código corto anidado lejos del directorio del tema raíz no es realmente ideal para ellos.
john joe
Vea la respuesta de @ offroff - eso debería funcionar
Stephen Harris
1
" Bueno, quiero que sea 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 a los usuarios. Si desea proporcionar la capacidad de agregar contenido estático a todas las publicaciones, simplemente defina un dynamic_sidebar()dentro del Loop y permita que los usuarios agreguen Widgets.
Chip Bennett
La mayoría de los usuarios del tema no apreciarán tener que rastrear a través de un archivo masivo de código corto para cambiar una clase simple de CSS en la interfaz. Si rompo todo usando el sistema estándar loop-name.php, es mucho más rápido para ellos encontrar lo que necesitan. No es ideal, pero tengo que mantenerlos felices;)
john joe
Muy bien explicado;
DR.Somar