我如何重写默认方式Wordpress'确定.current-menu-item类


How do I override the default way Wordpress' determines the .current-menu-item class?

很多人,无论是在SOW还是其他地方,都有我同样的问题。

我已经在我的网站上安装了BBpress插件。这个插件在网站上启用论坛。

我已经纠结了好几天了(没有用)在这个记录在案的问题上,当选择任何论坛子菜单项时,插件会导致错误的菜单项被突出显示。相反,Blog菜单项会默认高亮显示。

查看:点击论坛,这个结果页面突出显示了"论坛"菜单项。但是点击"测试论坛"(或向下钻到任何其他论坛项目),结果页面总是突出显示"博客"。

这是我目前所知道的:

  • 单靠CSS是无法解决的。
  • 我正在使用永久链接(选择"Post name")
  • PHP根据您导航到的页面为菜单项分配.current-menu-item和/或.current_page_item类(以及相应的-ancestor-parent类)。由于某些原因,它无法将任何论坛子菜单视为当前页面。因此,它默认为"Blog"作为当前页面项。
  • 所以我知道我需要做以下事情:
    1. 让Wordpress在每个页面加载时检查URL
    2. 如果"/forums/"是URL的一部分,删除所有.current-menu*.current_page*(通配符是清除祖先/父类所必需的)
    3. 然后将.current-menu-item.current_page_item类分配给"Forum"菜单项。

问题是,虽然我认为我已经接近了,但我不知道该怎么做。

我试过很多方法。

我找到了这个Jquery解决方案,但不知道如何实现它,我也不相信这种方法:

// First add a “forum-class” to your forums menu item in your custom menu 
// Then add this to your js file with YOURURL = the url of your site and forums = your forums slug : 
$(function() { 
    var forumURL = window.location.href.indexOf("YOURURL/forums/");
    if(forumURL > -1){
        $('li.forum-class').addClass('current-menu-item');
    }   
});
然后,我发现这种方法似乎更接近我想要的,但是它引入了一个新类,并且似乎没有从Blog菜单中清除不正确的类。另外,我不知道把这些代码放在哪里,或者在哪里创建js文件。
if (strtolower($thats_all->post_title) == "forum" || strtolower($thats_all->post_title) == "forums") {
    $addclass = ' class="current_page"';
} else {
    $addclass = '';
}

最后,我发现这是什么我认为我需要,但我有困难实现它(我试过把它粘在我的menu-primary.phpheader.php,但没有去)。

// this forces the class current-menu-item to a menu item which I named 'forums' 
add_filter('nav_menu_css_class', 'remove_link_parent_menu_classes', 420 ,3);
function remove_link_parent_menu_classes($classes, $item, $args){
if(strpos($item->url, '/forums/') !== true)
    return array_diff($classes, array('current_page_item', 'current-menu-item'));
return $classes;
}

我想我接近了。很接近。只需要朝正确的方向推一把。我需要知道:

  • 后一种解决方案是否有效?
  • 哪个文件,以及文件中的确切位置,我需要放置代码吗?

谢谢!

我终于破解了!根据上面的线索,我找到了适合我的代码。

add_filter( 'nav_menu_css_class', 'namespace_menu_classes', 10, 2 );
function namespace_menu_classes( $classes , $item ){
    if ( get_post_type() == 'forum' ) {
        $classes = str_replace( 'current_page_parent', '', $classes );
        $classes = str_replace( 'menu-item-16', 'current_page_parent', $classes );
    }
    return $classes;
}

function.php文件的末尾复制上述内容。

然后将'forum'更改为您选择的slug名称,并将'menu-item-16'替换为您想要突出显示的正确编号的菜单项(您需要使用web浏览器的开发人员工具来检查您的站点以能够找到此)。

我花了一个星期才弄明白(并且需要学习php)!祝你好运,希望这篇文章能帮助到其他所有人。