Шорткод всегда отображается вверху страницы

15

Я использую шорткод для извлечения разных циклов через loops-name.php. По какой-то причине это всегда вверху страницы. Я гуглил его, и использование echo вместо return вызывает эту проблему, но с моим кодом я не использую echo. Вот короткий код:

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

Есть идеи, почему это происходит?

Джон Джо
источник
Шорткод для включения файла? Я нахожу это немного странным.
Rutwick Gangurde
1
'с моим кодом я не использую echo' - файлы loop-module.php отражают или возвращают свой вывод?
Майкл
На данный момент нет - в файле просто есть тег абзаца с надписью «test», чтобы я мог видеть, как он работает.
Джон Джо
используйте get_template_part('loop',$module)вместо этого, это красивее, быстрее набирать текст, поддерживает родительские / дочерние темы, и это рекомендуемый метод включения шаблонов в WordPress (да, locate_template может делать некоторые из этих вещей, но посмотрите, насколько он менее читабелен!)
Том Дж. Новелл

Ответы:

16

Вы можете буферизовать вывод следующим образом:

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

РЕДАКТИРОВАТЬ. Я попробовал это, работал нормально.

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
источник
4
Не используйте буферизацию вывода, если есть другие способы.
Fuxia
Боюсь, это не сработало.
Джон Джо
что пошло не так? Я попробовал и обновил ответ
offroff
8

Ваш включенный файл по сути повторяет HTML. Например

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

Такой же как

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

Оба печатаются сразу, а не возвращаются. Поскольку он напечатан, он появляется перед содержимым страницы. Вам нужно что-то вернуть, чтобы это было включено в контент.

Как указал @RutwickGangurde - это необычно включать файл шаблона в шорткод.

Стивен Харрис
источник
1
Спасибо, я этого не знал. Так что мне нужно поместить все это в переменную и вернуть его? Что касается включения файла шаблона - я хочу, чтобы пользователи темы могли как можно проще настраивать тему, а наличие огромного файла шорткода, вложенного в корневую директорию темы, не очень подходит для них.
Джон Джо
Смотрите ответ @ offroff - это должно сработать
Стивен Харрис
1
« Хорошо, я хочу, чтобы пользователи темы как можно проще настраивали тему » - Сколько нужно слоев абстракции? У вас есть собственный файл шаблона внутри шорткода. Я не понимаю, как это облегчает жизнь пользователям. Если вы хотите предоставить возможность добавлять статический контент ко всем сообщениям, просто определите dynamic_sidebar()внутреннюю петлю и разрешите пользователям добавлять виджеты.
Чип Беннетт
Большинству пользователей темы не понравится необходимость пролистывать массивный файл шорткода, чтобы изменить простой класс CSS на веб-интерфейсе. Если я разобью все, используя стандартную систему loop-name.php, тогда они смогут быстрее найти то, что им нужно. Не идеально, но я должен держать их счастливыми;)
Джон Джо
Очень хорошо объяснил;
DR.Somar