current_shortcode()-检测当前使用的简码


11

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

有关详细信息,请参见GitHub上的插件Public Contact Data

为了简化用法,我还想提供易于输入的短代码:

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

唯一的区别是第二部分。我不想为简码提供更多参数,因为它们容易出错。因此,我为插件类中的所有字段注册了一个短代码处理程序:

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只将所有的短码和回调存储在一个数组中,我想知道是否有一种方法可以在处理过程中将每个短码存储到一个变量中,而又不会破坏核心文件?
Dwayne Charrington

@toscho同意,我认为这确实是一个问题,应该记住对短代码进行修改的方式(像Widgets那样包含更多的OOP)。我很乐意为您提供帮助,后来将其作为更新发送给Core。
Webord 2012年

@brasofilo对,我刚才做到了。
fuxia

Answers:


3

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

属性数组的第零个条目($ atts [0])将包含与短代码正则表达式匹配的字符串,但只有与回调名称不同的字符串,否则它将作为回调函数的第三个参数出现。

(请参阅食典)。为了您的目的,$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;   
}

啊,我记得,很久以前我也遇到过类似的情况。就我而言,它是短代码处理程序的第三个参数。第一个是$args,第二个是,$content最后一个是简码!
fuxia

真?简码与回调名称'shortcode_handler'有所不同...我以为它会在中给出$args。但是,如果这对您有用...:D。
Stephen Harris

2

基于斯蒂芬·哈里斯Stephen Harris)的答案,我让所有处理程序都接受了第三个参数,即简称:

/**
 * 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 );
}

在我的问题中链接的插件中查看实际运行情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.