5

do_shortcode ラッパーを使用する場合、ショートコードをネストできることはわかっていますが、コーデックスには次のように記載されています。

「ただし、ショートコード マクロを使用して同じ名前の別のマクロを囲むと、パーサーは失敗します。」

これを回避する方法はありますか?

たとえば、次のような 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

ショートコードを書いている場合、簡単な解決策があります。同じ関数を呼び出す複数のショートコードを書くことができます。divなどのhtmlブロックを作成するためのショートコードがあり、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);
    ...
});

参照:ネストされたショートコードを有効にする最良の方法は何ですか? (ワードプレス SE)

見てるだけ:これはWordpressの問題を解決しないので、あなたの質問には答えません. 今までは修正されていると思っていました。

于 2012-11-01T19:37:29.157 に答える