如何自訂 WordPress 使用者搜尋功能,支援自定義欄位

在 WordPress 中,預設的使用者搜尋功能僅限於查詢特定欄位,例如使用者名稱或電子郵件。然而,在某些情況下,您可能希望搜尋自定義的欄位資料,例如電話號碼或其他特定的使用者資訊。本篇文章將透過範例程式碼,教您如何讓 WordPress 支援搜尋自定義的使用者欄位。


為什麼需要自訂使用者搜尋?

WordPress 預設並不支援透過自定義欄位(例如電話號碼)搜尋使用者資料。這對於擁有大量自定義欄位資料的網站管理者來說,是一個使用上的限制。
透過以下教學,我們將增加搜尋 reg_phone(使用者註冊電話號碼欄位)的支援功能,讓管理者能在後台輕鬆搜尋相關使用者資料。


自訂使用者搜尋的程式碼範例

以下程式碼使用 WordPress 的 pre_user_query 動作鉤子,來擴展後台的使用者搜尋功能:

add_action('pre_user_query', 'project_pre_user_search');
function project_pre_user_search($query) {
    global $wpdb;
    global $pagenow;

    // 確保此功能僅在後台使用者列表中執行
    if (is_admin() && 'users.php' === $pagenow && !empty($_REQUEST['s'])) {
        // 過濾搜尋的關鍵字,避免 SQL 注入
        $search_term = esc_sql($_REQUEST['s']);

        // 確保不覆蓋原本的查詢條件
        $query->query_fields = 'DISTINCT ' . $query->query_fields;
        $query->query_from .= " LEFT JOIN {$wpdb->usermeta} ON {$wpdb->usermeta}.user_id = {$wpdb->users}.ID";
        $query->query_where .= $wpdb->prepare(
            " OR ({$wpdb->usermeta}.meta_key = 'reg_phone' AND {$wpdb->usermeta}.meta_value LIKE %s)",
            '%' . $search_term . '%'
        );
    }
    return $query;
}

程式碼解說

  1. 動作鉤子(Action Hook):
    使用 pre_user_query 鉤子,在執行使用者查詢之前攔截並修改 SQL 查詢。

  2. 後台頁面檢查:
    確保程式碼僅在後台使用者頁面(users.php)中執行。

  3. 搜尋關鍵字過濾:
    使用 esc_sql() 函數清理輸入,避免 SQL 注入風險。

  4. 連接使用者欄位表:
    在 SQL 中連接 usermeta 表,以查詢自定義欄位。

  5. 新增搜尋條件:
    在查詢的 WHERE 條件中,加入對 reg_phone 欄位的模糊搜尋。


如何使用這段程式碼?

  1. 將程式碼加入到您主題的 functions.php 檔案,或自訂的外掛中。

  2. 確保您已有名為 reg_phone 的自定義使用者欄位,且欄位中儲存了可搜尋的資料(例如電話號碼)。

  3. 進入 WordPress 後台,點擊「使用者」頁面。

  4. 在搜尋框中輸入關鍵字,即可搜尋 reg_phone 欄位中的匹配內容。


此功能的優點

  • 靈活性: 支援搜尋不在預設欄位中的自定義資料。

  • 安全性: 使用 WordPress 原生函數處理輸入,減少潛在風險。

  • 可擴展性: 稍作修改即可支援更多自定義欄位。


結論
透過這段程式碼,您可以輕鬆擴展 WordPress 的使用者搜尋功能,搜尋後台中自定義欄位的資料,極大提升管理效率。如果您需要進一步擴展功能,例如支援多個欄位或提供進階搜尋界面,建議開發專屬的管理工具。

發佈留言