Lo shortcode viene sempre visualizzato nella parte superiore della pagina

10 apr 2012, 15:27:41
Visualizzazioni: 24.8K
Voti: 20

Sto utilizzando uno shortcode per incorporare diversi loop tramite il file loops-name.php. Per qualche motivo, viene sempre visualizzato nella parte superiore della pagina. Ho cercato su Google e ho scoperto che usando echo invece di return si verifica questo problema, ma nel mio codice non sto usando echo. Ecco lo shortcode:

// configurazione dello shortcode per l'utilizzo
function friendly_loop_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
'category' => '',
'module' => ''
), $atts ) );

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

Qualcuno ha idea del perché sta succedendo questo?

6
Commenti

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

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

'con il mio codice non sto usando echo' - i file loop-module.php stanno facendo echo o restituendo il loro output?

Michael Michael
10 apr 2012 15:45:44

Non al momento - il file contiene solo un tag di paragrafo con scritto "test" così posso vedere come funziona.

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

usa get_template_part('loop',$module) invece, è più elegante, più veloce da scrivere, supporta i temi genitore/figlio ed è il metodo consigliato per includere template in WordPress (sì, locate_template potrebbe fare alcune di queste cose ma guarda quanto è meno leggibile!).

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

possibile duplicato di Il risultato di uno shortcode appare PRIMA del contenuto della pagina

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

Inizialmente ho provato con get_template_part ma, se la memoria non mi inganna, non riuscivo a passargli la mia variabile di categoria.

john joe john joe
11 apr 2012 16:07:05
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 2
3
23

Puoi memorizzare l'output nel buffer in questo modo:

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

MODIFICA. Ho provato questo, 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' );
}
10 apr 2012 16:02:00
Commenti

Non utilizzare l'output buffering se ci sono altri metodi disponibili.

fuxia fuxia
10 apr 2012 22:42:14

Purtroppo non ha funzionato.

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

Cosa è andato storto? Ho provato e aggiornato la risposta

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

Il tuo file incluso sta essenzialmente stampando (echo) HTML. Ad esempio

<?php
 //Del codice PHP
 echo 'test';
 //Altro codice PHP
 ?>

È lo stesso di

<?php
 //Del codice PHP 
 ?>
 test
<?php
 //Altro codice PHP
 ?>

In entrambi i casi il contenuto viene stampato immediatamente anziché restituito. Poiché viene stampato, appare prima del contenuto della pagina. Devi restituire qualcosa affinché venga incluso nel contenuto.

Come ha sottolineato @RutwickGangurde - è insolito includere un file template in uno shortcode.

10 apr 2012 15:46:26
Commenti

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

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

Vedi la risposta di @offroff - dovrebbe funzionare

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

"beh, voglio renderlo il più semplice possibile per gli utenti del tema personalizzare il tema" - Ma quanti livelli di astrazione sono necessari? Hai un file template personalizzato all'interno di uno shortcode. Non vedo come questo possa rendere 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() all'interno del Loop e lascia che gli utenti aggiungano Widget.

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

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

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

Molto ben spiegato;

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

Questa è la risposta corretta, perché la causa del problema era un "echo" indiretto dell'HTML, invece di costruire l'HTML in una variabile e "return" alla fine della funzione. Nella documentazione di WordPress, puoi trovare questo avvertimento: *** Ricorda di usare return e non echo - tutto ciò che viene echo verrà inviato al browser, ma non apparirà nel posto giusto della pagina.***

aldemarcalazans aldemarcalazans
1 lug 2020 21:54:13
Mostra i restanti 1 commenti