You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:31:00