限制特定用户组的类别及其子类别

时间:2019-01-23 作者:Kiki

是否可以限制类别,以便组列表中的用户根本看不到这些帖子?甚至在帖子列表中都没有?

我用的是这里的答案:

Only show category to certain user levels without plugin

我的代码:

###########

// restrikcija posameznih kategorij za grupo ki je subscriber
// source: https://wordpress.stackexchange.com/questions/113500/only-show-category-to-certain-user-levels-without-plugin
add_filter(\'template_include\', \'restict_by_category\');

function check_user() {
    $user = wp_get_current_user();
    $restricted_groups = array( \'company1\', \'company2\', \'company3\', \'subscriber\' ); // categories subscribers cannot see
    if ( ! $user->ID ||  array_intersect( $restricted_groups, $user->roles ) ) {
        // user is not logged or is a subscriber
        return false;
    }
    return true;
}

function restict_by_category( $template ) {
    if ( ! is_main_query() ) {
        return $template; // only affect main query.
    }
    $allow = true;
    $private_categories = array( \'podjetje\', \'personal\', \'nekategorizirano\', \'razno\', \'sola-2\' ); // categories subscribers cannot see
    if ( is_single() ) {
        $cats = wp_get_object_terms( get_queried_object()->ID, \'category\', array(\'fields\' => \'slugs\') ); // get the categories associated to the required post
        if ( array_intersect( $private_categories, $cats ) ) {
            // post has a reserved category, let\'s check user
            $allow = check_user();
        }
    } elseif ( is_tax(\'category\', $private_categories) ) {
        // the archive for one of private categories is required, let\'s check user
        $allow = check_user();
    }
    // if allowed include the required template, otherwise include the \'not-allowed\' one
    return $allow ? $template : get_home_url(); //get_template_directory() . \'/not-allowed.php\';
}

###########
问题是,用户仍然可以在帖子列表中看到帖子,但当点击它时,它的内容是空的(这没关系,但更好的是它根本看不到帖子)。

还有,如果我有一个主类别和许多子类别,是否也可以限制所有这些子类别?

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

代码的问题是,您根本没有以任何方式修改查询,所以站点上的所有查询仍然会收到这些帖子,所以它们在列表中可见。之后,您可以使用template_include 过滤器,允许您重定向单个帖子视图和单个类别存档,如果它对于给定用户不可见。。。在这种情况下,重定向到主页也不是最好的-它可能会让用户感到困惑。。。

那么,如何正确隐藏这些帖子,让用户根本看不到它们呢?

您应该使用pre_get_posts 滤器通过这种方式,您可以检查当前用户是否可以看到这些帖子并隐藏它们,如果他不应该这样做的话。

function check_user() {
    if ( ! get_current_user_id() ) {  // this way you won\'t get notices when user is not logged in
        return false;
    }

    $user = wp_get_current_user();
    $restricted_groups = array(\'company1\', \'company2\', \'company3\', \'subscriber\'); // categories subscribers cannot see
    if ( array_intersect( $restricted_groups, $user->roles ) ) {
        // user is a subscriber or restricted user
        return false;
    }
    return true;
}

function restrict_users_categories( $query ) {
    if ( ! is_admin() ) {
        if ( ! check_user() ) {
            // change 1, 2, 3 to IDs of your excluded categories
            $cats_excluded = array_merge( array(1, 2, 3), (array)$query->get( \'category__not_in\' ) );  // don\'t ignore any other excluded categories
            $query->set( \'category__not_in\', $cats_excluded );
        }
    }
}
add_action( \'pre_get_posts\', \'restrict_users_categories\' );
还有。。。你有点奇怪check_user 作用如果您想检查用户是否具有以下角色之一“company1”、“company2”,等等,那么就可以了。

但如果您只想限制订阅者,那么应该:

function check_user() {
    if ( ! get_current_user_id() ) {  // this way you won\'t get notices when user is not logged in
        return false;
    }

    $user = wp_get_current_user();
    if ( in_array( \'subscriber\', $user->roles ) ) {
        // user is a subscriber
        return false;
    }
    return true;
}

SO网友:mrben522

您需要在WP_Query 电话。使用pre_get_posts 钩子将允许您在任何需要的地方隐藏这些类别中的帖子。在下面的函数中,我将它们隐藏在除管理页面之外的所有地方,除非您的user_check() 函数返回true。根据需要修改。

add_action( \'pre_get_posts\', \'hide_private_cats\', 10);

function hide_private_cats($query) {
    if (is_admin() || check_user()) { // If this is an admin page or your user check passes, do nothing
    return;
    } else {
        $query->set(\'category__not_in\', array( 3, 8, 10 )); // don\'t show posts that are in the categories specified (only takes IDs)
    }
}