打造更靈活的 WooCommerce 訂單搜尋體驗:結合客戶姓與名搜尋

在 WooCommerce 後台管理訂單時,預設搜尋功能僅能分別搜尋客戶的姓氏或名字。但在實際應用中,許多用戶希望能夠直接輸入「王小明」這樣完整的姓名來查詢訂單資料。本文將介紹如何透過自訂程式碼,將 billing_last_namebilling_first_name 兩個欄位合併,進而改善 WooCommerce 訂單搜尋的使用體驗。


為什麼需要合併搜尋?

通常在 WooCommerce 訂單資料中,客戶的姓氏與名字分別存放在 _billing_last_name_billing_first_name 兩個 meta 欄位中。如果分別搜尋,當你輸入「王小明」時,由於資料是分開存放,搜尋結果可能無法正確匹配到資料。藉由合併這兩個欄位,我們可以讓搜尋功能更符合使用者習慣,直接輸入完整姓名即可快速查詢到相關訂單。


功能介紹

這段自訂程式碼主要透過 WordPress 的 posts_search 過濾器,對 WooCommerce 訂單搜尋做出以下調整:

  • 合併欄位搜尋: 利用 SQL 的 CONCAT 函數,將 _billing_last_name_billing_first_name 合併後,再以模糊比對的方式進行搜尋。
  • 安全性考量: 使用 esc_likeesc_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 );

程式碼解析:

  1. 條件判斷:
    • 檢查是否位於後台管理介面,以及是否為訂單 (shop_order) 的搜尋。只有滿足條件時,才會進行後續的搜尋條件擴充。
  2. 處理搜尋字串:
    • 利用 esc_likeesc_sql 來處理搜尋字串,避免 SQL 注入風險,並對特殊字元做處理。
  3. 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 訂單管理上的應用有所幫助,也歡迎大家根據實際需求進一步客製化搜尋邏輯。

瀏覽次數:36