所以我使用了一个很酷的小函数在我的菜单中呈现一个搜索栏。在这里查看:
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 & Click to Search" name="s" id="s" onfocus="if (this.value == ''Enter Text & Click to Search'') {this.value = '''';}" onblur="if (this.value == '''') {this.value = ''Enter Text & 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 个部分)是一个很好的起点。