WooCommerce 購物車規則:最少買幾件、成對購買、最低消費、預購和現貨分開結帳

WooCommerce 購物車規則:最少買幾件、成對購買、最低消費、預購和現貨分開結帳

最後更新:2026/10/13

小店做生意總有一些自己的規矩:精油組合兩件起賣、筷架一次要買一對、單筆未滿 300 元運費划不來不想出貨、預購商品要等一個月,不想和現貨綁在同一張訂單裡拖著出貨。

這些規則在店面裡靠一張告示、店員一句話就能處理,到了網店卻常常變成「客人照樣下單,你再一個個私訊說明」。WooCommerce 後台只有「限購一件」這種簡單的選項,其他的要靠程式碼。這篇給臺北的小店三段程式碼,一次處理掉。

不想自己改?把這篇交給 AI

把這篇的網址(或全文)連同下面這段話貼給 AI:

我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章,設定購物車規則:某些商品最少買幾件、要成對購買、單筆最低消費,預購商品不能和現貨一起結帳。
請先問我:哪些商品要套規則、各自的件數、最低消費金額、預購商品放在哪個分類。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)

改之前先備份,密碼不要貼給 AI。

規則 1:最少買幾件、一次加幾件

先決定哪些商品有數量規則。下面用商品 ID 對應規則,例如 ID 13 的精油組合「最少 2 件、一次加 2 件」。商品 ID 在商品列表裡把滑鼠移到商品名稱上就看得到。

// 哪些商品有數量規則:商品 ID => 最少幾件、一次加幾件
function mimi_qty_rule($product) {
    $rules = [
        13 => ['min' => 2, 'step' => 2], // 例:精油組合,兩件起、成對買
    ];
    $id = $product->get_parent_id() ?: $product->get_id();
    return $rules[$id] ?? null;
}

// 1. 數量欄位:最少幾件、每次加幾件(傳統購物車和區塊購物車都會讀這個設定)
add_filter('woocommerce_quantity_input_args', function ($args, $product) {
    $rule = mimi_qty_rule($product);
    if ($rule) {
        $args['min_value'] = $rule['min'];
        $args['step']      = $rule['step'];
        if (empty($args['input_value']) || $args['input_value'] < $rule['min']) {
            $args['input_value'] = $rule['min'];
        }
    }
    return $args;
}, 10, 2);

get_parent_id() 那一行是為有規格的商品準備的:選了某個尺寸之後,WooCommerce 看到的是「這個規格」,用它的上層商品 ID 去對規則,整個商品的每個規格就套用同一條規則。

加上這段之後,商品頁的數量欄位一打開就是 2,按加號會跳到 4、6、8,按減號最低只到 2。我們原本擔心新版的區塊購物車不吃這一套,查了 WooCommerce 的原始碼,區塊購物車的數量按鈕也會先讀這個設定,實測購物車裡的數量按鈕一樣是「最少 2、一次加 2」。

規則 2:結帳前再檢查一次,順便加最低消費

數量欄位只是讓客人「比較不會選錯」。直接用網址加入購物車、或在購物車裡亂改數字,還是可能送出不合規則的數量。所以結帳前要再檢查一次,最低消費也一起放在這裡:

// 2. 結帳前再檢查一次:數量規則、最低消費
add_action('woocommerce_check_cart_items', function () {
    foreach (WC()->cart->get_cart() as $item) {
        $rule = mimi_qty_rule($item['data']);
        $qty  = $item['quantity'];
        if ($rule && ($qty < $rule['min'] || $qty % $rule['step'])) {
            wc_add_notice(sprintf('「%s」要 %d 件起,每次 %d 件。',
                $item['data']->get_name(), $rule['min'], $rule['step']), 'error');
        }
    }
    $minimum = 300; // 最低消費(免費索取的訂單不受限制)
    if (WC()->cart->needs_payment() && WC()->cart->get_subtotal() < $minimum) {
        wc_add_notice('單筆訂單滿 ' . wc_price($minimum) . ' 才能結帳。', 'error');
    }
});

woocommerce_check_cart_items 會在購物車頁、結帳頁和送出訂單的時候執行,只要這裡出現錯誤訊息,訂單就送不出去。$qty % $rule['step'] 是「數量除以 2 有沒有餘數」,有餘數就代表不是成對的。

最低消費那一行多了 needs_payment() 的判斷。我們第一版沒有加,結果測試站的免費講義也被「單筆訂單滿 300 元才能結帳」擋住,客人連免費的東西都拿不到。加上判斷之後,不用付錢的訂單就不受最低消費限制。金額用的是商品小計,不含運費,比較符合「買滿多少」的直覺。

我們把一件商品的特價改成 250 元測試:傳統購物車頁出現「單筆訂單滿 NT$300 才能結帳。」,進不了結帳頁;區塊結帳頁也顯示同一句話,按下單會被擋回來。

規則 3:預購商品和現貨分開下單

預購商品要等,現貨可以馬上寄。兩種商品綁在同一張訂單,不是現貨跟著等,就是你要拆兩次出貨、多付一次運費。最乾脆的做法是在加入購物車的時候就擋下來:

// 3. 預購商品和現貨不能放在同一張訂單(分類代稱 preorder)
add_filter('woocommerce_add_to_cart_validation', function ($ok, $product_id) {
    $is_preorder = has_term('preorder', 'product_cat', $product_id);
    foreach (WC()->cart->get_cart() as $item) {
        if (has_term('preorder', 'product_cat', $item['product_id']) !== $is_preorder) {
            wc_add_notice('預購商品要和現貨分開下單,請先完成購物車裡的訂單。', 'error');
            return false;
        }
    }
    return $ok;
}, 10, 2);

把預購商品都放進一個代稱是 preorder 的分類。客人的購物車裡已經有現貨,再按預購商品的加入購物車,就會看到提示、加不進去;反過來也一樣。訊息寫清楚原因和下一步,客人才不會以為網站壞了。測試時傳統購物車和區塊購物車都出現了這段提示。

三段程式碼要一起貼,因為規則 2 會用到規則 1 開頭的 mimi_qty_rule。放法和備份方式見〈WooCommerce 結帳頁改成台灣習慣〉。

規則變多的時候

如果你的規則是「每件商品各自不同的最少、最多數量」、「同一分類合計滿 6 件才能結帳」、「會員和一般客人不同」,在程式碼裡維護一長串 ID 會越來越吃力。這時候可以考慮數量限制類的外掛,在每件商品的編輯頁就能設定。挑選時一樣要確認它支援區塊購物車。

規則寫在網站上,還要寫在客人看得到的地方。商品頁的說明加一句「兩件起售」,購物車擋下來時的訊息也要說清楚怎麼做才能結帳。規則清楚,客人反而買得放心。

如果你的網店有更多特殊的銷售規則,想一次規劃清楚,可以先看〈IG 帳號不是你的資產〉想想網站要做到什麼。MIMI 專做客製化網頁設計,購物車電商網站可以照你的出貨方式設計購物規則。MIMI 提供臺北網頁設計服務,臺北的店家可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。

WooCommerce 商品網址怎麼設:中文網址變亂碼、改網址前要知道的事、商店頁藏起某個分類
WooCommerce 賣電子書、講義、素材:數位商品的設定、檔案放哪裡、付款後自動完成

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

我的車
願望清單
最近瀏覽過的
類別