本篇文章更新時間:2020/04/23
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
時常發現消費者下單後反悔或是下錯單的時候,都會透過聯絡功能來信表示希望取消某筆訂單。
這樣的操作如果覺得麻煩,希望把功能開放給消費者的話可以將下方程式置入(子)主題 functions.php
中使用,或是安裝 WC Cancel Order 外掛來處理。
function mxp_wc_order_cancelled_request() {
if (!is_user_logged_in()) {
wp_send_json_error(array('err' => "你想幹嘛?", 'code' => 403));
}
$args = array(
'order_id' => FILTER_SANITIZE_STRING,
'_wpnonce' => FILTER_SANITIZE_STRING,
'reason' => FILTER_SANITIZE_STRING,
);
$all_inputs = filter_input_array(INPUT_GET, $args);
$order_id = isset($all_inputs['order_id']) && (int) $all_inputs['order_id'] ? (int) $all_inputs['order_id'] : '';
$note = $all_inputs['reason'];
if (!wp_verify_nonce($all_inputs['_wpnonce'], 'mxp-wc-check-referer')) {
wp_send_json_error(array('err' => "驗證失敗", 'code' => 403));
}
if (!$order_id) {
wp_send_json_error(array('err' => "輸入資料有誤", 'code' => 500));
}
$uid = wp_get_current_user();
if ($uid->exists()) {
$uid = $uid->ID;
} else {
$uid = null;
}
if (empty($uid)) {
wp_send_json_error(array('err' => "使用者不存在", 'code' => 500));
}
$order = wc_get_order($order_id);
if (!is_object($order)) {
wp_send_json_error(array('err' => "訂單不存在", 'code' => 500));
}
if ($order->get_user_id() != $uid) {
wp_send_json_error(array('err' => "訂單不正確", 'code' => 500));
}
$order->update_status('cancelled');
$mailer = WC()->mailer();
$mails = $mailer->get_emails();
if (!empty($mails)) {
foreach ($mails as $mail) {
if ($mail->id == 'cancelled_order') {
$mail->trigger($order_id);
}
}
}
if (!empty($note)) {
$order->add_order_note("客戶取消訂單備註:" . esc_html($note));
}
wp_send_json_success(array('msg' => "訂單取消成功", 'code' => 200));
}
add_action('wp_ajax_mxp_wc_order_cancelled_request', 'mxp_wc_order_cancelled_request');
function mxp_view_order_cancelled_btn($order_id) {
$order = wc_get_order($order_id);
//金流走「銀行轉帳」且「未付款」狀態為「保留」的條件下才顯示「取消訂單」
if ($order->has_status(array('on-hold')) && $order->get_payment_method() == "bacs") {
$url = wp_nonce_url(admin_url('admin-ajax.php?action=mxp_wc_order_cancelled_request&order_id=' . $order_id), 'mxp-wc-check-referer');
echo '取消訂單';
}
?>
透過開發的話使用彈性大,這個做法與外掛的設計有些不同。外掛多包了一層「請求取消」的狀態,所以不會直接針對訂單操作取消,還是由管理人員來確認後操作。可以說是把原本大家都會透過聯絡表單的作法包裝過,滿完整的!
而我開發的版本僅是在「我的帳號」的「訂單」中檢視訂單內頁下方多了一個「取消訂單」按鈕,點擊後經過確認就直接取消了~ (畢竟消費者都這麼確認要取消了,還等管理員來多處理一次做什麼呢?)
您好
感謝您提供很棒的功能,我想請教您是否能在提供客戶選擇(貨到付款)時也能取消訂單?謝謝您的回覆與指導
程式稍微補上一點邏輯判斷就可以囉!關鍵在這段: $order->get_payment_method() == “bacs” 這邊判斷的是金流走「銀行轉帳」的時候,如果還有其他金物流的條件,都可以在這邊補上。單看你說的「貨到付款」這塊,要看你使用的外掛或程式怎寫的才能決定哦
您好
非常感謝您的程式幫了很大的忙,請問不知為何ATM取消訂單後會收到系統寄的2封取消通知信,信用卡取消收不到取消通知信。謝謝您的回覆指導。
實際運作上的問題比較複雜,會根據執行網站環境使用的外掛或主題等造成差異。你提供的資訊我還無法判斷是什麼可能造成的了
您好.請問我在woocommerce建立商店,如何新增貨到付款的取消訂單選項呢?
你有試過文中的方法了嗎? 我這沒有限定怎樣類型的訂單才能取消呀