0

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

    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>

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

4

1 回答 1

1

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

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*$/'

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

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

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

我将剖析代码,希望它能对它有所启发。

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

当引擎在您的字符串中找到符合您给他的描述的一大块字符时,就会有一个匹配项,并且该部分字符串将使用 preg_replace 的第二个参数进行更改。

我只是触及了这个话题的表面,你可以选择是否深入。

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

于 2012-06-01T07:44:29.357 回答