Проблема с выводом шорткода перед контентом в WordPress

16 окт. 2012 г., 12:27:01
Просмотры: 14.4K
Голосов: 10

Возможный дубликат:
проблема с шорткодом

Проблема с работой шорткодов.

Для тех, кто хочет воспроизвести проблему, вот пошаговая инструкция.


1) Установите чистую версию WordPress (3.4.2).

2) В файле twentyeleven/functions.php добавьте следующий код:

function test() {
echo '-TEST-';
}
add_shortcode('testshortcode', 'test');

3) Отредактируйте пост "Hello world", чтобы он содержал:

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging! 
[testshortcode] 
foobar

4) Сохраните и посмотрите результат. У меня получается следующее:

-TEST-
Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!
foobar

Хотя должно быть так:

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!
-TEST-
foobar

Что здесь происходит?

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

Вместо "echo '-TEST-';" используйте "return '-TEST-';".

Softmixt Softmixt
6 апр. 2018 г. 00:07:58
Все ответы на вопрос 1
5
17

Обратные вызовы шорткодов должны возвращать значение, а не выводить его. Поэтому используйте следующий подход:

function test() {
    return '-TEST-';
}
add_shortcode( 'testshortcode', 'test' );

Подробнее: http://codex.wordpress.org/Shortcode_API

Если вам необходимо использовать echo, можно также сделать так (полезно, если много разметки и сложно работать со строками):

function test() {
    ob_start();
    echo '-TEST-';
    return ob_get_contents();
}
add_shortcode( 'testshortcode', 'test' );
16 окт. 2012 г. 12:29:05
Комментарии

Это интересно, на чистой установке это работает, но не работает в плагине, который делает то же самое. Там использовался echo, и он не срабатывал, как в моем примере, но когда я заменил его на return, всё равно не работает. Вот плагин http://wordpress.org/extend/plugins/wordpress-media-tags/

Neros Neros
16 окт. 2012 г. 12:37:04

Я скачал плагин и проверил: если заменить там echo на return, контент вернется в вызывающую функцию, а не в WordPress.

Mridul Aggarwal Mridul Aggarwal
16 окт. 2012 г. 12:50:06

Я только что это понял и собирался написать: если добавить еще один return в функцию, которую вызывает колбэк, и заменить echo, то всё работает. Спасибо.

Neros Neros
16 окт. 2012 г. 12:51:32

У меня это выводило контент дважды (один раз перед содержимым, второй — там, где я хотел). Я решил это так:

function test() { ob_start(); echo '-TEST-'; $ReturnString = ob_get_contents(); ob_end_clean(); return $ReturnString; }

Harkály Gergő Harkály Gergő
19 дек. 2016 г. 02:33:34

Для тех, у кого контент отображается дважды: используйте ob_get_clean вместо ob_get_contents

DreamWave DreamWave
9 мар. 2020 г. 15:16:51