如何使用pre_get_posts隐藏自定义Post类型类别


How to hide a custom Post Type Category using pre_get_posts

我的主题中有一个自定义的帖子类型,叫做公文包。它的类别称为项目类别。我正在尝试排除已登录成员的项目类别。我的第一个问题是,我能像引用普通帖子类别一样引用项目类别吗?

到目前为止,这是我的代码,但它不起作用。我已经通读了法典,但我想我遗漏了一些东西。预编码器

function exclude_category( $query ) {
    if ( is_user_logged_in() && $query->is_main_query() ) {
        $query->set( 'cat', '-94');
    }
}
add_action( 'pre_get_posts', 'exclude_category' );

以下是自定义帖子类型的分类

#-----------------------------------------------------------------#
# Taxonomy attached to portfolio 
#-----------------------------------------------------------------# 
$category_labels = array(
    'name' => __( 'Project Categories', NECTAR_THEME_NAME),
    'singular_name' => __( 'Project Category', NECTAR_THEME_NAME),
    'search_items' =>  __( 'Search Project Categories', NECTAR_THEME_NAME),
    'all_items' => __( 'All Project Categories', NECTAR_THEME_NAME),
    'parent_item' => __( 'Parent Project Category', NECTAR_THEME_NAME),
    'edit_item' => __( 'Edit Project Category', NECTAR_THEME_NAME),
    'update_item' => __( 'Update Project Category', NECTAR_THEME_NAME),
    'add_new_item' => __( 'Add New Project Category', NECTAR_THEME_NAME),
    'menu_name' => __( 'Project Categories', NECTAR_THEME_NAME)
);  
register_taxonomy("project-type", 
        array("portfolio"), 
        array("hierarchical" => true, 
                'labels' => $category_labels,
                'show_ui' => true,
                'query_var' => true,
                'rewrite' => array( 'slug' => 'project-type' )
));
$attributes_labels = array(
    'name' => __( 'Project Attributes', NECTAR_THEME_NAME),
    'singular_name' => __( 'Project Attribute', NECTAR_THEME_NAME),
    'search_items' =>  __( 'Search Project Attributes', NECTAR_THEME_NAME),
    'all_items' => __( 'All Project Attributes', NECTAR_THEME_NAME),
    'parent_item' => __( 'Parent Project Attribute', NECTAR_THEME_NAME),
    'edit_item' => __( 'Edit Project Attribute', NECTAR_THEME_NAME),
    'update_item' => __( 'Update Project Attribute', NECTAR_THEME_NAME),
    'add_new_item' => __( 'Add New Project Attribute', NECTAR_THEME_NAME),
    'new_item_name' => __( 'New Project Attribute', NECTAR_THEME_NAME),
    'menu_name' => __( 'Project Attributes', NECTAR_THEME_NAME)
);  
register_taxonomy('project-attributes',
    array('portfolio'),
    array('hierarchical' => true,
    'labels' => $attributes_labels,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array( 'slug' => 'project-attributes' )
));

我没有收到任何错误,但登录时不会排除该类别。
如有任何帮助,我们将不胜感激。感谢

更新:

我也试过这些没有运气

function exclude_category( $query ) {
    if ( is_user_logged_in() && $query->is_main_query() ) {
        $taxquery = array(
      array(
        'post_type' => 'portfolio',
        'taxonomy' => 'project-type',
        'field' => 'id',
        'terms' => array( 94 ),
        'operator' => 'NOT IN'
      )
    );
        $query->set( 'tax_query', $taxquery);
    }
}
add_action( 'pre_get_posts', 'exclude_category' );

这也是

function exclude_category( $query ) {
    if ( is_user_logged_in() && $query->is_main_query() ) {
        $taxquery = array(
      array(
        'post_type' => 'portfolio',
        'taxonomy' => 'project-type',
        'field' => 'slug',
        'terms' => 'preview',
        'operator' => 'NOT IN'
      )
    );
        $query->set( 'tax_query', $taxquery);
    }
}
add_action( 'pre_get_posts', 'exclude_category' );

添加tax_query参数。

function exclude_category( $query ) {
    if ( is_user_logged_in() && $query->is_main_query() ) {
        $taxquery = array(
        'taxonomy' => 'project-type',
        'field' => 'id',
        'terms' => array( 94 ),
        'operator' => 'NOT IN'
    );
        $query->set( 'tax_query', $taxquery);
    }
}
add_action( 'pre_get_posts', 'exclude_category' );

由于某种原因,它无法工作。我不知道这个主题是在创建一个新的查询还是什么。这是我用来解决这个问题的逻辑。我给了马克解决方案,因为从技术上讲,这是所问问题的解决方案,但以下是我处理问题的方式。

在无法通过wp查询解决问题后,我决定,由于内容已经使用groups插件进行了保护,我所需要做的就是从我的原始公文包中排除预览类别,然后创建一个预览公文包添加到我的网站导航中。从那里,我可以对登录的用户隐藏预览导航链接,然后真正的投资组合就已经对没有使用groups插件登录的用户进行了隐藏。以下是我实现目标的方法。

我通过自定义链接将预览组合添加到我的主菜单中。我选择了css类屏幕选项,并将登录导航的类添加到预览菜单链接中。

然后我将这个css添加到我的主题中,以对登录用户隐藏预览

.您的导航名称li.logged-in-nav{display:列表项;}

body.logged-in.您的导航名称li.logged-in-nav{display:none;}

用源代码中的菜单名称更改导航名称。然后我所做的就是用groups插件保护我的公文包部分,这样原始的公文包链接就不会显示给未登录的用户。因此,未登录的用户会看到预览链接,而不会看到原始链接,登录的用户则会看到原始公文包,而不会在导航中看到预览链接。

这只是一个关于如何通过wordpress限制登录用户的逻辑示例。希望它能帮助任何试图解决类似问题的人。