WooCommerce 加價購:買了指定商品,就能用優惠價加購另一件

WooCommerce 加價購:買了指定商品,就能用優惠價加購另一件

最後更新: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。

WooCommerce 商品評價:只給買過的人寫、可以附照片、商店頁顯示星等
WooCommerce 缺貨時「貨到通知我」:客人留 Email,補貨自動寄信

發佈留言

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

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