自定义 post 类型活动菜单项

Custom post type active menu item

我创建了一个名为“团队”的自定义 post 类型,并将 link 添加到 WP 菜单的存档页面。 一旦用户点击它,他就会看到所有团队成员,并且当前页面在菜单中突出显示。 但是当我点击个别团队成员时,他的页面打开并且菜单中的“团队”不再突出显示,应该是。

这是打开团队页面时的显示方式:

<li id="menu-item-17" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item active”>
<a href="http://localhost:8888/site/team/">Team</a>
</li>

这是我打开个人会员页面时在菜单中看到的内容:

<li id="menu-item-17" class="menu-item menu-item-type-custom menu-item-object-custom”>
<a href="http://localhost:8888/site/team/">Team</a>
</li>

由于我不是 PHP 开发人员,我不知道如何让它工作,任何建议将不胜感激:)

我从 here 获取并编辑了这个对我有用的东西。我 'bonsai' 将其更改为您的自定义 post 类型。在我放置 'menu-item-299' 的位置,将其更改为要突出显示的菜单项的 ID。

function change_page_menu_classes($menu)
{
    global $post;
    if (get_post_type($post) == 'bonsai')
    {
        $menu = str_replace( 'current-menu-item', '', $menu ); // remove all current_page_parent classes
        $menu = str_replace( 'menu-item-299', 'menu-item-299 current-menu-item', $menu ); // add the current_page_parent class to the page you want
    }
    return $menu;
}
add_filter( 'nav_menu_css_class', 'change_page_menu_classes', 10,2 );

如果您有问题请告诉我,因为它们可能会影响到我:)

可以用 functions.php 中的一个非常简单的过滤器来完成 请确保您在注册 CPT 或使用 register_post_type()

时使用了参数 has_archive => true
//ADDING AN ACTIVE CLASS TO THE CUSTOM POST-TYPE MENU ITEM WHEN VISITING ITS SINGLE POST PAGES
function custom_active_item_classes($classes = array(), $menu_item = false){            
        global $post;

        $classes[] = ($menu_item->url == get_post_type_archive_link($post->post_type)) ? 'current-menu-item active' : '';
        return $classes;
    }
add_filter( 'nav_menu_css_class', 'custom_active_item_classes', 10, 2 );

希望这对某人有所帮助,如果对您有帮助,请发表评论并投票。

没有get_post_type_archive_link函数的更简单的方法:

function custom_active_item_classes( $classes = [], $menu_item = false ) {
    global $post;

    $classes[] = ( in_array( 'menu-item-object-' . $post->post_type, $classes ) ) ? 'current-menu-item active' : '';

    return $classes;
}

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