wp_get_nav_menu_items
是一个 WordPress 函数,用于获取特定导航菜单中的所有菜单项。这个函数通常用于在模板文件中自定义菜单的显示方式,而不是使用默认的 wp_nav_menu
函数。
函数定义
wp_get_nav_menu_items( $menu, $args = array() )
参数说明
-
$menu (必需)
- 类型:
int|string|WP_Term
- 说明: 菜单的 ID、名称或
WP_Term
对象。
- 类型:
-
$args (可选)
- 类型:
array
- 说明: 额外的参数数组。默认值为空数组。
- 类型:
返回值
返回一个 WP_Post
对象数组,每个对象代表一个菜单项。如果没有找到菜单项,则返回 false
。
示例代码
假设我们要获取 header-menu
菜单的所有菜单项,并自定义显示它们,可以使用以下代码:
<?php
$menu_name = 'header-menu'; // 菜单位置标识符
$menu_items = wp_get_nav_menu_items( $menu_name );
if ( ! empty( $menu_items ) ) {
echo '<ul class="custom-menu">';
foreach ( $menu_items as $item ) {
echo '<li class="menu-item">';
echo '<a href="' . esc_url( $item->url ) . '">' . esc_html( $item->title ) . '</a>';
echo '</li>';
}
echo '</ul>';
}
?>
详细解析
-
获取菜单项
$menu_items = wp_get_nav_menu_items( $menu_name );
- 通过
wp_get_nav_menu_items
函数获取菜单项。$menu_name
可以是菜单的位置标识符、菜单的名称或菜单的 ID。
- 通过
-
检查菜单项
if ( ! empty( $menu_items ) ) {
- 检查
$menu_items
是否为空,确保菜单中有项。
- 检查
-
循环输出菜单项
foreach ( $menu_items as $item ) { echo '<li class="menu-item">'; echo '<a href="' . esc_url( $item->url ) . '">' . esc_html( $item->title ) . '</a>'; echo '</li>'; }
- 使用
foreach
循环遍历$menu_items
,并输出每个菜单项。 esc_url( $item->url )
用于安全地输出菜单项的链接 URL。esc_html( $item->title )
用于安全地输出菜单项的标题。
- 使用
WP_Post
对象的属性
每个 WP_Post
对象代表一个菜单项,具有以下常用属性:
- ID: 菜单项的 ID。
- title: 菜单项的标题。
- url: 菜单项的链接 URL。
- menu_item_parent: 父菜单项的 ID。
- post_excerpt: 菜单项的描述。
- classes: 菜单项的 CSS 类(数组)。
- object_id: 菜单项关联的对象 ID(例如,页面或文章的 ID)。
- type: 菜单项的类型(例如,
post_type
、taxonomy
等)。
示例:获取和显示带有子菜单的菜单项
<?php
$menu_name = 'header-menu';
$menu_items = wp_get_nav_menu_items( $menu_name );
if ( ! empty( $menu_items ) ) {
$menu_list = '<ul class="custom-menu">';
$menu_list .= build_menu_items( $menu_items );
$menu_list .= '</ul>';
echo $menu_list;
}
function build_menu_items( $menu_items, $parent_id = 0 ) {
$html = '';
foreach ( $menu_items as $item ) {
if ( $item->menu_item_parent == $parent_id ) {
$html .= '<li class="menu-item">';
$html .= '<a href="' . esc_url( $item->url ) . '">' . esc_html( $item->title ) . '</a>';
// Check for child items
$child_items = build_menu_items( $menu_items, $item->ID );
if ( ! empty( $child_items ) ) {
$html .= '<ul class="sub-menu">' . $child_items . '</ul>';
}
$html .= '</li>';
}
}
return $html;
}
?>
详细解析
-
递归构建菜单项
build_menu_items
函数递归地构建菜单项,包括子菜单项。- 检查每个菜单项的
menu_item_parent
属性,以确定其父菜单项。
-
输出子菜单
- 如果一个菜单项有子菜单项,则递归调用
build_menu_items
函数,并将子菜单项包含在<ul class="sub-menu">
元素内。
- 如果一个菜单项有子菜单项,则递归调用
通过这种方式,您可以自定义菜单的显示方式,包括处理多级菜单结构。
评论区