這是過年期間解決的一個問題,覺得也滿有意思的!

情境

一個購物網站,不只有賣實體商品,還包含非實體的課程商品。

問題

課程商品下單勢必不能加上運費,但如果同時跟實體商品一起購買的話會發生跟著免運的情況XD

解決辦法

思路有兩種:

  1. 運費個別分攤在每樣商品,再透過計算商品的運費級距來完成組合運費的架構(複雜)
  2. 切割商品種類,分別下單,保持購物車預設邏輯(簡單)

嗯,不用猜,我一定選簡單的做!! 哈哈

所以就是特別把「課程」這分類下的商品與其他實體商品做切割,在購物車中判斷分類組合去決定商品物件去留與通知使用者。程式範例碼如下:

<?php
function mxp_check_category_in_cart() {
    // 捕捉購物車內的商品物件
    $cat_in_cart = array();
    $other_cat_in_cart = array();
    // 迴圈掃描購物車
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product_id = $cart_item['product_id'];
        // 判斷是否包含關鍵分類
        $terms = get_the_terms($product_id, 'product_cat');
        if (has_term('class_a', 'product_cat', $product_id)) {
            // 有鎖定的關鍵分類就將物件編號塞入陣列,稍後處理
            $cat_in_cart[] = $cart_item;
        } else {
            $other_cat_in_cart[] = $cart_item;
        }
    }
    // 如果兩個陣列都有值,代表這購物車是混搭類型
    if (!empty($cat_in_cart) && !empty($other_cat_in_cart)) {
        wc_print_notice('課程與商品為不同性質商品,還麻煩需要分開下單!謝謝。', 'notice');
        foreach ($other_cat_in_cart as $index => $cart_item) {
            //移除購物車其中一類的商品
            WC()->cart->remove_cart_item($cart_item['key']);
        }
        WC()->cart->calculate_totals();
    }
}
add_action('woocommerce_check_cart_items', 'mxp_check_category_in_cart');
add_action('woocommerce_before_cart', 'mxp_check_category_in_cart');

Gist: Link

將上述程式碼片段放置於子主題下的 functions.php 中就會有作用了。

這邊實作要注意一點就是單純移除商品還不夠,還要觸發重新計算購物車的方法,更新購物車的金額狀態!不然可是看不到該商品但金額不變的情況。

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

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