我的回答为<body>
元素通过body_class
滤器这可能是对页面上的任何元素应用额外格式的最简单方法。添加的类包括wpse14430_products
, wpse14430_services
或wpse14430_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;
}