current_shortcode()-現在使用されているショートコードを検出します


11

プラグインクラスで、公開データ用の単純なフィールドを提供したいと思います:メール、電話番号、Twitterなど。リストは拡張できます。

詳細については、GitHubのプラグインPublic Contact Dataを参照してください。

使い方を簡単にするために、入力しやすいショートコードも提供したいと思います。

  • [public_email]
  • [public_phone]
  • [public_something]

唯一の違いは2番目の部分です。ショートコードはエラーが発生しやすいので、これ以上の引数は必要ありません。そこで、プラグインクラスのすべてのフィールドに1つのショートコードハンドラーを登録します。

foreach ( $this->fields as $key => $value )
{
    add_shortcode( 'public_' . $key, array( $this, 'shortcode_handler' ) );
}

ここで、shortcode_handler()どのショートコードが呼び出されたかを知る必要があります。私の質問は、どうすればよいですか?

私の現在の回避策は別の関数です:

protected function current_shortcode()
{
    $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
    return $backtrace[3]['args'][0][2];
}

これは…のために働きthe_content()ます。しかし、エレガントでも堅牢でもありません。
私はを読みましたがwp-includes/shortcodes.php、今はそれをよりよくする方法がわかりません。


1
あなたは今私を好奇心旺盛にしています。これについては後で詳しく説明します。私はshortcodes.phpが単なる関数の集まりであることを知っています。OOPを使用して正しく記述されていれば、間違いなくcurrent_shortcodeクラス変数があり、すべてが簡単になったでしょう。私の知る限り、Wordpressはすべてのショートコードとコールバックを配列に格納するだけですが、コアファイルをハッキングせずに、処理中に各ショートコードを変数に格納する方法はあるのでしょうか。
ドウェインチャリントン

@toscho同意しました、それは本当に問題だと思います。ショートコードが行われる方法での改造(ウィジェットのようなより多くのOOPの採用)を念頭に置いてください。私はそれについて助けたいと思います、そして後でコアへのアップデートとしてこれを送ります。
Webord

@brasofiloそう、私はたった今それをやった。
fuxia

回答:


3

これはテストされていませんが、コールバック関数には引数の配列が$args提供されており、shortocodeで提供されるパラメーター(ある場合)を提供します。0番目のエントリには、使用されるショートコードの名前が含まれていることあります(などpublic_email)。時々私が意味するのは...

属性配列のゼロ番目のエントリ($ atts [0])には、ショートコードの正規表現と一致した文字列が含まれますが、それがコールバック名と異なる場合のみ、コールバック関数の3番目の引数として表示されます。

コーデックスを参照)。あなたの目的のために、など$atts[0]が含まれます。public_emailpublic_phone

function shortcode_handler($atts,$content=NULL){
     if(!isset($atts[0]))
         return; //error?

     switch($atts[0]):
         case 'public_email':
              //deal with this case
              break;
         case 'public_phone':
              //deal with this case
              break;
         case 'public_something':
              //deal with this case
              break;
     endswitch;   
}

ああ、覚えています。昔、似たようなことに遭遇しました。私の場合、これはショートコードハンドラの3番目の引数です。最初は$args、2番目$contentと最後はショートコードです!
fuxia

本当に?ショートコードはコールバック名 'shortcode_handler'とは異なります...で指定されていると思いました$args。しかし、それがあなたのために働くなら...:D。
スティーブンハリス

2

スティーブンハリスの回答に基づいて、私はすべてのハンドラーに3番目の引数(ショートコード名)を受け入れさせました。

/**
 * Handler for all shortcodes.
 *
 * @param  array  $args
 * @param  NULL   $content Not used.
 * @param  string $shortcode Name of the current shortcode.
 * @return string
 */
public function shortcode_handler(  $args = array (), $content = NULL, $shortcode = '' )
{
    $key = $this->current_shortcode_key( $shortcode );
    $args['print'] = FALSE;
    return $this->action_handler( $key, $args );
}

/**
 * Returns the currently used shortcode. Sometimes.
 *
 * @return string
 */
protected function current_shortcode_key( $shortcode )
{
    return substr( $shortcode, 7 );
}

私の質問にリンクされているプラ​​グインで実際にそれを見てください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.