如何从“ADD_SHORT CODE”函数中提取变量?

时间:2014-04-14 作者:夏期劇場

在Wordpress中,假设我有一个自定义的短代码函数,如:

function foobar_func( $atts ){
    //whatever required processings here...
    $foo = "the value is foo!";
    $bar = "the value is bar!";
}
add_shortcode( \'myshortcode\', \'foobar_func\' );
//now .. echo the value of $foo here? <----------
如您所见,我如何从函数中获得变量的处理值?(如最后一行)

请问如何将变量从这个函数传递到外部?

1 个回复
SO网友:gmazzap

有很多方法可以做到这一点,一种可能是使用使用静态变量的函数。

然而,在您能够获得在短代码中设置的参数之前,必须先处理短代码。。。

function foobar_func( $atts = array(), $out = FALSE ){
   static $args = array(
     \'foo\' => \'default foo\',
     \'bar\' => \'default bar\'
   );
   if ( $out ) return $args;
   $args = shortcode_atts( $args, $atts, \'myshortcode\' );
   echo \'The value for "foo" argument set in shortcode is: \' . $args[\'foo\'] . \'<br>\';
   echo \'and the value for "bar" argument set in shortcode is: \' . $args[\'bar\'];
}
add_shortcode( \'myshortcode\', \'foobar_func\' );
以及after 如果已处理短代码,则可以在第二个参数设置为true的情况下,让所有参数再次调用函数:

$shortcode_args = foobar_func( NULL, TRUE );
如果调用before 处理短代码时,它始终返回默认值。

另一种可能更可靠的方法是触发自定义操作,并使用它来传递shortcode参数:

function foobar_func( $atts = array() ){
   $defaults = array(
     \'foo\' => \'default foo\',
     \'bar\' => \'default bar\'
   );
   $args = shortcode_atts( $defaults, $atts, \'myshortcode\' );
   echo \'The value for "foo" argument set in shortcode is: \' . $args[\'foo\'] . \'<br>\';
   echo \'and the value for "bar" argument set in shortcode is: \' . $args[\'bar\'];
   // custom action
   do_action( \'myshortcode_processed\', $args );
}
add_shortcode( \'myshortcode\', \'foobar_func\' );
然后钩住操作以获取参数并使用它们:

add_action( \'myshortcode_processed\', function( $shortcode_args ) {
  // do whatever you want with $shortcode_args
  var_dump( $shortcode_args );
});

结束

相关推荐

如何将一段代码放在DO_SHORTCODE()中的[Shortcode][/Shortcode]之间?

所以我想在一个“like lock”后面放一个帖子循环,该锁是由一个插件创建的,该插件使用短代码[to\\u like ID=“XX”]内容[[to\\u like]。但是我没有用插件阻止内容,而是得到了一个包含所有帖子永久链接的页面。所以我想我要问的是,如何将页面内容(即,显示帖子的模板中的循环)放在短代码中,使其被插件隐藏?这就是我现在得到的:foreach ( $posts as $post ) : setup_postdata( $post ); $content