【问题标题】:How to hide a custom Post Type Category using pre_get_posts如何使用 pre_get_posts 隐藏自定义帖子类型类别
【发布时间】:2014-04-28 21:57:25
【问题描述】:

我的主题中有一个名为投资组合的自定义帖子类型。它的类别称为项目类别。我正在尝试为登录成员排除项目类别。我的第一个问题是,我能否像普通帖子类别一样引用项目类别?

这是我目前没有工作的代码。我已经阅读了法典,但我认为我遗漏了一些东西。 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' );

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

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

    【讨论】:

    • 感谢马克的快速回复。我认为这肯定是我所缺少的,但我尝试了您的代码,登录时该类别仍然显示。我编辑了原始问题并添加了投资组合分类法的代码,以查看其中是否有导致打嗝。
    • 您要排除的分类群的名称是什么?
    • 我正在尝试排除特定的项目类别,使其不显示给已登录的用户。这就是我不确定看到我认为仅 Category 将仅引用博客文章类别的地方。项目类别名称为Preview,id为94
    • 不,它仍在显示。嗯,我什至用项目类别尝试过它,但它不起作用。我认为通过使用 id 类别编号,只是普通的 cat 应该可以开始使用。这就是我难住的地方。我不知道是否找不到它,因为它是自定义帖子类型以及如何进行调整。这是在我要排除的类别的网址栏中wp-admin/edit-tags.php?action=edit&taxonomy=project-type&tag_ID=94&post_type=portfolio
    • 没有没有用,你确定你更新了吗?看起来一样。
    【解决方案2】:

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

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

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

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

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

    body.logged-in .your-nav-name li.logged-in-nav { 显示:无; }

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-24
      • 2013-05-12
      • 1970-01-01
      • 2019-01-22
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多