本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
這是過年期間解決的一個問題,覺得也滿有意思的!
情境
一個購物網站,不只有賣實體商品,還包含非實體的課程商品。
問題
課程商品下單勢必不能加上運費,但如果同時跟實體商品一起購買的話會發生跟著免運的情況XD
解決辦法
思路有兩種:
- 運費個別分攤在每樣商品,再透過計算商品的運費級距來完成組合運費的架構(複雜)
- 切割商品種類,分別下單,保持購物車預設邏輯(簡單)
嗯,不用猜,我一定選簡單的做!! 哈哈
所以就是特別把「課程」這分類下的商品與其他實體商品做切割,在購物車中判斷分類組合去決定商品物件去留與通知使用者。程式範例碼如下:
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
中就會有作用了。
這邊實作要注意一點就是單純移除商品還不夠,還要觸發重新計算購物車的方法,更新購物車的金額狀態!不然可是看不到該商品但金額不變的情況。