如何将当前菜单项、父菜单项和祖先菜单项ID添加到BODY_CLASS()?

时间:2011-11-09 作者:David O\'Sullivan

(刚刚被推荐从堆栈溢出中发布此内容…)

我刚从Wordpress(从Joomla叛逃)开始学习——起步有点困难。

我正在尝试做的一件事是制作一个自定义插件,允许用户根据活动菜单项向站点添加自定义背景。

所以我要做的是获取活动菜单id(如添加到导航li的“menu item xx”)和活动父菜单id,以便我可以将它们添加到body类中。

这是我可以从Wordpress内置的任何东西中获得的东西,还是我需要为其定制的东西?

任何最受欢迎的指针。。。

UPDATE

我现在用一个自定义函数解决了这个问题,您可以找到below

4 个回复
SO网友:helenhousandi

根据我之前的评论:使用body_class() 在您的header.php 文件或身体标签所在的任何位置,例如。<body <?php body_class(); ?>>. 这将为您提供一个在主体上包含一组类的输出,然后您可以在CSS中使用这些类。例如<body class="page page-id-114 page-parent page-template-default logged-in admin-bar">. 您还可以使用body_class 筛选以添加更多类。例如,如果要添加slug,可以global $post 然后使用$post->post_name.

SO网友:David O\'Sullivan

好的,我已经使用了一个函数来实现这一点。我刚开始使用WordPress,所以我不确定这段代码的质量或效率。但这里是:-

