钩子文档

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.

  • menu int|string|WP_Term
    Desired menu. Accepts a menu ID, slug, name, or object.
  • menu_class string
    CSS class to use for the ul element which forms the menu.
    Default 'menu'.
  • menu_id string
    The ID that is applied to the ul element which forms the menu.
    Default is the menu slug, incremented.
  • container string
    Whether to wrap the ul, and what to wrap it with.
    Default 'div'.
  • container_class string
    Class that is applied to the container.
    Default ‘menu-{menu slug}-container’.
  • container_id string
    The ID that is applied to the container.
  • container_aria_label string
    The aria-label attribute that is applied to the container when it’s a nav element.
  • fallback_cb callable|false
    If the menu doesn’t exist, a callback function will fire.
    Default is 'wp_page_menu'. Set to false for no fallback.
  • before string
    Text before the link markup.
  • after string
    Text after the link markup.
  • link_before string
    Text before the link text.
  • link_after string
    Text after the link text.
  • echo bool
    Whether to echo the menu or return it. Default true.
  • depth int
    How many levels of the hierarchy are to be included.
    0 means all. Default 0.
    Default 0.
  • walker object
    Instance of a custom walker class.
  • theme_location string
    Theme location to be used. Must be registered with register_nav_menu() in order to be selectable by the user.
  • items_wrap string
    How the list items should be wrapped. Uses printf() format with numbered placeholders. Default is a ul with an id and class.
  • item_spacing string
    Whether 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.

User Contributed Notes

  1. Skip to note 2 content

    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 );