禁用Woocommerce中特定用户角色的缺货订单

时间:2018-07-31 14:01:58

标签: php wordpress woocommerce product hook-woocommerce

在woocommerce中,我使用“未交货”复选框将我的产品置于未交货状态。 既然一切都在补货上,我想对普通客户禁用补货(而对其他用户角色,例如Wholesale_customer)。

我有以下代码,但是当我将其添加为插件时,无法向购物车中添加某些东西(我可以按“添加到购物车”按钮,但购物车保持空白):

/*Single product page: out of stock when product stock quantitiy is lower or equal to zero AND customer is not wholesale_customer.*/

add_filter('woocommerce_product_is_in_stock', 'woocommerce_product_is_in_stock' );

function woocommerce_product_is_in_stock( $is_in_stock ) {
    global $product;

    $user = wp_get_current_user();
    $haystack= (array) $user->roles;
    $target=array('wholesale_customer');

    if($product->get_stock_quantity() <= 0 && count(array_intersect($haystack, $target)) == 0){

        $is_in_stock = false;
    }

    return $is_in_stock;
}

/*Single product page: max add to cart is the product's stock quantity when customer is not wholesale_customer.*/

function woocommerce_quantity_input_max_callback( $max, $product ) {
    $user = wp_get_current_user();
    $haystack= (array) $user->roles;
    $target=array('wholesale_customer');

    if(count(array_intersect($haystack, $target)) == 0){

        $max= $product->get_stock_quantity();
    }

    return $max;
}
add_filter( 'woocommerce_quantity_input_max', 'woocommerce_quantity_input_max_callback',10,2);

2 个答案:

答案 0 :(得分:0)

尝试改用woocommerce_is_purchasable( $is_purchasable, $product )过滤器。它应该返回true或false。

此外,您也无需花太多时间来获得用户的角色。一个简单的if ( current_user_can( 'wholesale_customer' ) )就足够了。

所以,像这样:

function my_is_purchasable( $is_purchasable, $product ) {
    if ( current_user_can( 'wholesale_customer' ) ) { 
        return true;
    } elseif ( $product->get_stock_quantity() <= 0 ) {
        return false;
    } else {
        return $is_purchasable;
    }
}
add_filter( 'woocommerce_is_purchasable', 'my_is_purchasable', 10, 2 );

注意:这只是为了演示,因为我现在不在办公桌前,无法为您正确测试。

答案 1 :(得分:0)

使用专用的woocommerce_product_backorders_allowed过滤器挂钩尝试以下代码:

add_filter( 'woocommerce_product_backorders_allowed', 'products_backorders_allowed', 10, 3 );
function products_backorders_allowed( $backorder_allowed, $product_id, $product ){
    $user       = wp_get_current_user();
    $user_roles = (array) $user->roles;
    if( in_array( 'customer', $user_roles ) && ! in_array( 'wholesale_customer', $user_roles ) ){
        $backorder_allowed = false;
    }
    return $backorder_allowed;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。应该可以。