Shortcode sempre visualizzato nella parte superiore della pagina


15

Sto usando uno shortcode per inserire diversi loop tramite loops-name.php. Per qualche motivo è sempre nella parte superiore della pagina. L'ho cercato su Google e usare echo invece di return causa quel problema ma con il mio codice non sto usando echo. Ecco lo shortcode:

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

Qualche idea sul perché questo stia accadendo?


Shortcode per includere un file? Lo trovo un po 'strano.
Rutwick Gangurde,

1
'con il mio codice non sto usando echo' - i file loop-module.php fanno eco o restituiscono il loro output?
Michael,

Non al momento - il file ha solo un tag di paragrafo con "test" scritto in modo da poter vedere come funziona.
john joe,

usa get_template_part('loop',$module)invece, è più bello, più veloce da digitare, supporta temi padre / figlio ed è il metodo raccomandato per includere modelli in wordpress (sì, si può individuare alcune di queste cose ma guardare quanto sia meno leggibile!)
Tom J Nowell

Risposte:


16

È possibile bufferizzare l'output in questo modo:

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

MODIFICARE. Ci ho provato, ha funzionato bene.

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

4

Temo che non abbia funzionato.
john joe,

cosa è andato storto? Ho provato e aggiornato la risposta
offroff l'

8

Il tuo file incluso fa essenzialmente eco a HTML. Per esempio

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

Equivale a

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

Entrambi vengono stampati immediatamente anziché restituiti. Dalla sua stampa appare prima del contenuto della pagina. Devi restituire qualcosa perché sia ​​incluso nel contenuto.

Come ha sottolineato @RutwickGangurde, è insolito includere un file modello in uno shortcode.


1
Grazie, non lo sapevo. Quindi devo mettere il tutto in una variabile e restituirlo? Per quanto riguarda l'inclusione di un file modello, beh, voglio rendere il più semplice possibile agli utenti del tema personalizzare il tema e avere un enorme file shortcode annidato lontano dalla directory del tema radice non è proprio l'ideale per loro.
john joe,

Vedi la risposta di @ offroff - che dovrebbe funzionare
Stephen Harris il

1
" beh, voglio semplificare il più possibile la personalizzazione del tema da parte degli utenti del tema " - Quanti livelli di astrazione sono necessari? Hai un file modello personalizzato all'interno di uno shortcode. Non vedo come ciò renda le cose più facili per gli utenti. Se vuoi fornire la possibilità di aggiungere contenuti statici a tutti i post, definisci semplicemente un dynamic_sidebar()ciclo all'interno del ciclo e consenti agli utenti di aggiungere widget.
Chip Bennett,

La maggior parte degli utenti del tema non apprezzerà la necessità di dover scorrere un enorme file di shortcode per modificare una semplice classe CSS sul frontend. Se rompo tutto usando il sistema standard loop-name.php, allora è molto più veloce per loro trovare ciò di cui hanno bisogno. Non è l'ideale ma devo renderli felici;)
john joe

Molto ben spiegato;
DR.Somar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.