2014-11-06 113 views
19

我正在使用初学者主题_Underscores创建自定义Wordpress主题。我也使用Bootstrap作为前端框架。如何添加“活动”类到wp_nav_menu()当前菜单项(简单方法)

我想修改wp_nav_menu,以便它指定当前菜单项class =“active”,而不是class =“current-menu-item”(默认值)。或者,也许至少分配这两个类。我需要这个以便使用bootstrap.css中的.active类。

这里是我有什么例子(所有这些类WP产生,请滚动到明白我的意思):

<ul id="menu-main-menu" class="nav navbar-nav"> 
    <li id="menu-item-14" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-13 current_page_item menu-item-14"><a href="">item1</a></li> 
    <li id="menu-item-12" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12"><a href="">item2</a></li> 
</ul> 

这里是我所需要的:

<ul id="menu-main-menu" class="nav navbar-nav"> 
    <li id="menu-item-14" class="active menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-13 current_page_item menu-item-14"><a href="">item1</a></li> 
    <li id="menu-item-12" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-12"><a href="">item2</a></li> 
</ul> 

我宁愿以正确的方式做到这一点 - 不想在..wp-includes/nav-menu-template.php中更改任何内容,当然也不希望使用js。


嗯,我找到了答案,只是发表了这个问题(这是所有准备好了,这就是为什么它仍然是形成一种方式,如果我仍然在寻求答案)之前,但我宁愿很难找到它所以我决定将它作为QA发布。我希望有人会觉得这很有用。

回答

58

只需将此代码粘贴到functions.php文件:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2); 

function special_nav_class ($classes, $item) { 
    if (in_array('current-menu-item', $classes)){ 
     $classes[] = 'active '; 
    } 
    return $classes; 
} 

更多关于wordpress.org:link1link2

+0

曾任职真棒。您是否有解决方案来跟踪子帖子?它适用于我的博客链接,但不适用于儿童帖子。 – OneMohrTime 2016-09-11 19:21:48

+0

简单而重要。我喜欢它。 – racl101 2016-10-02 03:23:21

+2

@OneMohrTime检查下面的其他答案。 – Unicornist 2017-08-04 15:19:25

8

要还强调该菜单项时,子页面的一个是积极的,也检查其他类(current-page-ancestor)象下面这样:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2); 

function special_nav_class ($classes, $item) { 
    if (in_array('current-page-ancestor', $classes) || in_array('current-menu-item', $classes)){ 
     $classes[] = 'active '; 
    } 
    return $classes; 
} 
0

除了以前的答案,如果你的菜单项分类的d你想通过帖子导航时,突出他们,还要检查current-post-ancestor

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2); 

function special_nav_class ($classes, $item) { 
    if (in_array('current-post-ancestor', $classes) || in_array('current-page-ancestor', $classes) || in_array('current-menu-item', $classes)){ 
     $classes[] = 'active '; 
    } 
    return $classes; 
} 
0

header.php插入这个代码来显示菜单:

<?php 
    wp_nav_menu(
     array(
      'theme_location' => 'menu-one', 
      'walker' => new Custom_Walker_Nav_Menu_Top 
     ) 
    ); 
?> 

functions.php使用这样的:

class Custom_Walker_Nav_Menu_top extends Walker_Nav_Menu 
{ 
    function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) { 
     $is_current_item = ''; 
     if(array_search('current-menu-item', $item->classes) != 0) 
     { 
      $is_current_item = ' class="active"'; 
     } 
     echo '<li'.$is_current_item.'><a href="'.$item->url.'">'.$item->title; 
    } 

    function end_el(&$output, $item, $depth = 0, $args = array()) { 
     echo '</a></li>'; 
    } 
} 
0

如果您想在html中使用'active':

头与HTML和PHP:

 <?php 
     $menu_items = wp_get_nav_menu_items('main_nav'); // id or name of menu 
     foreach ((array) $menu_items as $key => $menu_item) { 
      if (! $menu_item->menu_item_parent) { 
       echo "<li class=" . vince_check_active_menu($menu_item) . "><a href='$menu_item->url'>"; 
       echo $menu_item->title; 
       echo "</a></li>"; 
      } 
     } 
     ?> 

的functions.php:

function vince_check_active_menu($menu_item) { 
    $actual_link = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
    if ($actual_link == $menu_item->url) { 
     return 'active'; 
    } 
    return ''; 
} 
相关问题