将自定义 ul 注入到菜单中


Injecting a custom ul into a menu

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

    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>

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

一个快速而肮脏的黑客。它会(也许需要调整)工作,但你必须摆弄代码和法典(答案底部的参考),否则你不会再做一次了。

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 注入到最后一个(如果过滤器正在处理页面的主菜单元素)。

引用:

  • http://codex.wordpress.org/Function_Reference/add_filter
  • http://www.php.net/manual/en/function.preg-replace.php

补遗

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

它是一个正则表达式(请参阅有关它们的简单教程),它不仅限于 php,因为它存在于多种语言中。

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

preg_replace利用正则表达式来执行一些高级字符串操作。该正则表达式告诉引擎找到 字符串中的最后一个标签,即字符串结束之前的标签,字符串结尾之前是否有空格、制表符或换行符(但只有这组字符)并不重要。

我将剖析代码,希望它能对它有所了解。

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

当引擎在你的字符串中找到一块符合你给他的描述的字符块时,就会有一个匹配项,字符串的那部分将被赋予preg_replace的第二个参数所更改。

我刚刚触及了这个话题的表面,是否更深入取决于你。

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