在短代码中使用操作挂钩

时间:2012-07-25 作者:Dalton Rooney

我正在尝试创建一个模块化插件,其中包括操作挂钩,供开发人员在主要短代码内容之前和之后添加内容。我遇到了一些麻烦,因为我在动作挂钩调用的函数中所做的任何事情都会在短代码的顶部而不是在它所属的短代码中进行响应。

我一直在寻找,我确实遇到了this response from Pippin Williams 在最近的ThemeForest线程中,他建议使用输出缓冲。我还没有让它对我正常工作read elsewhere 这种输出缓冲只能作为最后的手段,所以我仍在寻找一种干净的解决方案。

有史以来最简单的短代码:

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>";
}
由于echo语句,example\\u action\\u output()的内容返回到shortcode内容之上。我按照Pippin的建议尝试了输出缓冲:

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\\u action\\u output()的内容,但删除了剩余的短代码。有什么建议吗?

谢谢,道尔顿

2 个回复
最合适的回答,由SO网友:KalenGi 整理而成

Try this:

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;
}
SO网友:JandB65

我的答案将包括一个过滤器函数,它可以添加如下文本:

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>";
}

结束