Lo shortcode viene sempre visualizzato nella parte superiore della pagina
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?

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

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

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.

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.

"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.

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

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.***
