Использование крючков действий внутри шорткода
Я пытаюсь создать модульный плагин, который включает в себя крючки действий для разработчиков, чтобы добавлять контент до и после основного содержимого шорткода. У меня возникли некоторые проблемы, потому что все, что я делаю в функции, вызываемой крючком действия, всегда отражается в верхней части шорткода, а не внутри шорткода, где ему место.
Я искал и наткнулся на этот ответ от Пиппина Уильямса в недавней теме ThemeForest, где он рекомендует использовать буферизацию вывода. Я не смог заставить это работать должным образом для меня, и я читал в другом месте , что буферизацию вывода следует использовать только в крайнем случае, поэтому я все еще ищу чистое решение.
Самый простой шорткод из когда-либо существовавших:
add_shortcode('shortcode','example_shortcode');
function example_shortcode( $atts ) {
$shortcode_output = "<p>Some shortcode content.</p>";
$shortcode_output .= "<p>More shortcode content.</p>";
return $shortcode_output;
}
Теперь давайте добавим действие:
add_shortcode('shortcode','example_shortcode');
function example_shortcode( $atts ) {
$shortcode_output = "<p>Some shortcode content.</p>";
$shortcode_output .= "<p>More shortcode content.</p>";
do_action('below_shortcode');
return $shortcode_output;
}
add_action('below_shortcode', 'example_action_output');
function example_action_output() {
echo "<p>This should be output at the end.</p>";
}
Содержимое example_action_output() возвращается выше содержимого шорткода из-за оператора echo. Я попробовал буферизацию вывода, как рекомендовал Пиппин:
add_shortcode('shortcode','example_shortcode');
function example_shortcode( $atts ) {
$shortcode_output = "<p>Some shortcode content.</p>";
$shortcode_output .= "<p>More shortcode content.</p>";
ob_start();
do_action('below_shortcode');
return ob_get_clean();
return $shortcode_output;
}
add_action('below_shortcode', 'example_action_output');
function example_action_output() {
echo "<p>This should be output at the end.</p>";
}
Это вернуло содержимое example_action_output(), но уничтожило остальную часть моего шорткода. Есть какие-нибудь предложения?
Спасибо, Далтон
2 answers
Попробуйте это:
function example_shortcode( $atts ) {
$shortcode_output = "<p>Some shortcode content.</p>";
$shortcode_output .= "<p>More shortcode content.</p>";
ob_start();
do_action('below_shortcode');
$below_shortcode = ob_get_contents();
ob_end_clean();
$shortcode_output .= $below_shortcode
return $shortcode_output;
}
Мой ответ будет включать функцию фильтра, которая добавляет текст следующим образом:
add_shortcode('shortcode','example_shortcode');
function example_shortcode( $atts ) {
$shortcode_output = "<p>Some shortcode content.</p>";
$shortcode_output .= "<p>More shortcode content.</p>";
$shortcode_output .= apply_filter('below_shortcode', $shortcode_output);
return $shortcode_output;
}
add_filter('below_shortcode', 'example_action_output', 10, 1);
function example_action_output( $text = '' ) {
return $text . "<p>This should be output at the end.</p>";
}