web-dev-qa-db-ja.com

ネストされたショートコード検出

このコードに精通している場合

<?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
  }
?>

この Webサイトから。ただし、ネストされたショートコードでは機能しません。

誰かがそれを入れ子にされたショートコードのために機能させる方法を知っていますか?

4
meosoft

から: http://codex.wordpress.org/Shortcode_API#Limitations

ショートコードパーサは、それらのハンドラ関数がdo_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');

お役に立てれば。

8
Jeff Stieler

ちょっと推測。 get_shortcode_regex()は、登録されているショートコードに対してのみ機能します。ですから、あなたが "あなたの"ショートコードを登録していない場合に備えて、それは単純なショートコードでさえうまくいきません。ですから、登録しなかった場合は、これが最終的に問題の原因になっている可能性があります。

ショートコードの取り扱いは、 ショートコードAPI で指定されています。ショートコードの登録方法の例は、 add_shortcode()Codexページにあります。 も同様です。

function baztag_func($atts, $content=) {
    return "content = $content";
}
add_shortcode('baztag', 'baztag_func');

ネストされたコードの場合、Jeffはすでにこれがどのように機能するのか答えています。したがって、これは基本的に短いコードを追加する方法を示す小さな例です。 add_shortcode()を使用した後、get_shortcode_regex()は実際に登録されたショートコード名をカバーする正規表現を返します。そうでなければそれはちょうど一致しません。

3
hakre

ショートコードマッチングは不十分な方法で実装されています( shortcodes.php 、ll174)。基本的に、正規表現は、何が非正規言語であるべきかを記述するために使用されます(つまり、任意のネストを含むショートコード)。

実際には、

[a]
  [a]
  [/a]
[/a]

1行目の開始タグが3行目の終了タグと一致するように解析されます。明らかに、それは望ましい振る舞いにつながらない。

1
Raphael