在 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;
}
程式碼解說
-
動作鉤子(Action Hook):
使用pre_user_query
鉤子,在執行使用者查詢之前攔截並修改 SQL 查詢。 -
後台頁面檢查:
確保程式碼僅在後台使用者頁面(users.php
)中執行。 -
搜尋關鍵字過濾:
使用esc_sql()
函數清理輸入,避免 SQL 注入風險。 -
連接使用者欄位表:
在 SQL 中連接usermeta
表,以查詢自定義欄位。 -
新增搜尋條件:
在查詢的WHERE
條件中,加入對reg_phone
欄位的模糊搜尋。
如何使用這段程式碼?
-
將程式碼加入到您主題的
functions.php
檔案,或自訂的外掛中。 -
確保您已有名為
reg_phone
的自定義使用者欄位,且欄位中儲存了可搜尋的資料(例如電話號碼)。 -
進入 WordPress 後台,點擊「使用者」頁面。
-
在搜尋框中輸入關鍵字,即可搜尋
reg_phone
欄位中的匹配內容。
此功能的優點
-
靈活性: 支援搜尋不在預設欄位中的自定義資料。
-
安全性: 使用 WordPress 原生函數處理輸入,減少潛在風險。
-
可擴展性: 稍作修改即可支援更多自定義欄位。
結論
透過這段程式碼,您可以輕鬆擴展 WordPress 的使用者搜尋功能,搜尋後台中自定義欄位的資料,極大提升管理效率。如果您需要進一步擴展功能,例如支援多個欄位或提供進階搜尋界面,建議開發專屬的管理工具。