SHORTCODE_ATTS-一个URL变量不起作用

时间:2012-11-23 作者:manc

我开发了一个基于短代码的小插件。下面是一个简化版的代码,用于短代码本身:

function lishortcode($liatts) {
    extract(shortcode_atts(array(
        "li" => get_option(\'li\'),
    ), $liatts));
        foreach ($liatts as $key => $option) {
            $li[$key] = $option;
    }
    $lib=$li[URL];
  return $lib;
}
add_filter(\'widget_text\', \'do_shortcode\');
add_shortcode(\'LI\', \'LIshortcode\');
URL参数是在短代码中调用的5个变量之一。除了这个,其他的都能用。这有什么原因吗?以下两个短代码输出相同的URL:

[LI]
[LI URL="http://www.differenturl.com/somewhere"]

3 个回复
SO网友:Stephen Harris

首先,您正在使用extract / shortcode_atts 正确输入:

线路:

   extract(shortcode_atts(array(
        "li" => get_option(\'li\'),
    ), $liatts));
使用shortcode_atts 然后提取将returnarray中的每个键转换为自己的变量:例如。$li 在本例中。但你要继续使用$liatts 无论如何,这只是从短代码传递的属性,可以包含任何内容。也没有提供任何默认值。

从你的例子来看,你想做如下事情:

function lishortcode($liatts) {

  //Merge provide attributes with defaults. Whitelist attributes
  $atts = shortcode_atts(array(
             "url" => get_option(\'li\'), 
             "foo" => "bar"
           ), $liatts));

  /* Url is in $atts[\'url\']. Do something and then return something */

  return $atts[\'url\'];
}

add_filter(\'widget_text\', \'do_shortcode\');
add_shortcode(\'LI\', \'lishortcode\');
See Codex, - note shortcode_atts() 不仅为缺少的值提供默认值,还删除了所有未指定的属性。在上面的示例中,中仅存在“url”和“foo”属性$atts.

SO网友:Steve

function lishortcode($liatts) {
// $liatts here is an array( \'URL\' => "http://www.differenturl.com/somewhere" )

    extract(shortcode_atts(array("li" => get_option(\'li\'),), $liatts));
    // the extract() would convert the $liatts array to variables;
    // in this case $URL with a value of "http://www.differenturl.com/somewhere"


    // shortcode_atts() here filters the array $liatts before the extract
    // in this case you\'re telling it to filter out any key other than \'li\'
    // if no li key exists use the default value retrieved with the get_option() 
    // since your shortcode example doesn\'t contain a \'li\' you\'ll end up with a single 
    // value of $li with the default value from the get_option() call

    foreach ($liatts as $key => $option) {
            $li[$key] = $option;
    }

    // With the example provided there is no point to this foreach loop
    $lib=$li[URL];
  return $lib;
  // return the default value of $li[URL], assuming that it had a value.

}
我知道您在这里缩写了代码,但通过您提供的示例,我很难理解您想要实现什么。

另外,请仔细查看其他答案,以获得有关编写短代码函数的一些提示。

SO网友:s_ha_dum

如果启用调试--define(\'WP_DEBUG\',true); 在您的wp-config.php-- 您将看到,该短代码有几个地方出错。

首先,我应该说,当我尝试您的代码时,不会返回任何内容。我猜那是因为我的*_options 表,而您没有解释该键中的值。(顺便说一句,这是一个非常糟糕的关键字名称——太短太通用了)

我大胆猜测,问题就在这里:$lib=$li[URL]; 您没有在任何地方设置“URL”常量,因此PHP开始猜测。如果您希望这是您的短代码的URL属性,那么您就错了,主要是因为您的属性都是小写的。This happens whether you want it to or not:

重要提示-不要对$atts属性名称使用camelCase或大写$atts值在shortcode\\u atts(数组(\'attr\\u 1\'=>\'attr\\u 1 default\',/…等),$atts)处理过程中使用小写,因此您可能只需要使用小写。

我猜你想要的是$lib=$li[\'url\'];

结束

相关推荐

plugin shortcode output

我有一个使用此短代码的插件:[daisy]此短代码的html输出为:<a class=\"clickable\">Click Here</a> 如果我使用快捷码来触发插件,那么插件工作得很好。它也适用于此:<?php echo do_shortcode(\'[daisy]\'); ?>通常,它还应与<a class=\"clickable\">Click Here</a> 但它不起作用,链接出现了,但如果我点击它,什么都不会发生