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?


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' );
}


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.