如何修改Woocommerce代码以结合当前库存设置预订订单限额
WooCommerce 预订订单限额优化实现
需求说明
产品库存为0且支持预订时,需设置预订订单限额,允许单次订购多件商品,同时需满足两个条件:
- 遵守设定的最大预订订单限额
- 考虑产品当前库存数量
举例:若产品库存为-5,最大预订订单限额为-10,则用户最多可再添加5件商品到购物车。原有代码仅在启用单独售卖选项时正常运行,无法实现多件订购的限额控制。
原有代码
function add_reservation_limit_field_to_inventory() { $product_id = get_the_ID(); $reservation_limit = get_post_meta($product_id, 'reservation_limit', true); woocommerce_wp_text_input(array( 'id' => 'reservation_limit', 'label' => '预订订单限额(留空则禁用限额)', 'placeholder' => '请输入预订订单限额(负数)', 'desc_tip' => '请输入预订订单限额(负数)', 'value' => $reservation_limit, )); } add_action('woocommerce_product_options_inventory_product_data', 'add_reservation_limit_field_to_inventory'); // 保存预订订单限额自定义字段的值 function save_reservation_limit_field($product_id) { $reservation_limit = $_POST['reservation_limit']; if (empty($reservation_limit)) { delete_post_meta($product_id, 'reservation_limit'); } else { update_post_meta($product_id, 'reservation_limit', esc_attr($reservation_limit)); } } add_action('woocommerce_process_product_meta', 'save_reservation_limit_field'); // 验证并限制预订订单 function limit_orders_on_add_to_cart($product_id, $quantity) { // 获取产品的“reservation_limit”自定义字段值 $reservation_limit = get_post_meta($product_id, 'reservation_limit', true); // 将自定义字段值转换为整数 $reservation_limit = (int) $reservation_limit; // 检查“reservation_limit”字段是否设置,且订购数量是否超出限额 if ($reservation_limit < 0 && $quantity > abs($reservation_limit)) { wc_add_notice(__('抱歉,该产品无法再接受预订订单。', 'woocommerce'), 'error'); return false; // 不允许添加到购物车 } return true; } // 添加到购物车前检查并限制预订订单 function check_reservation_limit_before_add_to_cart($cart_item_data, $product_id, $quantity) { if (!limit_orders_on_add_to_cart($product_id, $quantity)) { return null; // 若不符合限额则禁止添加到购物车 } return $cart_item_data; } add_filter('woocommerce_add_to_cart_validation', 'check_reservation_limit_before_add_to_cart', 10, 3);
解决方案代码
///////// 在产品配置器中添加预订最大数量的自定义字段/////// ////// 添加自定义字段的部分 function add_reservation_limit_field_to_inventory() { $product_id = get_the_ID(); $reservation_limit = get_post_meta($product_id, 'reservation_limit', true); woocommerce_wp_text_input(array( 'id' => 'reservation_limit', 'label' => '预订订单限额(留空则禁用限额)', 'placeholder' => '请输入预订订单限额(负数)', 'desc_tip' => '请输入预订订单限额(负数)', 'value' => $reservation_limit, )); } add_action('woocommerce_product_options_inventory_product_data', 'add_reservation_limit_field_to_inventory'); // 保存预订订单限额自定义字段的值 function save_reservation_limit_field($product_id) { $reservation_limit = $_POST['reservation_limit']; if (empty($reservation_limit)) { delete_post_meta($product_id, 'reservation_limit'); } else { update_post_meta($product_id, 'reservation_limit', esc_attr($reservation_limit)); } } add_action('woocommerce_process_product_meta', 'save_reservation_limit_field'); ///// 根据自定义字段数值限制的部分 // 验证并限制预订订单的函数 function limit_orders_on_add_to_cart($product_id, $quantity) { // 获取产品的“reservation_limit”自定义字段值 $reservation_limit = get_post_meta($product_id, 'reservation_limit', true); // 将自定义字段值转换为整数 $reservation_limit = (int) $reservation_limit; // 获取当前库存数量 $product = wc_get_product($product_id); $stock_quantity = $product->get_stock_quantity(); // 检查“reservation_limit”字段是否设置,且订购数量是否超出限额 if ($reservation_limit < 0 && ($quantity + abs($stock_quantity)) > abs($reservation_limit)) { wc_add_notice(__('抱歉,该产品无法再接受预订订单。', 'woocommerce'), 'error'); return false; // 不允许添加到购物车 } return true; } // 添加到购物车前检查并限制预订订单 function check_reservation_limit_before_add_to_cart($cart_item_data, $product_id, $quantity) { if (!limit_orders_on_add_to_cart($product_id, $quantity)) { return null; // 若不符合限额则禁止添加到购物车 } return $cart_item_data; } add_filter('woocommerce_add_to_cart_validation', 'check_reservation_limit_before_add_to_cart', 10, 3);
内容的提问来源于stack exchange,提问作者Francisco Agüero
相关产品推荐
相关产品推荐

