Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Wordpress短码传递值数组_Php_Wordpress_Shortcode - Fatal编程技术网

Php Wordpress短码传递值数组

Php Wordpress短码传递值数组,php,wordpress,shortcode,Php,Wordpress,Shortcode,我正在创建一些WordPress短代码,目的是在一个页面上提供内部导航(一个页面有很多内容部分和它自己的菜单) 这就是我所拥有的: //menu function internal_menu($atts) { extract(shortcode_atts(array( 'href1' => '#jl1', 'href2' => '#jl2', 'href3' => '#jl3', 'href4' => '#jl4', ), $atts));

我正在创建一些WordPress短代码,目的是在一个页面上提供内部导航(一个页面有很多内容部分和它自己的菜单)

这就是我所拥有的:

//menu
function internal_menu($atts) {
  extract(shortcode_atts(array(
   'href1' => '#jl1',
   'href2' => '#jl2',
   'href3' => '#jl3',
   'href4' => '#jl4',
  ), $atts));
  return '<div id="internalPageMenu">
    <ul>
        <li><a href="' . $href1 . '"><i class="fa fa-bars"></i>link 1</a></li>
        <li><a href="' . $href2 . '">link 2</a></li>
        <li><a href="' . $href3 . '">link 3</a></li>
        <li><a href="' . $href4 . '">link 4</a></li>
    </ul>
    </div>';
}
add_shortcode('internal-menu', 'internal_menu');

//menu target
function internal_menu_target($atts) {
  extract(shortcode_atts(array(
   'id' => 'jl1',
   'text' => '',
   ), $atts));
   return '<h3 id="' . $id . '">' . $text . '</h3>';
}
add_shortcode('internal-menu-target', 'internal_menu_target');
我如何使菜单动态(不限于它可以拥有的项目数量)?例如,短代码是:

[internal-menu targets="jl1, jl2, jl3, jl4, jl5, ...etc..."]

foreach
将是您的答案。在我看来,这将是最容易和最干净的。在我给你一个代码示例之前,让我们分析一下你的代码,看看你所有的缺陷,以及我们将如何纠正它们

瑕疵
  • 永远不要使用
    extract()
    extract()
    动态创建有问题的变量。您无法正确地调试
    extract()
    (如果可以的话),因此,当调试失败时,您确实需要完成不必要的工作。由于这些原因,它被完全从核心和法典中删除。看见你应该有一个邪恶的列表,上面两个位置分别是
    query\u posts
    extract()
    ,我知道这两个有多糟糕

  • 您没有对输入数据进行清理和验证,这可能导致黑客将jquery注入到您的代码中,从而入侵您的站点永远不要信任来自用户端和URL的任何数据,它可能会被感染

  • 正如您已经知道的,从代码中可以看出,除了数组值之外,短代码不能使用,值必须是字符串。在您的情况下,我们需要从字符串值创建一个数组。同样,由于您不能信任用户不在逗号之前或之后使用空格,因此明智的做法是,建议删除所有空格(如果有),以便
    explode
    函数正确创建数组

  • 使用这种新方法,您需要确保字符串中的值顺序正确,并且字符串长度正确。否则,您将获得意外的输出

让我们来处理第一个短代码:(请注意:下面的所有代码都未经测试。可能有错误或语法错误)

内部菜单
内部菜单目标
问题: Wordpress短代码在可以传递的数据格式上有一些痛苦的限制

空格分隔的变量:
[shortcode a=“1 2”]

结果:
$atts=['a'='1',0='2']

“]”关闭短代码:
[shortcode b=[yay]]

结果:
$atts=['b'='[yay']

解决方案: 您可以使用
urlencode()
绕过此问题:

[shortcode atts=a=1+2&b=%5Byay%5D]

这样分析:

[internal-menu links=First+Link=#jl1&Second+Link=#jl2&Google=https://google.com]

[internal-menu-target text=Section+1 id=jl1]
parse_字符串($atts['atts',$atts);

结果:
$atts=['a'=>'12',b=>'[yay]']

这将为您提供所需的数组

现在,关于构建菜单:

等等

顺便说一句,如果您负责任地使用extract(),它是非常好的:

/* concatenates 3 words of wisdom into a polite policy direction
 *
 * @param $attr: hash of function args
 *          foo = the first word (Kindly)
 *          bar = the second word (ignore)
 *          baz = the third word (totalitarians)
 */

function excellent_policy($attr){
  $defaults=['foo'=>'Kindly', 'bar'=>'ignore', 'baz'=>'totalitarians'];
  extract((array)array_intersect_key($attr,$defaults)+$defaults);
  echo "$foo $bar $baz!";
}
这将以可读且可预测的方式将$foo、$bar和$baz从$attr导入本地范围,如果这些变量未被传递,则为它们提供默认值,并防止创建任何意外变量

使用语言功能有好的方法和坏的方法。禁止每个人使用语言功能,因为有人可能使用得不好,就像禁止每个人呼吸,因为有人可能试图吸入果冻一样。

我使用的简单方法:

[my param="key1=value1&key2=value2"]
在短代码回调中,只需执行以下操作:

parse_str( str_replace("&amp;", "&", $attrs['param']), $array);
// var_dump( $array );
[internal-menu-target id='1,2,3,4' text='text 1, text 2, text 3, text 4']
function internal_menu($atts) {
  // allow passing + and ] in the text of the links:
  parse_string($atts["links"],$links);

  // the defaults, verbatim from the question:
  if (!count($links)) $links=[
    'href1' => '#jl1',
    'href2' => '#jl2',
    'href3' => '#jl3',
    'href4' => '#jl4',
  ];

  foreach ($links as $text=>$href) $ul=."<li><a href=\"$href\">$text</a></li>";

  return '<div id="internalPageMenu"><ul>'.$ul.'</ul></div>';
}

add_shortcode('internal-menu', 'internal_menu');

//menu target

function internal_menu_target($atts) {
  // allow passing + and ] in the text:
  if (@$atts[text]) $atts['text']) = urldecode($atts['text']);

  // the defaults, verbatim from the question:
  $atts=array($atts)+['text'=>'','id'=>'jl1'];

  return '<h3 id="' . $link['id'] . '">' . $link['text'] . '</h3>';
}

add_shortcode('internal-menu-target', 'internal_menu_target');
[internal-menu links=First+Link=#jl1&Second+Link=#jl2&Google=https://google.com]

[internal-menu-target text=Section+1 id=jl1]
/* concatenates 3 words of wisdom into a polite policy direction
 *
 * @param $attr: hash of function args
 *          foo = the first word (Kindly)
 *          bar = the second word (ignore)
 *          baz = the third word (totalitarians)
 */

function excellent_policy($attr){
  $defaults=['foo'=>'Kindly', 'bar'=>'ignore', 'baz'=>'totalitarians'];
  extract((array)array_intersect_key($attr,$defaults)+$defaults);
  echo "$foo $bar $baz!";
}
[my param="key1=value1&key2=value2"]
parse_str( str_replace("&amp;", "&", $attrs['param']), $array);
// var_dump( $array );