web-dev-qa-db-ja.com

ショートコードAPI:ショートコードの正規表現にマッチした名前を取得する方法?

私はドキュメントに記述されていることを再現する方法を探しています: オーバーロードされたショートコードコールバック。

ドキュメントによると、$atts配列はショートコードRegExにマッチした文字列を含みます。 $atts内の位置は、コールバック名がショートコードと一致するかどうかによって異なります。次の例はドキュメントから抜粋したものです。

add_shortcode('foo','foo'); // two shortcodes referencing the same callback
add_shortcode('bar','foo');
  produces this behavior:
[foo a='b'] ==> callback to: foo(array('a'=>'b'),NULL,"foo");
[bar a='c'] ==> callback to: foo(array(0 => 'bar', 'a'=>'c'),NULL,"");

だから私はこのように私のショートコードを登録しました:

add_shortcode('foo', 'foo');
add_shortcode('bar', 'foo');
function foo($attributes, $content = null) {
    echo '<pre>';
    var_dump($attributes);
    echo '</pre>';
}

残念なことに、$ attributesは常に空で、ショートコードの名前を含んでいません(WP 4.0)。

これはドキュメントの誤りなのでしょうか、それともどこか間違っているのでしょうか。

1
Sven

私はあなたが[foo a='b']フィルタを通してショートコード[bar a='c']do_shortcodeを実行するのを忘れたと思います:

do_shortcode( '[foo a='b'] [bar a='c']' )

the_content()の出力はdo_shortcodeを通してフィルタリングされるので、代わりにそれをエディタに追加することができます。

コードを実行すると、$argumentsダンプに対して次のような出力が得られます。

array (size=1)
  'a' => string 'b' (length=1)

そして

array (size=1)
  'a' => string 'c' (length=1)

だからここに'0' => 'bar'の部分はありません。

しかし、現在のショートコードタグは、ショートコードコールバックの3番目パラメータから取得できます(最初に this で聞いたことがあります。 @ toschoで回答)

私はソースをチェックしたばかりで、do_shortcode_tag関数をチェックアウトすると以下のようになります。

// self-closing tag
return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, null,  $tag ) . $m[6];

$tagは、ショートコードタグを含む3番目のパラメータです。

だからあなたの場合あなたはあなたのコールバックを次のように変更することができます。

function foo( $attributes = array(), $content = null, $tag = '' ) {

    echo $tag; // current shortcode tag

    echo '<pre>';
    var_dump($attributes);
    echo '</pre>';
}

現在のショートコードタグに関する情報を取得します。

1
birgire

ショートコードコールバックは、ショートコード名を持つ3番目の引数を取得します。これについてのメモがドキュメントにあります。

2.9.2以降では、常に3番目の引数として表示されるようです。

add_shortcode('foo', 'wpse173855_shortcode');
add_shortcode('bar', 'wpse173855_shortcode');

function wpse173855_shortcode($atts, $content, $name)
{
    echo '<pre>';
    var_dump($name);
    echo '</pre>';
}

ソース を見ると、一致したショートコードが常に渡されることがわかります。

1
chrisguitarguy