如何为已售出的WooCommerce变体总量设置最高库存水平,而不考虑单个变体库存水平

时间:2018-08-29 16:48:35

标签: variables woocommerce product stock variations

我想知道我们是否能够加入WooCommerce来设置可变产品的最大库存量。一旦达到此最大数量,便不考虑单个变动库存水平。

例如,我有一个可变的产品销售车间小组。共有4种版本,每种库存量都设置为100。这是因为没有一个团队可以容纳100人以上。但是,只有250张门票可供出售(由于4x100数量,我们可能不希望有400张)。

因此,每个工作组最多可以使用100个席位。我们只需要以某种方式就可以将所有4个版本的总库存水平限制为250。

我曾希望启用父产品的“管理库存”选项并将其设置为250。但是显然,变化必须覆盖这一点。如果即使在使用差异库存管理时,我们也可以将其连接并重新打开,则可能是解决此问题的好方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

通过执行以下操作,我想出了解决问题的方法:

  1. 在WooCommerce产品页面上添加2个自定义字段,该字段将存储我们可以出售的总变化量的最大数量以及单个变化的最大数量。的代码是:

    // Modify WooCommerce Product Settings add_action('woocommerce_product_options_inventory_product_data', 'wc_add_custom_field' ); function wc_add_custom_field() { $fields = array('Total quantity' => 'total_quantity','Variation quantity' => 'variation_quantity'); $field_description = array('total_quantity' ='description','variation_quantity' ='description'); $field_placeholder = array('total_quantity' =>'e.g. 300','variation_quantity' =>'e.g. 100'); foreach ($fields as $key => $value) { woocommerce_wp_text_input( array( 'id' => $value, 'label' => $key, 'description' => $field_description[$value], 'desc_tip' => 'true', 'placeholder' => $field_placeholder[$value] ) ); } }

    // Save Fields add_action( 'save_post_product', 'woo_add_custom_general_fields_save' ); function woo_add_custom_general_fields_save( $post_id ){ update_post_meta( $post_id, 'total_quantity', $_POST['total_quantity'] ); update_post_meta( $post_id, 'variation_quantity', $_POST['variation_quantity'] ); }

  2. 添加购物车/购物篮验证规则,以阻止客户购买超过上面添加的自定义“ total_quantity”字段值的产品:

    add_action( "woocommerce_add_to_cart_validation","sc_woocommerce_add_to_cart_validation", 1, 5 ); function sc_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id, $variations ) { // Iterate through each variation and get the total stock remaining $product_variable = new WC_Product_Variable($product_id); $product_variations = $product_variable->get_available_variations(); settype($variation_stock_availability, "integer"); foreach ($product_variations as $variation) { $variation_stock_availability = +(int)$variation['max_qty']; } $count_variations = count($product_variations); $total_quantity = get_post_meta( $product_id, 'total_quantity', true ); $variation_quantity = get_post_meta( $product_id, 'variation_quantity', true );

    // formula to test if any stock remaining based on sold variations
    $formula = $count_variations * $variation_quantity;
    $formula1 = (int)$formula + (int)$quantity;
    $formula1 = $formula1 - $variation_stock_availability;
    
     // Iterating through each cart item and use the current running quantity in the cart in the forumula
    foreach (WC()->cart->get_cart() as $cart_item_key=>$cart_item ){
        // count(selected category) quantity
        $running_qty += (int) $cart_item['quantity'];
        $formula2 = (int)$formula + (int)$running_qty;
        $formula2 = $formula2 - $variation_stock_availability;
        // More than allowed products in the cart is not allowed
        if ($formula2 >= $total_places) {
            wc_add_notice( sprintf( __( "Unfortunately there is no availability based on your selection", "donaheys" )), 'error' );
            $passed = false;
            return $passed;
        }
    }
    
    // More than allowed products in the cart is not allowed
    if ($formula1 >= $total_places) {
        // Add the error
        wc_add_notice( sprintf( __( "Unfortunately there is no availability based on your selection", "donaheys" )), 'error' );
        $passed = false;
        return $passed;
    } else {        
        $passed = true;
        return $passed;
    }
    $running_qty = 0;
    

    // formula to test if any stock remaining based on sold variations $formula = $count_variations * $variation_quantity; $formula1 = (int)$formula + (int)$quantity; $formula1 = $formula1 - $variation_stock_availability; // Iterating through each cart item and use the current running quantity in the cart in the forumula foreach (WC()->cart->get_cart() as $cart_item_key=>$cart_item ){ // count(selected category) quantity $running_qty += (int) $cart_item['quantity']; $formula2 = (int)$formula + (int)$running_qty; $formula2 = $formula2 - $variation_stock_availability; // More than allowed products in the cart is not allowed if ($formula2 >= $total_places) { wc_add_notice( sprintf( __( "Unfortunately there is no availability based on your selection", "donaheys" )), 'error' ); $passed = false; return $passed; } } // More than allowed products in the cart is not allowed if ($formula1 >= $total_places) { // Add the error wc_add_notice( sprintf( __( "Unfortunately there is no availability based on your selection", "donaheys" )), 'error' ); $passed = false; return $passed; } else { $passed = true; return $passed; } $running_qty = 0;

以上代码的结果确保了我们可以为可变产品设置可以购买的最大库存量,而一旦达到该最大数量,则无需考虑各个变动库存水平。