如何根据用户角色隐藏具有给定类别的WooCommerce产品

时间:2016-08-17 19:29:04

标签: php wordpress woocommerce categories user-roles

我的客户有以下问题:

我需要能够将他们的WooCommerce WordPress网站分为两类。如果用户以 "Wholeseller" 身份登录,则只会从数据库中提取 "Wholesale"类别中的产品。

但是,如果用户未登录或已登录但未登录 "Wholeseller" ,则只有没有 "Wholesale"类别的产品才能获取从数据库中取出。

我想我会在主题的functions.php文件中添加这样的内容:

add_filter("some_woocommerce_hook", "wholeseller_filter");

function wholeseller_filter() {
    if (current_user->role == "Wholeseller"){
        //omit products without "wholesale" category while browsing whole site
    } else { 
        //omit products with "wholesale" in the category while browsing whole site.
    }
}

我已经浏览了StackOverflow,但我还没找到我正在寻找的内容,或者非常清楚我应该使用哪些关键字进行搜索。

你能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:7)

是的,这是可能的。有两种方式:

1)使用在创建查询变量对象之后但在运行实际查询之前调用的 pre_get_posts wordpress钩子。所以它非常适合这种情况。我们在此想象 'Wholesale'类别的ID为'123'

以下是自定义代码:

function wholeseller_role_cat( $query ) {

    // Get the current user
    $current_user = wp_get_current_user();

    if ( $query->is_main_query() ) {
        // Displaying only "Wholesale" category products to "whole seller" user role
        if ( in_array( 'wholeseller', $current_user->roles ) ) {
            // Set here the ID for Wholesale category 
            $query->set( 'cat', '123' ); 

        // Displaying All products (except "Wholesale" category products) 
        // to all other users roles (except "wholeseller" user role)
        // and to non logged user.
        } else {
            // Set here the ID for Wholesale category (with minus sign before)
            $query->set( 'cat', '-123' ); // negative number
        }
    }
}
add_action( 'pre_get_posts', 'wholeseller_role_cat' );

此代码位于您的活动子主题或主题的function.php文件中,或者在自定义插件中更好。

2)使用 woocommerce_product_query WooCommerce挂钩。 (我们现在仍然认为 'Wholesale' 类别的ID为 '123'

以下是自定义代码:

function wholeseller_role_cat( $q ) {

    // Get the current user
    $current_user = wp_get_current_user();

    // Displaying only "Wholesale" category products to "whole seller" user role
    if ( in_array( 'wholeseller', $current_user->roles ) ) {
        // Set here the ID for Wholesale category 
        $q->set( 'tax_query', array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'term_id',
                'terms' => '123', // your category ID
            )
        ) ); 

    // Displaying All products (except "Wholesale" category products) 
    // to all other users roles (except "wholeseller" user role)
    // and to non logged user.
    } else {
        // Set here the ID for Wholesale category
        $q->set( 'tax_query', array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'term_id',
                'terms' => '123', // your category ID
                'operator' => 'NOT IN'
            )
        ) ); 
    }
}
add_action( 'woocommerce_product_query', 'wholeseller_role_cat' );

此代码位于您的活动子主题或主题的function.php文件中,或者在自定义插件中更好。

如果您想使用类别slug而不是类别ID,则必须部分替换(两个数组):

            array(
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => 'wholesale', // your category slug (to use the slug see below)

如果您希望并且需要,可以在 if statements 中添加some woocommerce conditionals tags以进一步限制此内容。

参考文献:

答案 1 :(得分:0)

为了提高性能,只对woocommerce查询有效,请使用以下函数和钩子。

function exclude_product_from_wholesale( $q ){

 $current_user = wp_get_current_user();
 $ARRAY_OF_PRODUCT_IDS_YOU_WANT_HIDDEN = array();

 if ( in_array( 'wholeseller', $current_user->roles ) ) {
  $q->set( 'post__not_in', $ARRAY_OF_PRODUCT_IDS_YOU_WANT_HIDDEN );
 }

}

add_action( 'woocommerce_product_query', 'exclude_product_from_wholesale' );

您可以将这个简单的功能放入functions.php。

答案 2 :(得分:0)

function exclude_categories_for_vendors( $query ) {

    // Get the current user
    $current_user = wp_get_current_user();
     $ARRAY_OF_PRODUCT_CATEGORIES_IDS_YOU_WANT_HIDDEN = array(26,23,20);

    if( is_user_logged_in() ){

        if ( $query->is_main_query() ) {
           
            if ( in_array( 'editor', (array) $current_user->roles ) ) {
                
                //echo "editor";
                //below query will hide categories for Vendor user in Admin Panel
                
                   $query->set( 'tax_query', array(
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'term_id',
                        'terms' => $ARRAY_OF_PRODUCT_CATEGORIES_IDS_YOU_WANT_HIDDEN, // your category ID
                        'operator' => 'NOT IN'
                    )
                ) ); 

            } else{
                //no changes
            }
        }
    }
}
add_action( 'pre_get_posts', 'exclude_categories_for_vendors' );