web-dev-qa-db-ja.com

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

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

詳しくはGitHubの plugin Public Contact Data をご覧ください。

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

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

唯一の違いは第二部です。ショートコードはエラーが発生しやすいため、これ以上の引数は必要ありません。だから私は私のプラグインクラスのすべてのフィールドにoneshortcodeハンドラを登録します。

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を読みましたが、今のところそれをどうやればよいのかわかりません。

10
fuxia

これはテストされていないですが、コールバック関数には引数の配列$argsが提供されています。 0番目のエントリにはに使用されるショートコードの名前が含まれています(例:public_email)。たまには….

属性配列の0番目のエントリ($ 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;   
}
1
Stephen Harris

Stephen Harris answer 私のキャッチオールハンドラにショートコードの名前である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 );
}

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

2
fuxia