Php 如何使用pre_get_posts隐藏自定义帖子类型类别

Php 如何使用pre_get_posts隐藏自定义帖子类型类别,php,wordpress,Php,Wordpress,我在我的主题中有一个自定义的post类型,叫做portfolio。它的类别称为项目类别。我试图排除登录成员的项目类别。我的第一个问题是,我能否引用与普通职位类别相同的项目类别 这是我到目前为止没有工作的代码。我已经通读了法典,但我想我遗漏了一些东西 以下是自定义帖子类型的分类法 #-----------------------------------------------------------------# # Taxonomy attached to portfolio #-------

我在我的主题中有一个自定义的post类型,叫做portfolio。它的类别称为项目类别。我试图排除登录成员的项目类别。我的第一个问题是,我能否引用与普通职位类别相同的项目类别

这是我到目前为止没有工作的代码。我已经通读了法典,但我想我遗漏了一些东西

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

#-----------------------------------------------------------------#
# 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' );
给它添加参数

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类屏幕选项,并将登录nav的类添加到预览菜单链接中

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

.您的导航名li.logged-in-nav{display:list item;}

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

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


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

感谢您的快速响应标记。我想这肯定是我错过了什么,但我尝试了你的代码,类别仍然显示在登录时。我编辑了原始问题并添加了公文包分类法的代码,以查看其中是否有导致打嗝的原因。您试图排除的分类群的名称是什么?我试图排除向登录用户显示的特定项目类别。这就是我不确定的地方,我认为just Category是如何仅指博客文章类别的。项目类别的名称为Preview,id为94No,它仍在显示。嗯,我甚至尝试过项目类别,但它不起作用。我想通过使用id分类号,普通猫应该已经开始工作了。这就是我被难住的地方。我不知道它是否没有找到它,因为它是一个自定义的职位类型,以及如何进行调整。这是我想要排除的类别的url栏中的
wp admin/edit tags.php?action=edit&taxonomy=project type&tag\u ID=94&post\u type=portfolio
No不起作用,你确定更新了吗?看起来一样。
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' );