wp_nav_menu_objects
云策文档标注
概述
wp_nav_menu_objects 是一个 WordPress 过滤器钩子,用于在生成菜单 HTML 之前修改已排序的菜单项对象列表。它允许开发者动态调整菜单项,例如基于用户状态或条件移除特定项。
关键要点
- 钩子名称:wp_nav_menu_objects,在 wp_nav_menu() 函数中调用,用于过滤菜单项对象数组。
- 参数:接受两个参数:$sorted_menu_items(已排序的菜单项数组)和 $args(包含 wp_nav_menu() 参数的对象)。
- 用途:常用于条件性修改菜单,如根据用户登录状态、主题位置或菜单项属性来添加、移除或修改菜单项。
- 返回值:必须返回修改后的 $sorted_menu_items 数组,否则菜单将无法正确显示。
代码示例
function wpdocs_unset_menu_items( $menu_objects, $args ) {
if ( 'primary_menu' !== $args->theme_location ) {
return $menu_objects;
}
if ( is_user_logged_in() ) {
return $menu_objects;
}
$menu_items = array(
'Cart',
'Wishlist',
);
foreach ( $menu_objects as $key => $menu_object ) {
if ( ! in_array( $menu_object->title, $menu_items ) ) {
continue;
}
unset( $menu_objects[ $key ] );
}
return $menu_objects;
}
add_filter( 'wp_nav_menu_objects', 'wpdocs_unset_menu_items', 10, 2 );注意事项
- 确保在钩子函数中正确处理 $args 参数,例如检查 theme_location 以针对特定菜单操作。
- 修改菜单项时,注意保持数组结构,避免破坏菜单的排序或关联。
- 此钩子自 WordPress 3.1.0 版本引入,兼容性良好。
原文内容
Filters the sorted list of menu item objects before generating the menu’s HTML.
Parameters
$sorted_menu_itemsarray-
The menu items, sorted by each menu item’s menu order.
$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
$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );
Changelog
| Version | Description |
|---|---|
| 3.1.0 | Introduced. |
Skip to note 2 content
Muhammad Zohaib
You can use this hook to unset menu items. Below function is going to unset specific menu items for logged-out users.
function wpdocs_unset_menu_items( $menu_objects, $args ) { if ( 'primary_menu' !== $args->theme_location ) { return $menu_objects; } if ( is_user_logged_in() ) { return $menu_objects; } $menu_items = array( 'Cart', 'Wishlist', ); foreach ( $menu_objects as $key => $menu_object ) { if ( ! in_array( $menu_object->title, $menu_items ) ) { continue; } unset( $menu_objects[ $key ] ); } return $menu_objects; } add_filter( 'wp_nav_menu_objects', 'wpdocs_unset_menu_items', 10, 2 );