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

10 апр. 2012 г., 15:27:41
Просмотры: 24.8K
Голосов: 20

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

// настройка шорткода для использования
function friendly_loop_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
'category' => '',
'module' => ''
), $atts ) );

include(locate_template('loop-'.$module.'.php'));
 }

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

6
Комментарии

Шорткод для подключения файла? Мне это кажется немного странным.

Rutwick Gangurde Rutwick Gangurde
10 апр. 2012 г. 15:39:48

'в моем коде я не использую echo' - файлы loop-module.php выводят или возвращают свой результат?

Michael Michael
10 апр. 2012 г. 15:45:44

Пока нет - файл просто содержит тег абзаца с текстом "test", чтобы я мог понять, как это работает.

john joe john joe
10 апр. 2012 г. 16:54:24

Используйте get_template_part('loop',$module) вместо этого — это красивее, быстрее набирать, поддерживает родительские/дочерние темы и является рекомендуемым методом включения шаблонов в WordPress (да, locate_template может делать некоторые из этих вещей, но посмотрите, насколько менее читаемым он является!).

Tom J Nowell Tom J Nowell
11 апр. 2012 г. 13:00:56

возможный дубликат Результат шорткода появляется ПЕРЕД содержимым страницы

Chip Bennett Chip Bennett
11 апр. 2012 г. 15:06:07

Изначально я пробовал использовать get_template_part, но, если мне не изменяет память, я не смог передать в него свою переменную категории.

john joe john joe
11 апр. 2012 г. 16:07:05
Показать остальные 1 комментариев
Все ответы на вопрос 2
3
23

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

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' );
}
10 апр. 2012 г. 16:02:00
Комментарии

Не используйте буферизацию вывода, если есть другие способы.

fuxia fuxia
10 апр. 2012 г. 22:42:14

Боюсь, это не сработало.

john joe john joe
11 апр. 2012 г. 09:38:03

что пошло не так? Я попробовал и обновил ответ

offroff offroff
11 апр. 2012 г. 10:54:24
6
12

Ваш подключаемый файл, по сути, выводит HTML через echo. Например:

<?php
 //Некоторый PHP-код
 echo 'test';
 //Еще немного PHP
 ?>

То же самое, что и:

<?php
 //Некоторый PHP-код
 ?>
 test
<?php
 //Еще немного PHP
 ?>

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

Как отметил @RutwickGangurde - необычно подключать файл шаблона в шорткоде.

10 апр. 2012 г. 15:46:26
Комментарии

Спасибо, я этого не знал. Значит, мне нужно поместить весь код в переменную и вернуть его? Что касается включения файла шаблона - я хочу сделать максимально простым для пользователей темы возможность кастомизации, а огромный файл шорткода, вложенный где-то в глубине директории темы, не совсем идеален для них.

john joe john joe
10 апр. 2012 г. 17:06:31

Смотрите ответ @offroff - это должно сработать

Stephen Harris Stephen Harris
10 апр. 2012 г. 17:50:18

"я хочу сделать максимально простым для пользователей темы возможность кастомизации" - Сколько же слоев абстракции действительно необходимо? У вас есть пользовательский файл шаблона внутри шорткода. Я не вижу, как это упрощает жизнь пользователям. Если вы хотите дать возможность добавлять статический контент ко всем записям, просто определите dynamic_sidebar() внутри цикла и позвольте пользователям добавлять виджеты.

Chip Bennett Chip Bennett
11 апр. 2012 г. 15:12:41

Большинство пользователей темы не оценят необходимости продираться через огромный файл шорткодов, чтобы изменить простой CSS-класс на фронтенде. Если я разобью всё с использованием стандартной системы loop-name.php, то им будет гораздо быстрее найти то, что нужно. Не идеально, но я должен держать их довольными ;)

john joe john joe
11 апр. 2012 г. 16:10:58

Очень хорошо объяснено;

Diego Somar Diego Somar
20 янв. 2018 г. 19:11:39

Это правильный ответ, потому что причиной проблемы было косвенное "echo" HTML, вместо того чтобы собрать HTML в переменную и "вернуть" её в конце функции. В документации WordPress можно найти предупреждение: *** Помните, что нужно использовать return, а не echo - всё, что выводится через echo, отобразится в браузере, но не в правильном месте на странице.***

aldemarcalazans aldemarcalazans
1 июл. 2020 г. 21:54:13
Показать остальные 1 комментариев