在 WooCommerce 後台管理訂單時,預設搜尋功能僅能分別搜尋客戶的姓氏或名字。但在實際應用中,許多用戶希望能夠直接輸入「王小明」這樣完整的姓名來查詢訂單資料。本文將介紹如何透過自訂程式碼,將 billing_last_name
與 billing_first_name
兩個欄位合併,進而改善 WooCommerce 訂單搜尋的使用體驗。
為什麼需要合併搜尋?
通常在 WooCommerce 訂單資料中,客戶的姓氏與名字分別存放在 _billing_last_name
與 _billing_first_name
兩個 meta 欄位中。如果分別搜尋,當你輸入「王小明」時,由於資料是分開存放,搜尋結果可能無法正確匹配到資料。藉由合併這兩個欄位,我們可以讓搜尋功能更符合使用者習慣,直接輸入完整姓名即可快速查詢到相關訂單。
功能介紹
這段自訂程式碼主要透過 WordPress 的 posts_search
過濾器,對 WooCommerce 訂單搜尋做出以下調整:
- 合併欄位搜尋: 利用 SQL 的
CONCAT
函數,將_billing_last_name
與_billing_first_name
合併後,再以模糊比對的方式進行搜尋。 - 安全性考量: 使用
esc_like
與esc_sql
避免 SQL 注入,確保搜尋過程中的安全性。 - 適用於後台訂單管理: 此功能僅在後台訂單查詢時啟用,不影響前台或其他文章類型的搜尋結果。
程式碼實作
將以下程式碼新增到你的主題 functions.php 或是自訂外掛中:
function add_concatenated_billing_name_to_order_search( $search, $query ) { global $wpdb; // 只針對後台訂單列表、且有搜尋字串時進行調整 if ( ! is_admin() || empty( $query->query_vars['s'] ) || $query->get('post_type') !== 'shop_order' ) { return $search; } $search_term = $query->query_vars['s']; // 避免 SQL 注入與 LIKE 條件特殊字元 $search_term_esc = esc_sql( $wpdb->esc_like( $search_term ) ); // 加入搜尋條件,透過 INNER JOIN 兩個 meta 表後,將姓與名做 CONCAT $search .= " OR EXISTS ( SELECT 1 FROM {$wpdb->postmeta} meta_first INNER JOIN {$wpdb->postmeta} meta_last ON meta_last.post_id = meta_first.post_id WHERE meta_first.meta_key = '_billing_first_name' AND meta_last.meta_key = '_billing_last_name' AND CONCAT(meta_last.meta_value, meta_first.meta_value) LIKE '%{$search_term_esc}%' AND meta_first.post_id = {$wpdb->posts}.ID )"; return $search; } add_filter( 'posts_search', 'add_concatenated_billing_name_to_order_search', 10, 2 );
程式碼解析:
- 條件判斷:
- 檢查是否位於後台管理介面,以及是否為訂單 (
shop_order
) 的搜尋。只有滿足條件時,才會進行後續的搜尋條件擴充。
- 檢查是否位於後台管理介面,以及是否為訂單 (
- 處理搜尋字串:
- 利用
esc_like
與esc_sql
來處理搜尋字串,避免 SQL 注入風險,並對特殊字元做處理。
- 利用
- SQL 搜尋條件:
- 透過
INNER JOIN
連結兩個 meta 表,並使用CONCAT
將_billing_last_name
與_billing_first_name
合併成一個字串,再利用LIKE
條件進行模糊搜尋。這樣一來,只要輸入完整姓名的任意部分,皆可正確搜尋出訂單。
- 透過
注意事項
- 資料庫效能:
由於使用了 SQL 的 JOIN 與 CONCAT 操作,若訂單數量龐大,可能會對搜尋效能造成影響。建議在正式環境中使用前,先於測試環境驗證效能表現。 - Meta Key 名稱:
請根據你站台實際使用的 meta key 名稱來調整程式碼。如果你的 meta key 沒有底線(例如billing_last_name
而非_billing_last_name
),請記得同步修改。 - 其他搜尋條件:
此程式碼僅針對姓名搜尋進行擴充,其他搜尋需求(如訂單編號、Email 等)則不受影響。
結語
透過這段自訂程式碼,你可以讓 WooCommerce 後台訂單搜尋功能更加符合使用者習慣。無論是輸入姓氏、名字或完整姓名,都能快速找到目標訂單,大幅提升管理效率。希望這篇文章對你在 WooCommerce 訂單管理上的應用有所幫助,也歡迎大家根據實際需求進一步客製化搜尋邏輯。