在 WooCommerce 的後台訂單管理頁中,預設的搜尋功能僅能依據訂單編號或關鍵字進行搜尋。本文將介紹如何利用自訂程式碼,將「帳單姓氏」與「帳單名字」進行合併搜尋,並同時加入「帳單手機」與「送貨手機」的條件,實現更精準且彈性的搜尋功能。透過這篇教學,你可以輕鬆優化訂單管理流程,快速找出符合條件的訂單。
1. 功能介紹
在實務操作中,我們常常需要依據顧客姓名或手機來查找訂單資料,但 WooCommerce 預設僅能逐一搜尋各個欄位,無法一次合併多個欄位進行搜尋。透過本文介紹的程式碼,你可以在後台訂單管理頁新增一個「使用姓名及手機搜尋」的搜尋框,並將以下條件一併搜尋:
- 姓名搜尋:
將_billing_last_name
(帳單姓氏)與_billing_first_name
(帳單名字)合併後搜尋。例如:若資料中姓氏為「王」、名字為「小明」,則輸入「王小明」即可找到該筆訂單。 - 手機搜尋:
同時比對_billing_phone
(帳單手機)與_shipping_phone
(送貨手機)兩個欄位,無論顧客填寫哪個手機號碼,都能正確搜尋到訂單。
2. 程式碼實作說明
(1) 新增搜尋欄位
利用 restrict_manage_posts
動作,在 WooCommerce 後台訂單頁面上方新增一個文字輸入框。此輸入框名稱設定為 billing_name
,並將 placeholder 文字設為「使用姓名及手機搜尋」,方便管理者快速進行關鍵字輸入。
(2) 加入 Meta 資料 JOIN
在自訂查詢中,我們需透過 SQL JOIN 方式,連結以下 meta 欄位:
_billing_last_name
_billing_first_name
_billing_phone
_shipping_phone
這樣就可以在查詢時同時讀取訂單中的姓名及手機資料。
(3) 自訂 WHERE 條件
透過 CONCAT() 函數將帳單姓氏與帳單名字串接,並以 LIKE
進行搜尋;同時加入比對手機欄位的條件,實現一個搜尋關鍵字能夠比對多個欄位的效果。
(4) 防止重複資料
由於 JOIN 可能導致訂單資料重複,故利用 GROUP BY
條件,以訂單 ID 為依據進行分組,確保查詢結果不會出現重複的訂單。
3. 程式碼範例
以下是完整的程式碼範例,可將其加入主題的 functions.php
或自訂外掛中:
// 在訂單列表上方新增「使用姓名及手機搜尋」的輸入框 add_action('restrict_manage_posts', 'custom_add_billing_name_search_field'); function custom_add_billing_name_search_field() { global $typenow; if ( 'shop_order' !== $typenow ) { return; } $billing_name = isset($_GET['billing_name']) ? sanitize_text_field($_GET['billing_name']) : ''; ?> <input type="text" name="billing_name" value="<?php echo esc_attr($billing_name); ?>" placeholder="使用姓名及手機搜尋" style="margin-left:10px;" /> <?php } // 加入姓名及手機搜尋所需的 meta 資料 JOIN function custom_join_order_meta_fields( $join ) { global $wpdb; // 連接帳單姓氏資料(_billing_last_name) $join .= " LEFT JOIN {$wpdb->postmeta} AS billing_last_name ON ({$wpdb->posts}.ID = billing_last_name.post_id AND billing_last_name.meta_key = '_billing_last_name') "; // 連接帳單名字資料(_billing_first_name) $join .= " LEFT JOIN {$wpdb->postmeta} AS billing_first_name ON ({$wpdb->posts}.ID = billing_first_name.post_id AND billing_first_name.meta_key = '_billing_first_name') "; // 連接帳單手機資料(_billing_phone) $join .= " LEFT JOIN {$wpdb->postmeta} AS billing_phone ON ({$wpdb->posts}.ID = billing_phone.post_id AND billing_phone.meta_key = '_billing_phone') "; // 連接送貨手機資料(_shipping_phone) $join .= " LEFT JOIN {$wpdb->postmeta} AS shipping_phone ON ({$wpdb->posts}.ID = shipping_phone.post_id AND shipping_phone.meta_key = '_shipping_phone') "; return $join; } // 修改 WHERE 條件,搜尋合併姓名或手機欄位 function custom_where_billing_name( $where, $search_value ) { global $wpdb; $like = '%' . $wpdb->esc_like( $search_value ) . '%'; $where .= $wpdb->prepare( " AND (CONCAT(billing_last_name.meta_value, billing_first_name.meta_value) LIKE %s OR billing_phone.meta_value LIKE %s OR shipping_phone.meta_value LIKE %s)", $like, $like, $like ); return $where; } // 避免因 JOIN 產生重複資料,設定 GROUP BY function custom_groupby_billing_name( $groupby ) { global $wpdb; $groupby = "{$wpdb->posts}.ID"; return $groupby; } // 修改後台訂單查詢,當「使用姓名及手機搜尋」有值時,套用自訂查詢條件 add_action('pre_get_posts', 'custom_filter_orders_by_billing_name'); function custom_filter_orders_by_billing_name( $query ) { if ( ! is_admin() || ! $query->is_main_query() ) { return; } if ( 'shop_order' !== $query->get('post_type') ) { return; } if ( isset($_GET['billing_name']) && ! empty( $_GET['billing_name'] ) ) { $billing_name = sanitize_text_field( $_GET['billing_name'] ); add_filter( 'posts_join', 'custom_join_order_meta_fields' ); add_filter( 'posts_where', function( $where ) use ( $billing_name ) { return custom_where_billing_name( $where, $billing_name ); }); add_filter( 'posts_groupby', 'custom_groupby_billing_name' ); } }
4. 實作成果
完成以上步驟後,當你在 WooCommerce 後台訂單管理頁面中,於「使用姓名及手機搜尋」輸入框中輸入例如「王小明」或「0912345678」時,系統會自動搜尋:
- 姓名欄位中合併後符合「王小明」的訂單。
- 或者手機欄位中含有「0912345678」的訂單。
這樣一來,就能大幅提升訂單管理與查詢的效率。
結語
透過自訂 WooCommerce 的後台查詢功能,不僅能解決預設搜尋功能的不足,還能依據實際需求,整合多個欄位進行搜尋。希望這篇文章能幫助你更靈活地管理訂單,並根據業務需求進一步進行客製化調整。如果你有任何問題或建議,歡迎在下方留言交流!