Шорткоды Wordpress не в том месте

Я делаю плагин для WordPress и хочу использовать шорткоды для вставки довольно большого кода внутри поста. Я получил этот простой код, который имитирует мою проблему

function shortcode_fn( $attributes ) {
    wanted();
    return "unwanted";
}
add_shortcode( 'simplenote', 'shortcode_fn');

function wanted(){
    echo "wanted";
}

и опубликовать с этим содержанием

start
[simplenote]
end

что дает такой результат:

wanted
start
unwanted
end

и я хочу, чтобы он вставлял «разыскиваемый» текст между началом и концом. Я знаю, что самым простым решением было бы просто вернуть «wanted» в Want(), но у меня уже есть все эти функции, и они довольно огромны. Есть ли простое решение без написания всего с нуля?

@edit: может быть, есть способ сохранить все эхо-сигналы от функции в строке, не печатая ее?


person zbyshekh    schedule 28.04.2014    source источник
comment
Я не думаю, что есть способ обойти это, так как функции для генерации вывода шорткода выполняются до вывода содержимого страницы/публикации, поэтому в вашем примере показано, почему требуется.   -  person flauntster    schedule 28.04.2014


Ответы (3)


Простым обходным решением является использование функций управления выводом:

function shortcode_fn( $attributes ) {
    ob_start(); // start a buffer
    wanted(); // everything is echoed into a buffer
    $wanted = ob_get_clean(); // get the buffer contents and clean it
    return $wanted;
}
person Ruslan Bes    schedule 28.04.2014
comment
Я сделал это, и это работает частично. Текст виден между началом и концом, но он также печатает функцию перед началом. Есть ли способ подавить это? - person zbyshekh; 28.04.2014
comment
Это должно быть подавлено. Это исходный код: eval.in/143153 Результат: хотел начать нежелательно конец Это с буферизацией вывода: eval.in/143155 Результат: начало требуется нежелательное завершение - person Ruslan Bes; 28.04.2014
comment
Это работает, мой плохой :) Вместо этого я использовал ob_get_content, теперь он работает отлично - person zbyshekh; 28.04.2014

Перейдите по этой ссылке http://codex.wordpress.org/Shortcode_API#Overview.

Когда отображается the_content, API шорткода будет анализировать любые зарегистрированные шорткоды, такие как «[myshortcode]», отделять и анализировать атрибуты и содержимое, если таковые имеются, и передавать им соответствующую функцию обработчика шорткодов. Любая строка, возвращаемая (не эхом) обработчиком шорткода, будет вставлена ​​в тело сообщения вместо самого шорткода.

Таким образом, все функции шорткода должны быть возвращены, вы можете изменить свою функцию «хотели» на это:

function wanted(){
    return "wanted";
}
person rambu    schedule 28.04.2014

Стандартным способом WordPress было бы предоставить две функции. Во-первых, get_wanted() вернет нужную строку; другой, wanted(), просто:

function wanted() {
    echo get_wanted();
}

Так что вы можете сделать и то, и другое, но только большая часть кода будет находиться в одном месте. Это распространенный шаблон в WordPress, например. the_title() по сравнению с get_the_title().

Как упоминает @Ruslan, самым стандартным способом без переписывания существующей функции для построения строки было бы использование управления выводом.

person Matt Gibson    schedule 28.04.2014