$args
, 第二个参数传递给wp_nav_menu_objects
可用于检查正在处理的菜单。这将允许我们仅针对所需的菜单。
在下面的代码中,我们检查菜单的slug是否main
如果是这样,请将顶级菜单项包装在span标记中。
/**
* Filters the sorted list of menu item objects before generating the menu\'s HTML.
*
* @param array $sorted_menu_items The menu items, sorted by each menu item\'s menu order.
* @param stdClass $args An object containing wp_nav_menu() arguments.
*/
add_filter( \'wp_nav_menu_objects\', \'wpse_wp_nav_menu_objects\', 10, 2 );
function wpse_wp_nav_menu_objects( $sorted_menu_items, $args ) {
// Only modify the "main" menu.
if ( ! isset( $args->menu->slug ) || \'main\' !== $args->menu->slug ) {
return $sorted_menu_items;
}
// Loop over the menu items wrapping only top level items in span tags.
foreach ( $sorted_menu_items as $item ) {
if ( ! $item->menu_item_parent ) {
$item->title = \'<span>\' . $item->title . \'</span>\';
}
}
return $sorted_menu_items;
}
从技术上讲,上面的过滤器将对所有菜单运行,但随着我们的签入到位,它将只影响所需的菜单。
是否wp_nav_menu_objects
是否是最好的过滤器还有待讨论,但我认为这很适合解决手头的问题。这当然比使用一个更晚的过滤器要好,例如wp_nav_menu_items
, wp_nav_menu_{$menu->slug}_items
, 或wp_nav_menu
这需要解析菜单的HTML。