Использование крючков действий внутри шорткода


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

Я искал и наткнулся на этот ответ от Пиппина Уильямса в недавней теме 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(), но уничтожило остальную часть моего шорткода. Есть какие-нибудь предложения?

Спасибо, Далтон

Author: Community, 2012-07-25

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;
}
 4
Author: KalenGi, 2012-07-25 13:14:55

Мой ответ будет включать функцию фильтра, которая добавляет текст следующим образом:

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>";
}
 1
Author: JandB65, 2016-08-27 09:14:38