次要的css-根据顶层菜单更改-如何更改?

时间:2011-04-10 作者:user4569

我想根据顶部(根)菜单的选择对css进行一些小的更改。

在WP中处理这个问题的正确方法是什么?

//编辑//这是一个网站(页面),没有博客,基本上,一些链接和一些图像的颜色应该取决于选择的顶部菜单项。

页面结构示例:

* Start
* Products
  * Prod.categ.
    * A product
* Services
  * List of services
    * Nested
* Contact
  * Main office
    * List of staff
  * Abroad
    * Another list
顶层位于topmenu、one level和level2&;中;3在嵌套的左侧菜单中。现在,侧菜单中的次要彩色项目会根据所选的顶部菜单项进行更改。

//结束编辑//

问候,/t

2 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

我的回答为<body> 元素通过body_class 滤器这可能是对页面上的任何元素应用额外格式的最简单方法。添加的类包括wpse14430_products, wpse14430_serviceswpse14430_contact (基于示例中顶部页面的段塞)。

使用wp_nav_menu()

如果使用wp_nav_menu() 要显示菜单,WordPress会构建菜单项树。我们可以使用此信息获取当前项目的首页。唯一的问题是:我们需要它<body> 标记,因此在呈现菜单之前。解决方案是将菜单保存在一个变量中,稍后我们将自己响应该变量。

以210主题为例,我移动wp_nav_menu() 呼叫第一个<?php 街区:

$wpse14430_menu = wp_nav_menu( array(
    \'container_class\' => \'menu-header\',
    \'theme_location\' => \'primary\',
    \'echo\' => false,
) );
在我们以前称之为的地方,我们现在回显保存的输出:

echo $wpse14430_menu;
wp_nav_menu() 有一个有趣的过滤器,称为after the menu items are ordered and have their classes. 这些类已经包含祖先信息。我们钩住这个过滤器,找到第一个是当前项目或其祖先的项目:

add_filter( \'wp_nav_menu_objects\', \'wpse14430_wp_nav_menu_objects\' );
function wpse14430_wp_nav_menu_objects( $sorted_menu_items )
{
    // The items are in menu order, so the first match is the top item
    foreach ( $sorted_menu_items as $menu_item ) {
        if ( $menu_item->current || $menu_item->current_item_ancestor ) {
            $GLOBALS[\'wpse14430_top_page\'] = get_post( $menu_item->object_id );
            break;
        }
    }
    return $sorted_menu_items;
}
现在我们看到了首页,只需将其添加到body类:

add_filter( \'body_class\', \'wpse14430_body_class_menu\' );
function wpse14430_body_class_menu( $body_class )
{
    if ( isset( $GLOBALS[\'wpse14430_top_page\'] ) ) {
        $body_class[] = \'wpse14430_\' . $GLOBALS[\'wpse14430_top_page\']->post_name;
    }
    return $body_class;
}
如果不使用,则使用页面作为菜单结构wp_nav_menu() 但是,您也可以使用页面的直接排序来检查祖先。请记住,如果不使用新菜单系统定义菜单,但仍通过以下方式显示页面列表wp_nav_menu() (回退功能),上述系统将适用于您。

add_filter( \'body_class\', \'wpse14430_body_class_pages\' );
function wpse14430_body_class_pages( $body_class )
{
    if ( is_page() ) {
        $null = null;
        $top_page = get_post( $null );
        $ancestors = get_post_ancestors( $top_page );
        if ( $ancestors ) {
            $top_page = get_post( array_pop( $ancestors ) );
        }
        $body_class[] = \'wpse14430_\' . $top_page->post_name;
    }
    return $body_class;
}

SO网友:Mark

如果使用wp\\U list\\U页面/类别或内置菜单生成器输出菜单,则会为每个页面或类别链接指定一个可设置样式的类。这意味着用户所在的当前页面或cat将有一个类,您可以将其样式设置为“活动”

父页链接将显示:

当前\\u page\\u项或当前菜单项(顶层活动时)当前\\u page\\u祖先或当前菜单祖先(第一个子活动时)

类别链接将显示:

当前cat(顶层激活时)当前cat父级(第一个子级激活时)

根据深度,WP会自动将其他类插入菜单项的li标记中。

我想这就是你想要做的,所以我希望这会有所帮助。

结束

相关推荐

Menu API not switching menus?

我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph