Shortcode se afișează întotdeauna în partea de sus a paginii
Folosesc un shortcode pentru a încărca diferite bucle prin intermediul fișierului loops-name.php. Din anumite motive, acesta apare întotdeauna în partea de sus a paginii. Am căutat pe Google și am aflat că folosirea echo în loc de return cauzează această problemă, dar în codul meu nu folosesc echo. Iată shortcode-ul:
// configurarea shortcode-ului pentru utilizare
function friendly_loop_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
'category' => '',
'module' => ''
), $atts ) );
include(locate_template('loop-'.$module.'.php'));
}
Aveți vreo idee de ce se întâmplă acest lucru?

Puteți stoca în buffer rezultatul astfel:
ob_start();
include(locate_template('loop-'.$module.'.php'));
return ob_get_clean();
EDIT. Am încercat acest lucru, a funcționat bine.
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; // depanare
return $output;
}
if (!is_admin()) {
add_shortcode('test', 'friendly_loop_shortcode' );
}

Nu utilizați bufferizarea ieșirii dacă există alte metode.

Fișierul tău inclus practic afișează HTML. De exemplu:
<?php
//Unele PHP
echo 'test';
//Mai mult PHP
?>
Este același lucru cu:
<?php
//Unele PHP
?>
test
<?php
//Mai mult PHP
?>
Ambele sunt afișate imediat în loc să fie returnate. Deoarece sunt afișate, apar înainte de conținutul paginii. Trebuie să returni ceva pentru a fi inclus în conținut.
Așa cum a menționat @RutwickGangurde - este neobișnuit să incluzi un fișier template într-un shortcode.

Mulțumesc, nu știam asta. Deci trebuie să pun totul într-o variabilă și să o returnez? Cât despre includerea unui fișier de template - vreau să fac cât mai ușor posibil pentru utilizatorii temei să o personalizeze, iar a avea un fișier mare de shortcode ascuns departe de directorul rădăcină al temei nu este ideal pentru ei.

"vreau să fac cât mai ușor posibil pentru utilizatorii temei să o personalizeze" - Câte niveluri de abstractizare sunt necesare? Ai un fișier de template personalizat în interiorul unui shortcode. Nu văd cum asta ar face lucrurile mai ușoare pentru utilizatori. Dacă vrei să oferi posibilitatea de a adăuga conținut static la toate postările, definește un dynamic_sidebar()
în interiorul Loop-ului și lasă utilizatorii să adauge Widget-uri.

Majoritatea utilizatorilor de teme nu vor aprecia să fie nevoiți să scormonească printr-un fișier masiv de shortcode pentru a schimba o simplă clasă CSS în frontend. Dacă separ totul folosind sistemul standard loop-name.php, atunci le este mult mai ușor să găsească ce au nevoie. Nu este ideal, dar trebuie să îi țin mulțumiți ;)

Acesta este răspunsul corect, deoarece cauza problemei a fost un "echo" indirect al HTML-ului, în loc să construiești HTML-ul într-o variabilă și să o "returnezi" la sfârșitul funcției. În documentația WordPress, poți găsi acest avertisment: *** Nu uita să folosești return și nu echo - orice este afișat cu echo va fi trimis la browser, dar nu va apărea în locul corect pe pagină.***
