WooCommerce 後台訂單搜尋功能強化:合併姓名與手機搜尋

在 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 的後台查詢功能,不僅能解決預設搜尋功能的不足,還能依據實際需求,整合多個欄位進行搜尋。希望這篇文章能幫助你更靈活地管理訂單,並根據業務需求進一步進行客製化調整。如果你有任何問題或建議,歡迎在下方留言交流!

瀏覽次數:5