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

时间:2014-04-28 21:57:26

标签: php wordpress

我的主题中有一个名为portfolio的自定义帖子类型。它的类别称为项目类别。我正在尝试为登录成员排除项目类别。我的第一个问题是,我是否能够将项目类别与普通的职位类别相同?

这是我到目前为止所使用的代码无效。我已阅读了手抄本,但我认为我遗漏了一些东西。 pre_get_posts Codex

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' );

2 个答案:

答案 0 :(得分:2)

为其添加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' );

答案 1 :(得分:0)

由于某种原因,它无法正常工作。我无法弄清楚主题是在创建新查询还是什么。所以这是我用来解决这个问题的逻辑。我给了标记解决方案,因为从技术上讲,这是问题的解决方案,但这里是我如何处理我的问题。

在无法通过wp查询解决问题之后我决定,因为内容已经使用groups插件保护了所有我需要做的就是从我的原始产品组合中排除预览类别,然后创建一个预览组合来添加到我的网站导航。然后,我可以从登录用户隐藏预览导航链接,然后真正的投资组合已经从未使用groups插件登录的用户隐藏。这就是我如何实现它。

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

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

  

.your-nav-name li.logged-in-nav {display:list-item; }

     

body.logged-in .your-nav-name li.logged-in-nav {display:none; }

使用源代码中的菜单名称更改您的nav-name。 然后我所做的就是使用群组插件保护我的投资组合部分,这样原始投资组合链接就不会显示给未登录的用户。因此,未登录的用户会看到“预览”链接,但看不到原始链接并登录,请参阅原始投资组合,但未在导航中看到预览链接。

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