Krótki kod zawsze wyświetla się u góry strony

15

Używam krótkiego kodu, aby pobierać różne pętle za pośrednictwem loops-name.php. Z jakiegoś powodu zawsze znajduje się na górze strony. Poszukałem go i używanie echa zamiast powrotu powoduje ten problem, ale w moim kodzie nie używam echa. Oto krótki kod:

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

Jakiś pomysł dlaczego tak się dzieje?

John Joe
źródło
Krótki kod do dołączenia pliku? Uważam to za trochę dziwne.
Rutwick Gangurde,
1
„z moim kodem nie używam echa” - czy pliki loop-module.php odbijają się echem czy zwracają dane wyjściowe?
Michael
W tej chwili nie - plik ma po prostu tag akapitu z napisem „test”, dzięki czemu mogę zobaczyć, jak to działa.
John Joe 10'12
użyj get_template_part('loop',$module)zamiast tego, jest ładniejszy, szybszy w pisaniu, obsługuje motywy nadrzędne / podrzędne i jest to zalecana metoda dołączania szablonów do wordpress (tak locate_template może robić niektóre z tych rzeczy, ale spójrz, o ile mniej jest czytelny!)
Tom J Nowell

Odpowiedzi:

16

Możesz buforować dane wyjściowe w następujący sposób:

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

EDYTOWAĆ. Próbowałem tego, działało dobrze.

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' );
}
offroff
źródło
4
Nie używaj buforowania wyjściowego, jeśli istnieją inne sposoby.
fuxia
Obawiam się, że to nie zadziałało.
John Joe
co poszło nie tak? Próbowałem i zaktualizowałem odpowiedź
off
8

Twój dołączony plik zasadniczo przypomina echo HTML. Na przykład

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

Jest taki sam jak

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

Oba są drukowane natychmiast, a nie zwracane. Po wydrukowaniu pojawia się przed treścią strony. Musisz zwrócić coś, aby zostało uwzględnione w treści.

Jak zauważył @RutwickGangurde - dołączanie pliku szablonu do krótkiego kodu jest niezwykłe.

Stephen Harris
źródło
1
Dzięki, nie wiedziałem tego. Więc muszę umieścić całość w zmiennej i zwrócić ją? Jeśli chodzi o dołączanie pliku szablonu - cóż, chcę ułatwić użytkownikom motywu dostosowanie motywu, a posiadanie dużego pliku shortcode zagnieżdżonego w katalogu głównym motywu nie jest dla nich idealnym rozwiązaniem.
John Joe
Zobacz odpowiedź @ offroffa - to powinno zadziałać
Stephen Harris
1
cóż, chcę ułatwić użytkownikom motywu dostosowanie motywu ” - Ile warstw abstrakcji jest potrzebnych? W pliku shortcode znajduje się niestandardowy plik szablonu. Nie rozumiem, jak to ułatwia użytkownikom. Jeśli chcesz zapewnić możliwość dodawania zawartości statycznej do wszystkich postów, po prostu zdefiniuj dynamic_sidebar()wewnątrz Pętli i pozwól użytkownikom dodawać widżety.
Chip Bennett
Większość użytkowników motywu nie doceni konieczności przeglądania dużego pliku shortcode w celu zmiany prostej klasy css na interfejsie użytkownika. Jeśli wszystko zepsuję za pomocą standardowego systemu loop-name.php, to jest o wiele szybciej, aby znaleźć to, czego potrzebują. Nie idealnie, ale muszę ich uszczęśliwić;)
John Joe
Bardzo dobrze wyjaśnione;
Diego Somar