wp_nav_menu_items
云策文档标注
概述
wp_nav_menu_items 是一个 WordPress 过滤器钩子,用于修改导航菜单的 HTML 列表内容。它允许开发者在菜单输出前动态添加、移除或调整菜单项,常用于自定义菜单功能。
关键要点
- 过滤器钩子:wp_nav_menu_items,用于过滤导航菜单的 HTML 列表内容。
- 参数:接受两个参数:$items(菜单项的 HTML 字符串)和 $args(包含 wp_nav_menu() 参数的对象)。
- 用途:可用于向特定菜单添加额外项目(如搜索表单、用户头像或登录链接),基于条件(如用户登录状态或菜单 ID)进行定制。
- 调用方式:通过 add_filter() 函数添加回调函数,优先级和参数数量可指定(如 10 和 2)。
代码示例
function add_search_form($items, $args) {
if( $args->theme_location == 'menu-1' ){
$items .= '<li><form role="search" method="get" action="' . home_url( '/' ) . '">'
. '<label><span class="screen-reader-text">' . _x( 'Search for:', 'label' ) . '</span></label>'
. '<input type="search" placeholder="Search …" value="' . get_search_query() . '" name="s" />'
. '<input type="submit" value="Search" />'
. '</form></li>';
}
return $items;
}
add_filter('wp_nav_menu_items', 'add_search_form', 10, 2);注意事项
- 确保在 functions.php 文件中添加代码,或使用代码片段插件,以避免直接修改主题文件。
- 使用 $args->theme_location 或 $args->menu 来指定目标菜单,需与注册的菜单位置或 ID 匹配。
- 回调函数必须返回修改后的 $items 字符串,否则菜单内容可能丢失。
原文内容
Filters the HTML list content for navigation menus.
Description
See also
Parameters
$itemsstring-
The HTML list content for the menu items.
$argsstdClass-
An object containing wp_nav_menu() arguments.
More Arguments from wp_nav_menu( … $args )
Array of nav menu arguments.
menuint|string|WP_TermDesired menu. Accepts a menu ID, slug, name, or object.menu_classstringCSS class to use for the ul element which forms the menu.
Default'menu'.menu_idstringThe ID that is applied to the ul element which forms the menu.
Default is the menu slug, incremented.containerstringWhether to wrap the ul, and what to wrap it with.
Default'div'.container_classstringClass that is applied to the container.
Default ‘menu-{menu slug}-container’.container_idstringThe ID that is applied to the container.container_aria_labelstringThe aria-label attribute that is applied to the container when it’s a nav element.fallback_cbcallable|falseIf the menu doesn’t exist, a callback function will fire.
Default is'wp_page_menu'. Set to false for no fallback.beforestringText before the link markup.afterstringText after the link markup.link_beforestringText before the link text.link_afterstringText after the link text.echoboolWhether to echo the menu or return it. Default true.depthintHow many levels of the hierarchy are to be included.
0 means all. Default 0.
Default 0.walkerobjectInstance of a custom walker class.theme_locationstringTheme location to be used. Must be registered with register_nav_menu() in order to be selectable by the user.items_wrapstringHow the list items should be wrapped. Uses printf() format with numbered placeholders. Default is a ul with an id and class.item_spacingstringWhether to preserve whitespace within the menu’s HTML.
Accepts'preserve'or'discard'. Default'preserve'.
Source
$items = apply_filters( 'wp_nav_menu_items', $items, $args );
Changelog
| Version | Description |
|---|---|
| 3.0.0 | Introduced. |
Skip to note 4 content
LebCit
Add HTML5 search form to a menu
Add this code to functions.php. You can completely modify the output, and style the form as you want.
Please, don’t forget to replace the theme_location !
For example, if the id of my menu was main-menu, I would write
if( $args->theme_location == 'main-menu' )Hope this will help.
function add_search_form($items, $args) { if( $args->theme_location == 'menu-1' ){ $items .= '<li class="menu-item">' . '<form role="search" method="get" class="search-form" action="'.home_url( '/' ).'">' . '<label>' . '<span class="screen-reader-text">' . _x( 'Search for:', 'label' ) . '</span>' . '<input type="search" class="search-field" placeholder="' . esc_attr_x( 'Search …', 'placeholder' ) . '" value="' . get_search_query() . '" name="s" title="' . esc_attr_x( 'Search for:', 'label' ) . '" />' . '</label>' . '<input type="submit" class="search-submit" value="'. esc_attr_x('Search', 'submit button') .'" />' . '</form>' . '</li>'; } return $items; } add_filter('wp_nav_menu_items', 'add_search_form', 10, 2);get_search_form()function like this:$items .= get_search_form( false );The false parameter is the echo. False return the markup as you can see in the docs of the function itselfSkip to note 5 content
arifktk
Add extra menu item to a WordPress Nav Menu
Using this code snippet, one can add an additional menu item to the end of a WordPress navigation menu. For example, here in this case I am adding a WooCommerce Login/Register link when a user is not logged in, and a My Account page link when a user is logged in.
add_filter( 'wp_nav_menu_items', 'add_extra_item_to_nav_menu', 10, 2 ); function add_extra_item_to_nav_menu( $items, $args ) { if (is_user_logged_in() && $args->menu == 303) { $items .= '<li><a href="'. get_permalink( get_option('woocommerce_myaccount_page_id') ) .'">My Account</a></li>'; } elseif (!is_user_logged_in() && $args->menu == 303) { $items .= '<li><a href="' . get_permalink( wc_get_page_id( 'myaccount' ) ) . '">Sign in / Register</a></li>'; } return $items; }How to use the above code?
Hope this helps someone 🙂
Skip to note 6 content
omartheman949
Used the following snippet to add a user avatar image as the last menu item. Had to use
$args->menu==='main-menu'rather than'primary'or id, as other examples did. Found this out finally by printing out$args->menuto the navbar, to see what that argument actually was.// register shortcode add_shortcode('bbwp_get_session', 'bbwp_get_session'); add_filter( 'wp_nav_menu_items', 'add_extra_item_to_nav_menu', 10, 2 ); function add_extra_item_to_nav_menu( $items, $args ) { if (is_user_logged_in() && $args->menu === 'main-menu') { $items .= '<li class="wt_menu_item_user_avatar"><a href="/my-account">' . get_avatar( $current_user->ID, 32 ) . '</a></li>'; } return $items; }