我试图根据当前菜单项是否有子菜单项或是子菜单项向body标记添加一个类。通过添加自定义菜单wp_nav_menu
.
我迷上了wp_nav_menu_objects
通过过滤器,am成功检测当前活动菜单项是祖先菜单项还是子菜单项:
function has_submenu( $menu_items ) {
$current_id = 0;
foreach( $menu_items as $menu_item ) {
// Get the id of the current menu item
if( $menu_item->current ) {
$current_id = $menu_item->ID;
}
// if the current item has a child
if( $menu_item->menu_item_parent != 0 && $menu_item->menu_item_parent == $current_id ) {
$body_class = \'has-submenu\';
break;
}
// if the current item has an ancestor
if( $menu_item->current_item_ancestor ) {
$body_class = \'is-submenu\';
break;
}
}
return $menu_items;
}
add_filter( \'wp_nav_menu_objects\', \'has_submenu\', 10, 2 );
现在我面临的问题是如何过滤
body_class
要添加类??我创建了名为$body\\u class的变量,但我不确定是否要将其传递给
body_class
挂钩功能。将其设为全局变量?为所有这些创建一个类?
提前感谢!
最合适的回答,由SO网友:s_ha_dum 整理而成
正如@CharlesClarkson已经解释的那样,在输出发送到浏览器后,您不能用PHP修改页面输出。你的菜单当然是body_class
因为菜单必须在<body>
标签
我看到的唯一一个PHP解决方案是,除了上面的代码之外,还需要编辑主题模板(进行更改)。
如果你跑步wp_nav_menu
在<body>
标记,但使用输出缓冲来捕获内容,而不是打印内容,您尝试的操作可能会起作用。
您需要在<body>
标记,如下所示:
ob_start();
wp_nav_menu();
$my_captured_menu = ob_get_contents();
ob_end_clean();
在函数回调中,而不是像这样的行:
$body_class = \'has-submenu\';
您需要:
add_filter(
\'body_class\',
function($classes) {
$classes[] = \'has-submenu\'; // or \'is-submenu\'
return $classes;
}
);
当然,使用
echo $my_captured_menu
需要打印的地方。