基于菜单更新Body类

时间:2013-09-13 作者:plankguy

我试图根据当前菜单项是否有子菜单项或是子菜单项向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 挂钩功能。将其设为全局变量?为所有这些创建一个类?

提前感谢!

1 个回复
最合适的回答,由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 需要打印的地方。

结束

相关推荐

Menus like a CMS

以下是一些内容的结构示例:Parent A -- Child A -- Child B Parent B -- Child C -- Child D Parent A 应链接到的内容Child A 和Parent B 应链接到的内容Child C. 除此之外,我不确定这是否应该完全由wordpress中的“菜单”来管理,或者它是否应该是Parent A 包含子页面的页面。唯一的问题是Parent A 不是真正的内容,只是链接到Child A.如果你需要一个真