WooCommerce Notify 重複推播錯誤

目錄

之前開發的 WooCommerce 推播通知外掛有客人反應說在設定多個工作流程時,符合特定訂單狀態但規則不符合時依舊會進行推播。譬如我設定了兩個工作流程,觸發時機皆為訂單狀態變為保留,然後第一個工作流程是當付款方式等於 ATM 櫃員機,第二個工作流程是超商代碼,假設有一張新訂單付款方式為綠界信用卡,結果竟然會收到這兩個工作流程的推播,即使訂單的付款方式不符合:

問題出在規則的取得,我是先用 WP_Query 去撈出所有工作流程的 CPT,然後把訂單物件傳進去做條件的比對,像是判斷訂單狀態以及付款方式,當條件符合時會寫入 yes 到一個 $result 陣列,不符合的話寫 no,然後再用 array_unique 去刪除重複的值,如果最後$reuslt 的數量為一,那麼就將這個工作流程的文章 ID 寫進準備要推播的陣列。

$reuslt = array( 'yes', 'yes');
$result_count = array_unique( $result ); // 變成 array('yes')
if ( $result_count && count( $result_count ) === 1 ) {
  $notify_ids[] = get_the_ID();
}

而問題發生在寫入 no 的狀態,如果兩個工作流程都不符合,那麼經過 array_unique 的 $result 的數量一樣會是一,因而造成兩個不符合條件的工作流程都加進去準備要推播 ID 的陣列,進而產生重複推播的問題:

$reuslt = array( 'no', 'no');
$result_count = array_unique( $result ); // 變成 array('no')
if ( $result_count && count( $result_count ) === 1 ) {
  $notify_ids[] = get_the_ID();
}

修改的方向是除了要檢查 $result_count 的數量外,還要確保第一個值是 yes,但我的操作介面只提供 AND 的條件,因此當條件不符合時我直接把 $result 給清空,確保在多個條件有一個不成立的情況下,$result就會是空陣列。

但我覺得比較好的做法是還是要提供 OR 的選項,但由於 PHP 的運算子無法使用變數來處理,也就是說我無法用變數來決定是 && 還是 ||,但有查到 switch 的寫法,這部分找時間再來重構,目前版本的程式碼如下:

if ( $wc_notify_trigger_rule ) {


	foreach ( $wc_notify_trigger_rule as $rule ) {


		$order_by = $rule['wc_notify_trigger_rule_order_by'];
		$is       = $rule['wc_notify_trigger_rule_is'];
		$gateway  = $rule['wc_notify_trigger_rule_gateway'];
		$shipping = $rule['wc_notify_trigger_rule_shipping'];


		if ( 'by_gateway' === $order_by ) {
			if ( ( 'is' === $is && $order->get_payment_method() === $gateway ) || ( 'isnot' === $is && $order->get_payment_method() !== $gateway ) ) {
				$result[] = 'yes';
			} else {
				$result = array();
			}
		}


		if ( 'by_shipping' === $order_by ) {
			if ( ( 'is' === $is && $shipping_data_method_id === $shipping ) || ( 'isnot' === $is && $shipping_data_method_id !== $shipping ) ) {
				$result[] = 'yes';
			} else {
				$result = array();
			}
		}
	}


	$result_count = array_unique( $result );


	if ( $result_count && count( $result_count ) === 1 ) {
		$notify_ids[] = get_the_ID();
        }
}

目錄

賴俊吾 / Oberon Lai
賴俊吾 / Oberon Lai

現為全職 WordPress 工程師,網站開發經歷 11 年,專攻前端工程與 WordPress 佈景主題、外掛客製化開發

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!

覺得文章寫得好再幫我鼓個掌吧!

相關文章

LINE Messaging API 設定教學

LINE 的開發者帳號非常容易申請,只要有 LINE 帳號即可,申請的步驟很單純,只要提供相關的資訊即可建立完成。建 前往 LIN...

LINE Login 設定教學

STEP1. 使用個人 LINE 帳號登入 先前往 https://developers.line.biz 點...

發佈留言

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

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

專注於分享 WordPress 開發、接案技巧、專案管理等自由工作者必備知識與心得

© 2023 想點創意科技有限公司

想點創意科技有限公司 | 統一編號 90516823
Designed by Hend Design | 隱私權政策

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!