本篇文章更新時間:2023/09/06
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
當預設的下單流程不能滿足某些使用情境的時候,使用客製化的程式來建立訂單算還滿直覺的做法。
過去有筆記過前段「程式建立訂單」的文 [WooCommerce] 客製化訂單與結帳流程的作法。我這邊也就不重複多貼一次,但要特別提那篇的重點還有建立完訂單後,還可以觸發去結帳的金流行為。
do_action('woocommerce_receipt_' . $order->get_payment_method(), $order->id);
其他訂單相關參考筆記:
本篇把重點放在「建立訂單時還要加上其他收費項目(fee)」,方法如下:
//設定運費項目
$fee = new WC_Order_Item_Fee();
// 名稱就是運費點數
$fee->set_name('特殊冷凍物流運費');
// 費用數字
$fee->set_total($shipping_fee);
//加進訂單
$order->add_item($fee);
// 最重要的去觸發計算
$order->calculate_totals();
WooCommerce 3.x 版本後的操作方式變成要先建立個 Fee 的 Line item 物件才來加入訂單中去計算過。
如果有多筆收費項目需要加入,就是依樣畫葫蘆的建立多筆物件加入即可。
對比如果走內建預設的加入購物車流程,要加上一筆費用(fee)就簡單得多,下方舉例之前也有筆記過的「滿額免運」案例。 [WooCommerce] 程式化處理購物車運費折扣 – 滿額免運為例
function mxp_shipping_fee_discount() {
if (is_admin() && !defined('DOING_AJAX')) {
// 避免在管理介面下被觸發
return;
}
$total_price = 0;
$total_price = intval(WC()->cart->get_cart_contents_total());
foreach (WC()->session->get('shipping_for_package_0')['rates'] as $method_id => $rate) {
// 判斷當前選擇的運送方法與目前購物車總金額是否大於 2000
if (WC()->session->get('chosen_shipping_methods')[0] == $method_id && $total_price >= 2000) {
// $wc_shipping = WC_Shipping::instance();
//重整一次運費計算方案
// $wc_shipping->calculate_shipping_for_package($wc_shipping->get_packages());
$rate_label = $rate->label; // 當前運費標籤名稱
$rate_cost_excl_tax = floatval($rate->cost); // 不含稅率的運費
// 紀錄稅率費用
$rate_taxes = 0;
foreach ($rate->taxes as $rate_tax) {
$rate_taxes += floatval($rate_tax);
}
// 包含稅率費用的總運費
$rate_cost_incl_tax = $rate_cost_excl_tax + $rate_taxes;
if ($rate_cost_incl_tax != 0) {
WC()->cart->add_fee('消費滿 2000 免運費', -$rate_cost_incl_tax, false);
}
break;
}
}
}
add_action('woocommerce_cart_calculate_fees', 'mxp_shipping_fee_discount');
只需要在 woocommerce_cart_calculate_fees
勾點內,加入 WC()->cart->add_fee
方法就可以增加一些收費項目(或是折扣)。
相關運用的玩法還滿多元~