CURRENT_SHORTCODE()-检测当前使用的短码

时间:2012-02-20 作者:fuxia

在插件类中,我想为公共数据提供简单的字段:电子邮件、电话号码、Twitter等。该列表可以扩展。

看到了吗plugin Public Contact Data 有关详细信息,请访问GitHub。

为了保持使用简单,我还想提供易于键入的短代码:

  • [public_email]
  • [public_phone]
  • [public_something]one 插件类中所有字段的快捷码处理程序:

    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, 但我现在不知道如何做得更好。

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

这是未经测试的,但回调函数提供了一个参数数组,$args 其中给出了shortocode提供的参数(如果有)。第0个条目有时包含所用短代码的名称(例如。public_email). 有时我的意思是。。。

attributes数组的第零个条目($atts[0])将包含与shortcode regex匹配的字符串,但前提是该字符串与回调名称不同,否则将显示为回调函数的第三个参数。

(请参见Codex). 为了你的目的$atts[0] 将包含public_email, public_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;   
}

SO网友:fuxia

基于Stephen Harris answer 我让我的catch-all处理程序接受第三个参数,即短代码名称:

/**
 * 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 );
}
在我问题中链接的插件中查看它的实际操作。

结束

相关推荐

How to execute a shortcode?

我有一个WordPress选项,可以存储一些数据,例如:<h1>Header</h1> <p>Paragraph</p> [shortcodesomething/] [shortcode]Contents[/shortcode] 我正在使用显示此选项的值echo get_option(\'my_option\'));.当然,短代码不起作用,我想知道如何迫使他们做他们应该做的事情?echo do_shortcode(get_o