最後更新:2026/10/25
便利商店結帳時,店員常會問一句:「要不要加 39 元多一瓶飲料?」這就是加價購。客人本來就要買主商品,加一點錢帶走另一件,覺得划算;店家多賣一件,客單價也提高了。網路商店一樣可以這樣做,例如「買手工皂禮盒,精油組合加購價 499 元(原價 980 元)」。
在臺北開網店想做加價購,會發現 WooCommerce 內建的優惠券和特價,做不到「買了 A,B 才有特價」這種條件。這篇用一段程式碼做出來:主商品頁多一個加購的勾選框,勾了就一起放進購物車、套用加購價;主商品拿掉,加購商品就恢復原價。
不想自己改?把這篇交給 AI
把這篇的網址(或全文)連同下面這段話貼給 AI:
我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章做加價購:買了指定商品,另一件商品可以用加購價買。
請先問我:哪幾件主商品、各自可以加購哪一件、加購價多少、加購的數量要不要限制、主商品是不是有規格的商品。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)
改之前先備份,密碼不要貼給 AI。
完整程式碼
// 第 114 篇:WooCommerce 加價購:買了指定商品,就能用優惠價加購另一件
// 設定:買哪一件(主商品 ID)→ 可以加購哪一件(加購商品 ID)、加購價多少
function mimi_addon_offers() {
return [
12 => ['addon' => 13, 'price' => 499], // 買「手工皂禮盒」,「精油組合」加購價 499 元
];
}
// 1. 主商品頁的「加入購物車」按鈕上面,放一個加購的勾選框
add_action('woocommerce_before_add_to_cart_button', function () {
global $product;
$offer = mimi_addon_offers()[$product->get_id()] ?? null;
$addon = $offer ? wc_get_product($offer['addon']) : null;
if (!$addon || !$addon->is_purchasable() || !$addon->is_in_stock()) {
return;
}
printf(
'<p class="mimi-addon"><label><input type="checkbox" name="mimi_addon" value="1"> 加購「%s」,只要 %s(原價 %s)</label></p>',
esc_html($addon->get_name()),
wc_price($offer['price']),
wc_price($addon->get_regular_price())
);
});
// 2. 勾了就把加購商品一起放進購物車,並記下它是「哪一件的加購」
add_action('woocommerce_add_to_cart', function ($key, $product_id) {
$offer = mimi_addon_offers()[$product_id] ?? null;
if (!$offer || empty($_POST['mimi_addon'])) {
return;
}
unset($_POST['mimi_addon']); // 避免重複觸發
WC()->cart->add_to_cart($offer['addon'], 1, 0, [], ['mimi_addon_for' => $product_id]);
}, 10, 2);
// 3. 算錢之前:主商品還在購物車裡,加購商品才用加購價;數量最多跟主商品一樣多
add_action('woocommerce_before_calculate_totals', function ($cart) {
$qty_of = [];
foreach ($cart->get_cart() as $item) {
if (empty($item['mimi_addon_for'])) {
$qty_of[$item['product_id']] = ($qty_of[$item['product_id']] ?? 0) + $item['quantity'];
}
}
foreach ($cart->get_cart() as $key => $item) {
$main = $item['mimi_addon_for'] ?? 0;
if (!$main) {
continue;
}
$offer = mimi_addon_offers()[$main] ?? null;
if (!$offer || empty($qty_of[$main])) {
$item['data']->set_price($item['data']->get_regular_price()); // 主商品拿掉了,恢復原價
continue;
}
if ($item['quantity'] > $qty_of[$main]) {
$cart->set_quantity($key, $qty_of[$main], false);
}
$item['data']->set_price($offer['price']);
}
}, 20);
// 4. 購物車、結帳頁的加購商品下面,寫一行說明
add_filter('woocommerce_get_item_data', function ($data, $item) {
$main = $item['mimi_addon_for'] ?? 0;
if (!$main) {
return $data;
}
$in_cart = false;
foreach (WC()->cart->get_cart() as $other) {
if ((int) $other['product_id'] === (int) $main && empty($other['mimi_addon_for'])) {
$in_cart = true;
}
}
$name = get_the_title($main);
$data[] = ['key' => '加購', 'value' => $in_cart ? "搭配「{$name}」的加購價" : "「{$name}」不在購物車裡,已恢復原價"];
return $data;
}, 10, 2);
// 5. 訂單裡也記下「加購」,後台和通知信都看得到
add_action('woocommerce_checkout_create_order_line_item', function ($line, $key, $values) {
if (!empty($values['mimi_addon_for'])) {
$line->add_meta_data('加購', '搭配「' . get_the_title($values['mimi_addon_for']) . '」');
}
}, 10, 3);
程式碼放在 Code Snippets 這類外掛或子主題,放法和備份方式見〈WooCommerce 結帳頁改成台灣習慣〉。
各段做了什麼
最上面的設定表 mimi_addon_offers 是整篇的開關:12 => ['addon' => 13, 'price' => 499] 的意思是,商品 ID 12 是主商品,可以加購商品 ID 13,加購價 499 元。要多設幾組,就照樣再寫一列。商品 ID 在後台「商品」列表,滑鼠移到商品名稱上就看得到。
第 1 段在主商品頁的「加入購物車」按鈕上面,放一個勾選框,寫著加購商品的名稱、加購價和原價。加購商品如果缺貨或不能購買,勾選框就不會出現,避免客人勾了卻買不到。
第 2 段在客人按下加入購物車時檢查有沒有勾選,有勾就把加購商品也放進購物車,並在這一列記下「這是哪一件的加購」。記下來的這筆資料,讓加購的那一列和客人自己另外加入的同一件商品分開,原價買的照原價、加購的照加購價。
第 3 段是算錢的規則,在購物車每次計算金額之前執行。它先數主商品在購物車裡有幾件,再處理每一筆加購:主商品還在,就套用加購價;加購的數量最多跟主商品一樣多,客人把加購改成 3 件、主商品只有 2 件,加購會自動改回 2 件;主商品被拿掉了,加購的那一件就恢復原價。
第 4 段在購物車和結帳頁的加購商品下面,多一行說明:主商品在的時候寫「搭配「手工皂禮盒」的加購價」,主商品拿掉了就寫「「手工皂禮盒」不在購物車裡,已恢復原價」,客人看得懂為什麼價格變了。
第 5 段在下單時,把「加購:搭配「手工皂禮盒」」記在訂單的那一項商品上,後台的訂單頁和通知信都看得到,出貨的人知道這件是加購的。
測試結果
我們在本機測試站(WordPress 7.1.3、WooCommerce 11.2.1)用「手工皂禮盒」(450 元)和「精油組合」(980 元)測試,Twenty Twenty-Five 和 Storefront 兩種佈景主題都試過:
- 手工皂禮盒的商品頁出現「加購「精油組合」,只要 NT$499.00(原價 NT$980.00)」;精油組合自己的商品頁沒有勾選框。
- 勾選後加入購物車:手工皂禮盒 450 元、精油組合 499 元。新版區塊購物車在精油組合下面顯示原價 980、折扣價 499,以及「加購: 搭配「手工皂禮盒」的加購價」。
- 主商品改成 2 件、加購改成 3 件:加購自動變回 2 件,仍是 499 元。
- 另外用原價買一件精油組合:多出一列 980 元的精油組合,加購那一列不受影響。
- 把手工皂禮盒拿掉:加購那一列變成 980 元,說明改成「「手工皂禮盒」不在購物車裡,已恢復原價」。
- 再加入手工皂禮盒(1 件),加購那一列回到 499 元、數量變成 1 件;下單後的訂單頁,加購那一項寫著「加購: 搭配「手工皂禮盒」」。
使用前要注意的事
這段處理的是「一般商品」當主商品、加購一件「一般商品」。主商品或加購商品有顏色、尺寸等規格時,要另外指定是哪一種規格,寫法會複雜一些。
勾選框放在商品頁,所以客人要從主商品頁加入購物車才看得到。如果你想在購物車頁推薦加購,新版區塊購物車和傳統購物車的做法不同,要另外處理。
加購價會和你其他的促銷一起計算。如果同時有全館折扣或優惠券,記得算一下最後的價格,避免加購再疊加折扣後賣得太便宜。其他自動折扣的做法,可以看〈WooCommerce 數量折扣、滿額折扣、會員價〉。
加價購,是不用多花廣告費的生意
來買手工皂禮盒的客人,你已經花了力氣把他找來;加價購讓同一位客人多買一件,不用多付一毛廣告費。挑加購商品的原則很簡單:和主商品一起用剛好、單價比主商品低、加購價要讓客人覺得真的划算。優惠券的進階玩法,可以看〈WooCommerce 優惠券進階用法〉。
MIMI 專做客製化網頁設計,購物車電商網站的加價購、組合價、滿額贈這類促銷,都可以依你的商品一起規劃。MIMI 提供臺北網頁設計服務,臺北、新北到全台灣的店家,都可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。
