将自定义ul注入菜单

时间:2012-06-01 05:35:35

标签: php html css wordpress menubar

所以我使用一个很酷的小函数在我的菜单中渲染一个搜索栏。在这里查看:

    function add_search_to_wp_menu ( $items, $args ) {
    if( 'main-menu' === $args -> theme_location ) {
$items .= '<li class="menu-item menu-item-search">';
$items .= '<form method="get" class="menu-search-form" action="' . get_bloginfo('home') . '/"><p><input class="text_input" type="text" value="Enter Text &amp; Click to Search" name="s" id="s" onfocus="if (this.value == \'Enter Text &amp; Click to Search\') {this.value = \'\';}" onblur="if (this.value == \'\') {this.value = \'Enter Text &amp; Click to Search\';}" /><input type="submit" class="my-wp-search" id="searchsubmit" value="search" /></p></form>';
$items .= '</li>';
    }
return $items;
}
add_filter('wp_nav_menu_items','add_search_to_wp_menu',10,2);

我没有成功 - 但它正在做这项工作。

所以唯一的问题是它出现在顶层:

<ul>
<li>Normal Item</li>
<li>OH LOOOK THE SEATCHBAR APPEARS HERE</li>
</ul>

问题是我需要在菜单中再显示几个步骤,即 - 这里:

<ul>
 <li>
   Normal Item
    <ul>
      <li>
           I want THE SEARCH to appear here
      </li>
   <ul>
 </li>
</ul>

不仅如此,我希望它出现在菜单中的最后一个<ul><li><ul><li>之后......

IE,如果我有一个包含3个普通项目的列表,这些项目都有自己的子项,那么一旦注入它就会像这样:

   <ul>
     <li>
       Normal Item1
     </li>
     <li>
       Normal Item2
     </li>
     <li>
       Normal Item3
     </li>
     <li>
       Normal Item
        <ul>
          <li>
           I want THE SEARCH to appear here
          </li>
       <ul>
     </li>
    </ul>

希望这是有道理的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

快速而肮脏的黑客攻击。它(可能需要调整)可以工作,但你必须摆弄代码和codex(在答案的底部引用),否则你将不会再次使用它。

function add_search_to_wp_menu_item ( $items, $args ) {
    $search_form = '<ul><li class="menu-item menu-item-search">'
                 . '<form method="get......./form>' // FILL IT WITH YOUR HTML
                 .'</li></ul></li>';
    if( 'main-menu' === $args -> theme_location ) {
        $items = preg_replace('/<\/li>\s*$/',$search_form,trim($items));
    }
    return $items;
}
add_filter('wp_nav_menu_items','add_search_to_wp_menu_item',10,2);

它应该工作,因为我不知道$ item参数的内容。

如果我猜对了,说明遗留函数的正确性,它是一个包含li列表的字符串(没有封闭ul)然后我将ul注入到最后一个(如果过滤器处理页面的主菜单元素。)

参考文献:

<强>附录

'/<\/li>\s*$/'是什么?

这是一个正则表达式(see an easy tutorial on them],它不仅限于php,因为它以多种语言存在。

准确地说,这本身就是一种语言。

preg_replace利用正则表达式让您执行一些高级字符串操作。正则表达式告诉引擎在字符串结束之前找到字符串中的最后一个标记,如果在字符串结尾之前有空格,制表符或换行符(但只是这组字符),则无关紧要。 / p>

我将剖析代码,希望它能为它提供一些启示。

  • 第一个和最后一个字符/是正则表达式封装,真正的正则表达式是<\/li>\s*$
  • 如果您在字符串中搜索文字/,则需要使用\对其进行转义。引擎不会认为它标志着正则表达式的结束。
  • 如果你逃避字符你给它们特殊含义\ s就是其中之一,并代表一个字符类(一组不同的字符)一个制表符,一个空格或一个新行。
  • *是一个数量修饰符,它改变了前一个字符的含义,表明它可以重复多次,其中有几个。我们说0或更多。
  • `$'是一个边界。它意味着字符串的结尾。

当引擎在你的字符串中找到符合你给出的描述的一大块字符时,就会有一个匹配,并且字符串的那一部分将被改为第二个参数给preg_replace。

我刚刚谈到这个话题的表面,你可以选择更深入或更深入。

我链接的教程(你需要阅读所有3部分)是一个很好的起点。