Nested Shortcode Detection

时间:2010-11-29 作者:meosoft

如果您熟悉此代码

<?php
  $pattern = get_shortcode_regex();
  preg_match(\'/\'.$pattern.\'/s\', $posts[0]->post_content, $matches);
  if (is_array($matches) && $matches[2] == \'YOURSHORTCODE\') {
    //shortcode is being used
  }
?>
发件人this 但它不适用于嵌套的短代码。

有人知道如何使其适用于嵌套的短代码吗?

3 个回复
SO网友:Jeff Stieler

发件人:http://codex.wordpress.org/Shortcode_API#Limitations

如果它们的处理函数通过递归调用do\\u shortcode()来支持嵌套的shortcode宏,则shortcode解析器可以正确地处理嵌套的shortcode宏

但它不会让您在另一个短代码中嵌套相同的短代码:

但是,如果使用一个短码宏来封装另一个同名宏,则解析器将失败

假设您不会这样做,下面是一个人为的示例,说明您需要在短代码回调中执行的操作:

function paragraph_wrap($atts, $content) {

     // if there are nested shortcodes - handle them
     $content = do_shortcode($content);

     // wrap content in a paragraph tag
     $paragraphed = \'<p>\' . $content . \'</p>\';

     return $paragraphed;
}
add_shortcode(\'wrap_p\', \'paragraph_wrap\');
希望这有帮助。

SO网友:hakre

只是猜测而已。get\\u shortcode\\u regex()仅适用于已注册的短代码。因此,如果您没有注册“您的”短代码,它甚至不适用于简单的短代码。因此,如果您没有注册,这可能是您最终出现问题的原因。

Shortcode API, 有关如何注册短代码的示例,请参见add_shortcode() Codex page

function baztag_func($atts, $content=) {
    return "content = $content";
}
add_shortcode(\'baztag\', \'baztag_func\');
对于嵌套代码,Jeff已经回答了这是如何工作的。这基本上是一个较小的示例,演示了如何添加短代码。使用后add_shortcode(), get_shortcode_regex() 将返回一个正则表达式,该表达式实际上包含注册的短代码名称。否则就不匹配了。

SO网友:Raphael

短码匹配的实现方式有缺陷(shortcodes.php, ll174)。基本上,正则表达式用于描述什么应该是非正则语言(即具有任意嵌套的短代码)。

实际上,

[a]
  [a]
  [/a]
[/a]
将进行分析,以便第1行中的开始标记与第3行中的结束标记相匹配;显然,这不会导致理想的行为。

结束

相关推荐