5

我知道如果使用 do_shortcode 包装器可以嵌套短代码,但是,codex 指出:

“但是,如果使用短代码宏包含另一个同名宏,解析器将失败:”

有没有解决的办法?

例如,如果我有一个短代码来制作一个 div,例如:

[div]some content in a div[/div]

我希望能够使用:

[div]
    [div]a nested div[/div]
[/div]

但这将使用标准的 do_shortcode 包装器失败。

我的临时解决方法是复制带有 _parent 名称的短代码,但除非我创建了 div_parent1、div_parent2 等,否则我只能嵌套 1 级深...

4

3 回答 3

3

如果您正在编写简码,则有一个简单的解决方案。您可以编写多个调用相同函数的简码。我有用于创建 html 块(如 div)的简码,并且有几个名称为 div、block1、block2 等。

add_shortcode('div', 'devondev_block');
add_shortcode('block', 'devondev_block');
add_shortcode('block2', 'devondev_block');

它们都调用相同的函数。只要您记得使用不同的短代码,它们就可以嵌套。

WordPress 短代码支持因尝试仅使用正则表达式进行解析而受到影响。可以使用正则表达式、有限状态机和堆栈的混合来进行这种解析。这种方法可以处理嵌套并且速度非常快,尤其是在短代码很少的情况下。每次遇到这个我都想试一试。

于 2013-01-07T20:38:18.230 回答
1

API 告诉它是这样的,因此这是不可能的:

This is a limitation of the context-free regexp parser used by do_shortcode() - it is very fast but does not count levels of nesting, so it can't match each opening tag with its correct closing tag in these cases.

最新版本(3.4.2)中有问题的功能是:

function do_shortcode($content) {
    global $shortcode_tags;

    if (empty($shortcode_tags) || !is_array($shortcode_tags))
        return $content;

    $pattern = get_shortcode_regex();
    return preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $content );
}

function get_shortcode_regex() {
    global $shortcode_tags;
    $tagnames = array_keys($shortcode_tags);
    $tagregexp = join( '|', array_map('preg_quote', $tagnames) );

    // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
    return
          '\\['                              // Opening bracket
        . '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
        . "($tagregexp)"                     // 2: Shortcode name
        . '\\b'                              // Word boundary
        . '('                                // 3: Unroll the loop: Inside the opening shortcode tag
        .     '[^\\]\\/]*'                   // Not a closing bracket or forward slash
        .     '(?:'
        .         '\\/(?!\\])'               // A forward slash not followed by a closing bracket
        .         '[^\\]\\/]*'               // Not a closing bracket or forward slash
        .     ')*?'
        . ')'
        . '(?:'
        .     '(\\/)'                        // 4: Self closing tag ...
        .     '\\]'                          // ... and closing bracket
        . '|'
        .     '\\]'                          // Closing bracket
        .     '(?:'
        .         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
        .             '[^\\[]*+'             // Not an opening bracket
        .             '(?:'
        .                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
        .                 '[^\\[]*+'         // Not an opening bracket
        .             ')*+'
        .         ')'
        .         '\\[\\/\\2\\]'             // Closing shortcode tag
        .     ')?'
        . ')'
        . '(\\]?)';                          // 6: Optional second closing brocket for escaping shortcodes: [[tag]]
}
于 2012-11-01T19:29:52.793 回答
0

您需要为您的简码中的内容再次执行简码。例子:

add_shortcode('div', function($attributes, $content, $tag) {
    ...
    do_shortcode($content);
    ...
});

另请参阅:启用嵌套短代码的最佳方法是什么?(WordPress SE)

刚刚看到:这并不能解决 Wordpress 中的问题,因此无法回答您的问题。我以为直到现在它都会被修复。

于 2012-11-01T19:37:29.157 回答