本篇文章更新時間:2023/02/08
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
這篇筆記的需求其實就是捐款功能。一個儘管有幾種捐款價位讓你選,但你可能還是有自己心裡想填入的捐款數字,所以通常不會把這個數字寫死去完成付款。
用 WooCommerce 的好處是,就算不延伸開發,還是可以使用「可變商品」這個型態的商品來組合出不同數字的捐款選項。
更不用說很多現成的金流外掛也都可以直接套上,完成結帳付款的捐款操作。
過去筆記類似的客製化流程文章:
先說一個簡單的方式:使用「Pay What You Want」外掛。
這款外掛可以指定某個商品類別下,開放自訂輸入商品金額,用來辦到如外掛名稱「想用多少錢買就自己輸入」的功能效果。
所以使用這款外掛就是建立一個商品,放在「捐款」分類下,在外掛設定裡開放自行輸入金額,以及預設幾組捐款數字,最後設定指定「捐款」分類。
如此一來就可以辦到如下效果:
再來就是如果要掌控技術細節不使用外掛,且程式自動化控制這個功能的話,我的做法是:透過一個連結分享,系統會自動將捐款項目與金額出現在購物車畫面,完成結帳。
例如瀏覽 https://www.mxp.tw/cart/?add_donation=123
就會可以看到購物車裡有一個「網站捐款」的項目,金額寫著「123
」。
程式如下:
function mxp_add_donation_pricing() {
if (isset($_GET['add_donation']) && is_numeric($_GET['add_donation'])) {
WC()->cart->add_to_cart(後台建立好的商品ID);
}
}
add_action('template_redirect', 'mxp_add_donation_pricing');
//把捐款數字記錄下來
function mxp_add_donation_price_to_cart($cart_item_data, $product_id, $variation_id) {
if (isset($_GET['add_donation'])) {
$cart_item_data['donate-price'] = intval($_GET['add_donation']);
}
return $cart_item_data;
}
add_filter('woocommerce_add_cart_item_data', 'mxp_add_donation_price_to_cart', 10, 3);
//計算購物車總額時改變捐款商品的售價
function mxp_custom_product_cart_line_item_price_for_donation($cart_object) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
if (did_action('woocommerce_before_calculate_totals') >= 2) {
return;
}
foreach (WC()->cart->get_cart() as $key => $value) {
if ($value['data']->get_slug() == 'fund_donate' && isset($value['donate-price'])) {
if (method_exists($value['data'], "set_price")) {
$value['data']->set_price($value['donate-price']);
}
}
}
}
add_action('woocommerce_before_calculate_totals', 'mxp_custom_product_cart_line_item_price_for_donation', 99, 1);
只需要後台先建立好商品,透過程式去判斷購物車狀態與帶入的金額來做改變,就可以辦到「想付多少自己填」的功能了。
後記
其實這篇我寫完後也跑去問問 ChatGPT,沒想到一下子就答出來了。真的是好用!
上述我提供的程式不是最完整用在專案裡的那份,僅把主要滿足需求的紀錄而已,有需求的人可以就邏輯的部份自行調整來搭配使用。