function get_active_menu_item_ids( $classes )
{   
//set up defaults for menu retrieval
$dosmenudefaults = array( \'menu\' => \'\', \'container\' => \'div\', \'container_class\' => \'\', \'container_id\' => \'\', \'menu_class\' => \'menu\', \'menu_id\' => \'\',
\'echo\' => true, \'fallback_cb\' => \'wp_page_menu\', \'before\' => \'\', \'after\' => \'\', \'link_before\' => \'\', \'link_after\' => \'\', \'items_wrap\' => \'<ul id="%1$s" class="%2$s">%3$s</ul>\',
\'depth\' => 0, \'walker\' => \'\', \'theme_location\' => \'\' );

$dosargs = wp_parse_args( $dosargs, $dosmenudefaults );
$dosargs = apply_filters( \'wp_nav_menu_args\', $dosargs );
$dosargs = (object) $dosargs;

// Get the nav menu based on the requested menu
$dosmenu = wp_get_nav_menu_object( $dosargs->menu );

// Get the nav menu based on the theme_location
if ( ! $dosmenu && $dosargs->theme_location && ( $doslocations = get_nav_menu_locations() ) && isset( $doslocations[ $dosargs->theme_location ] ) )
    $dosmenu = wp_get_nav_menu_object( $doslocations[ $dosargs->theme_location ] );

// Get the first menu that has items if we still can\'t find a menu
if ( ! $dosmenu && !$dosargs->theme_location ) {
    $dosmenus = wp_get_nav_menus();
    foreach ( $dosmenus as $dosmenu_maybe ) {
        if ( $dosmenu_items = wp_get_nav_menu_items($dosmenu_maybe->term_id) ) {
            $dosmenu = $dosmenu_maybe;
            break;
        }
    }
}

// If the menu exists, get its items.
if ( $dosmenu && ! is_wp_error($dosmenu) && !isset($dosmenu_items) )
    $dosmenu_items = wp_get_nav_menu_items( $dosmenu->term_id );    
$dosmenu = $dosmenu_items;

// Get the $menu_item variables
 _wp_menu_item_classes_by_context( $dosmenu );

 //create empty parents array
 $dosparents = array();

 //Iterate through the menu items and get the active item and its parent items
 foreach ($dosmenu as $dosmenuitem)
    {
    if ($dosmenuitem->current == \'1\')
        {
        $dosactivemenuids[\'current\']= $dosmenuitem->ID;
        }
    if (($dosmenuitem->current_item_parent == \'1\')||($dosmenuitem->current_item_ancestor == \'1\'))
        {
        $dosparents[$dosmenuitem->menu_order] = $dosmenuitem->ID;
        }
    if(is_array($dosparents))
        {
        krsort($dosparents);
        foreach ($dosparents as $key =>$value)
            {
            $dosactivemenuids[\'parents\'][$key]= $value;
            }
        }
     }
//return $dosactivemenuids;
if (is_array($dosactivemenuids[\'parents\']))
    {
    foreach ( $dosactivemenuids[\'parents\'] as $key=>$value)
        {
        $classes[] = \'menu-item-\'.$value;
        }
    }
if ($dosactivemenuids[\'current\'] != \'\')
    {
    $classes[] = \'menu-item-\'.$dosactivemenuids[\'current\'];
    }

return $classes;
}
您可以将其添加到模板的函数中。php’以及函数后面的某个地方添加一个过滤器来调用它:-

add_filter( \'body_class\', \'get_active_menu_item_ids\');

What this does?

这样做的目的是获取活动菜单ID,并按升序将其添加到body类中

Why would I need this?

来自CMS背景,我习惯了菜单定义的页面。使用此功能,活动菜单项id和/或其父项id将添加到body类中,以便您可以基于活动菜单项添加页面范围的样式。例如,您可能有如下菜单结构:-

->菜单项-1

->菜单项2

->->菜单项3

如果您正在查看“menu-item-3”页面,则使用此功能,类“menu-item-2”和“menu-item-3”将按此顺序添加到body标记中。这意味着您可以有一个针对body的css规则。menu-item-3可以返回到正文中的父项规则。菜单项-2,如果两者都没有样式,则最终为正文。例如,我使用它的目的是为整个页面(正文)设置默认背景色,当菜单项2处于活动状态时(正文。菜单项2)为整个页面设置背景色,当菜单项3处于活动状态时(正文。菜单项3)为页面设置不同的背景色。

希望能帮助别人;)

SO网友:Sagive

我已经尝试获取页面slug,但它在wp\\u head中似乎是空的,但您可以获取页面id并将其分配给body类,如下所示:

add_action(\'wp_head\', \'bodyclassReplacer\');
function bodyclassReplacer() {

    global $wp_query;
    $thePostID = $wp_query->post->ID;
    echo str_replace(\'<body>\', \'<body class="page\'. $thePostID .\'">\', \'<body>\');
}

获得类后,可以使用css指定背景,如下所示:

body.page6 {
    background:url("images/background6.png") no-repeat;
}
<附:找到解决方案很有趣:)-希望这能有所帮助,
干杯,萨吉夫

.至于动态菜单突出显示,下面是一个代码:

add_filter( \'nav_menu_css_class\', \'additional_active_item_classes\', 10, 2 );

function additional_active_item_classes($classes = array(), $menu_item = false){

    if(in_array(\'current-menu-item\', $menu_item->classes)){
        $classes[] = \'active\';
    }

    return $classes;
}

SO网友:David O\'Sullivan

好吧,我的最后一次投篮是在不久前,我还是一个新手——我现在看到了这一点,这很尴尬!我当时真的没有得到Wordpress!

这就是你需要的。。。

function ics_get_active_menu_item_ids(){
$menus = wp_get_nav_menus();
$menu_menu_items = array();
$current_menu_items = array();
$current_menu_items[\'parents\'] = array();
$current_menu_items[\'ancestors\'] = array();
foreach($menus as $menu)
    {
    $menu_menu_items[] = wp_get_nav_menu_items($menu->term_id);
    }
foreach ($menu_menu_items as $menu_items)
    {
    foreach($menu_items as $menu_item)
        {
        if ($menu_item->current == 1)
            {
            $current_menu_items[\'current\'] = $menu_item->ID;
            }
        if ($menu_item->current_item_parent == 1)
            {
            $current_menu_items[\'parents\'][] = $menu_item->ID;
            }
        if ($menu_item->current_item_ancestor == 1)
            {
            $current_menu_items[\'ancestors\'][] = $menu_item->ID;
            }
        }
    }
    $current_menu_items[\'parents\'] = array_values(array_unique($current_menu_items[\'parents\']));
    $current_menu_items[\'ancestors\'] = array_values(array_unique($current_menu_items[\'ancestors\']));
return  $current_menu_items;
}
返回当前项目id以及父项和父项;)

结束

相关推荐

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