在CPT中从博客索引中删除CURRENT_PAGE_PARENT NAV类

时间:2015-10-25 作者:Kevin Mamaqi

在浏览自定义帖子类型存档页面和自定义帖子类型帖子时,我试图从博客索引菜单项中删除当前的\\u page\\u父类(我有一个显示所有博客帖子的自定义页面,它在菜单中)。

我发现了类似的问题,但我不知道如何解决。此外,在浏览custom\\u post\\u类型时,我没有当前的\\u page\\u父级(我想这是相关的)。

4 个回复
最合适的回答,由SO网友:Milo 整理而成

您可以使用nav_menu_css_class 筛选以从菜单项中添加或删除类。每个单独的菜单项都将应用此筛选器。一个类数组和菜单项对象将传递给函数,您将return 希望菜单项具有的类的数组。

PHP的array_diff 可以用于删除类,添加项可以通过以下方式完成:通过将类名附加到数组中$classes[] = \'some-class-name\'. 您可以使用Conditional Tags 检查当前查看的页面类型,以确定需要添加或删除的内容。

下面是一个快速示例,用于检查当前查看的页面是存档还是该类型的单个帖子your-post-type, 菜单项名称为Blog. 如果满足这些条件,则current_page_parent 类将从该菜单项的类数组中删除。您可以根据需要对其进行添加或调整。

function wpdev_nav_classes( $classes, $item ) {
    if( ( is_post_type_archive( \'your-post-type\' ) || is_singular( \'your-post-type\' ) )
        && $item->title == \'Blog\' ){
        $classes = array_diff( $classes, array( \'current_page_parent\' ) );
    }
    return $classes;
}
add_filter( \'nav_menu_css_class\', \'wpdev_nav_classes\', 10, 2 );

SO网友:richk

目前的答案很好,但它假设博客导航项的标题是“博客”。如果用户在WordPress中修改导航项目,这可能会导致问题。以下代码是通用的,因为它将导航项目的页面id与WordPress选项中存储的博客的页面id进行比较。

function my_custom_post_type_nav_classes( $classes, $item ) {
    $custom_post_type = \'custom-post-type\';
        if( ( is_post_type_archive( $custom_post_type) || is_singular( $custom_post_type ) )
        && get_post_meta( $item->ID, \'_menu_item_object_id\', true ) == get_option( \'page_for_posts\' ) ){
            $classes = array_diff( $classes, array( \'current_page_parent\' ) );
        }
        return $classes;
    }
    add_filter( \'nav_menu_css_class\', \'my_custom_post_type_nav_classes\', 10, 2 );

SO网友:GDY

好的,这两个答案都不是很优雅,因为您必须手动输入CPTs名称。下面是一个简单的插入片段。它几乎是从here 这是该网站的荣誉。

This snippet removes the current_page_parent class of the blog menu item:

add_filter( \'nav_menu_css_class\', \'theme_remove_cpt_blog_class\', 10, 3 );

function theme_remove_cpt_blog_class( $classes, $item, $args ) {


    if( !is_singular( \'post\' ) AND !is_category() AND !is_tag() AND !is_date() ):

        $blog_page_id = intval( get_option( \'page_for_posts\' ) );

        if( $blog_page_id != 0 AND $item->object_id == $blog_page_id )
            unset( $classes[ array_search( \'current_page_parent\', $classes ) ] ); 

    endif;


    return $classes;


}
虽然主要不是问这个问题,但我认为在大多数情况下,当从博客菜单项中删除类时,您希望一个类突出显示CPTs存档菜单项,所以这里也有一个片段。

This snippet adds a current_page_parent class on the archive menu item of a CPT:

add_action( \'nav_menu_css_class\', \'theme_add_cpt_ancestor_class\', 10, 3 );

function theme_add_cpt_ancestor_class( $classes, $item, $args ) {


    global $post;


    $current_post_type = get_post_type_object( get_post_type( $post->ID ) );
    $current_post_type_slug = $current_post_type->rewrite[ \'slug\' ];

    $menu_slug = strtolower( trim( $item->url ) );

    if( strpos( $menu_slug, $current_post_type_slug ) !== false )
        $classes[] = \'current_page_parent\';


    return $classes;


}

SO网友:blogob

我构建了自定义模板页面,而不是使用自定义的post类型归档默认页面。我也面临着这个问题。当我在自定义模板页面上,或者在CPT单页中时,我的博客菜单项被高亮显示,好像有博客页面的所有子项。

我最终使用了GDY提到的函数,效果非常好。非常感谢。

但我仍然不明白为什么会突然,以及代码中的什么使博客菜单项在自定义页面或CPT上突出显示。

有人知道答案吗?

相关推荐

Add extra markup to WP menus

我被要求将一个HTML网站重新开发为一个WP主题,它有一个非常高级的菜单结构,我不太确定如何复制它。第二个菜单项有一个子菜单,但它不仅仅是“li”中的“ul”,还有额外的div等。。因为下拉列表有3列布局,其中2列包含子链接,第3列包含内容。这是一个示例:<ul class=\"nav navbar-nav three\"> <li class=\"dropdown yamm-fw\"> <a href=\"#\" class=\"dropdown-toggl