如何在WordPress后台让用户自定义地址列支持WP_User_Query搜索
你直接将billing_address加入search_columns参数不生效,是因为该参数仅支持wp_users系统表的原生字段,而账单地址存储在用户元数据表的billing_state、billing_city、billing_postcode三个独立字段中,不属于用户表原生字段,WP_User_Query默认不会检索这类自定义元数据。
具体实现方案
分两种场景适配,按需选择即可:
场景1:适配WordPress后台自带的用户列表搜索
直接在主题functions.php或自定义插件中加入以下代码,即可让后台用户搜索同时匹配用户名、邮箱、三个账单地址字段:
add_action('pre_get_users', 'add_billing_fields_to_user_search'); function add_billing_fields_to_user_search($query) { // 仅在后台用户列表页面的搜索请求中生效 global $pagenow; if (!is_admin() || $pagenow !== 'users.php' || empty($query->query_vars['search'])) { return; } // 去掉搜索关键词默认的前后%,后面自定义匹配规则 $search_keyword = trim($query->query_vars['search'], '*%'); if (empty($search_keyword)) { return; } // 新增元数据查询条件,匹配三个账单字段 $meta_query = array( 'relation' => 'OR', array( 'key' => 'billing_state', 'value' => $search_keyword, 'compare' => 'LIKE' ), array( 'key' => 'billing_city', 'value' => $search_keyword, 'compare' => 'LIKE' ), array( 'key' => 'billing_postcode', 'value' => $search_keyword, 'compare' => 'LIKE' ) ); // 将元查询和原有的用户表查询做OR关联,实现联合搜索 $query->set('meta_query', array( 'relation' => 'OR', $meta_query, // 保留原有的用户表字段搜索逻辑 array( 'relation' => 'OR', array( 'key' => 'user_login', 'value' => $search_keyword, 'compare' => 'LIKE' ), array( 'key' => 'user_email', 'value' => $search_keyword, 'compare' => 'LIKE' ) ) )); // 清空原search参数,避免重复查询 $query->set('search', ''); }
场景2:自定义调用WP_User_Query时支持账单地址搜索
如果你是自己写查询逻辑,不需要修改全局钩子,直接在查询参数中加入meta_query即可,示例代码如下:
$search_keyword = '你要搜索的关键词'; $args = array( 'number' => 200, 'fields' => 'all', 'meta_query' => array( 'relation' => 'OR', // 匹配账单地址字段 array( 'key' => 'billing_state', 'value' => $search_keyword, 'compare' => 'LIKE' ), array( 'key' => 'billing_city', 'value' => $search_keyword, 'compare' => 'LIKE' ), array( 'key' => 'billing_postcode', 'value' => $search_keyword, 'compare' => 'LIKE' ), // 匹配用户名、邮箱 array( 'key' => 'user_login', 'value' => $search_keyword, 'compare' => 'LIKE' ), array( 'key' => 'user_email', 'value' => $search_keyword, 'compare' => 'LIKE' ) ) ); $zip_search = new WP_User_Query($args);
注意事项
- 你原来代码里
search_columns参数中的billing_address可以删除,该参数不支持自定义元字段,加了也不会生效 - 如果需要精确匹配,把代码中的
compare参数值从LIKE改成=即可
内容的提问来源于stack exchange,提问作者Cyberdelic Soup
相关产品推荐
相关产品推荐

