Shortcode se afișează întotdeauna în partea de sus a paginii

10 apr. 2012, 15:27:41
Vizualizări: 24.8K
Voturi: 20

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?

6
Comentarii

Shortcode pentru includerea unui fișier? Mi se pare puțin ciudat.

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

'cu codul meu nu folosesc echo' - fișierele loop-module.php afișează sau returnează rezultatul lor?

Michael Michael
10 apr. 2012 15:45:44

Nu în acest moment - fișierul are doar un tag de paragraf cu "test" scris în el ca să văd cum funcționează.

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

folosește get_template_part('loop',$module) în loc, este mai elegant, mai rapid de scris, suportă temele părinte/copil și este metoda recomandată pentru includerea șabloanelor în WordPress (da, locate_template poate face unele dintre aceste lucruri, dar uite cât de mult mai puțin lizibil este!)

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

posibil duplicat al Rezultatul unui shortcode apare ÎNAINTE de conținutul paginii

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

inițial am încercat cu get_template_part dar, dacă îmi amintesc corect, nu am putut să transmit variabila mea de categorie către el.

john joe john joe
11 apr. 2012 16:07:05
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 2
3
23

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' );
}
10 apr. 2012 16:02:00
Comentarii

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

fuxia fuxia
10 apr. 2012 22:42:14

Din păcate, asta nu a funcționat.

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

ce a mers prost? Am încercat și am actualizat răspunsul

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

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.

10 apr. 2012 15:46:26
Comentarii

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.

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

Vezi răspunsul lui @offroff - ar trebui să funcționeze

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

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

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

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

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

Foarte bine explicat;

Diego Somar Diego Somar
20 ian. 2018 19:11:39

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

aldemarcalazans aldemarcalazans
1 iul. 2020 21:54:13
Arată celelalte 1 comentarii