You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WP_User_Query执行后get_user_meta()返回空数组问题求助

问题:WP_User_Query执行后get_user_meta返回空数组

在自定义模板中调用get_user_meta()时出现异常:先通过WP_User_Query获取目标用户集合后,调用get_user_meta($userId)返回空数组;但将get_user_meta(<指定用户ID>)放在WP_User_Query执行前,却能正常获取该用户的所有元数据。

问题代码(返回空数组)

function get_users_lists(){
    $export_user_args = array(
                        'role__in' => array('alumnus', 'fellow'),
                        'exclude' => array(7, 60),
                        'orderby' => 'user_login',
                        'order' => 'ASC'
                     );
    
    $export_user_lists = new WP_User_Query($export_user_args);
    $userMeta = get_user_meta(5884);
            
    print_r($userMeta); exit;
    return $userMeta;
}

正常工作的代码(可获取元数据)

function get_users_lists(){
    $export_user_args = array(
                        'role__in' => array('alumnus', 'fellow'),
                        'exclude' => array(7, 60),
                        'orderby' => 'user_login',
                        'order' => 'ASC'
                     );
    
    $userMeta = get_user_meta(5884);
            
    print_r($userMeta); exit;

    $export_user_lists = new WP_User_Query($export_user_args);
    return $userMeta;
}

问题分析

这个异常和WordPress的用户元数据缓存机制、WP_User_Query的执行逻辑直接相关:

  • WP_User_Query执行时,只会将符合查询条件的用户元数据预加载到全局缓存,同时可能清理不符合条件用户的缓存条目。如果目标用户(ID 5884)不在本次查询的结果集中,WordPress不会预加载其元数据,甚至可能清除已有的缓存,导致后续get_user_meta优先读取缓存时返回空。
  • 部分主题或插件可能在WP_User_Query执行的钩子(如pre_user_query、user_query)中修改元数据查询逻辑,干扰了后续get_user_meta的正常执行。

解决方案

方案1:清除目标用户缓存后重新获取

手动清除目标用户的元数据缓存,强制get_user_meta从数据库重新读取:

function get_users_lists(){
    $export_user_args = array(
                        'role__in' => array('alumnus', 'fellow'),
                        'exclude' => array(7, 60),
                        'orderby' => 'user_login',
                        'order' => 'ASC'
                     );
    
    $export_user_lists = new WP_User_Query($export_user_args);
    
    // 清除目标用户的元数据缓存
    delete_user_meta_cache(5884);
    // 重新获取元数据
    $userMeta = get_user_meta(5884);
            
    print_r($userMeta); exit;
    return $userMeta;
}

方案2:确保目标用户被包含在WP_User_Query结果中

检查目标用户(ID 5884)的角色是否属于alumnus或fellow,且不在exclude列表中。如果用户被意外排除,调整查询参数让其被包含进结果集,这样WP_User_Query会自动预加载该用户的元数据到缓存,后续get_user_meta即可正常读取。

方案3:直接通过数据库查询获取(兜底方案)

绕过WordPress的缓存和钩子机制,直接查询wp_usermeta表获取元数据:

function get_users_lists(){
    $export_user_args = array(
                        'role__in' => array('alumnus', 'fellow'),
                        'exclude' => array(7, 60),
                        'orderby' => 'user_login',
                        'order' => 'ASC'
                     );
    
    $export_user_lists = new WP_User_Query($export_user_args);
    
    global $wpdb;
    // 直接查询数据库
    $rawMeta = $wpdb->get_results(
        $wpdb->prepare("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = %d", 5884),
        ARRAY_A
    );
    
    // 转换为和get_user_meta一致的数组格式
    $userMeta = array();
    foreach($rawMeta as $meta){
        $key = $meta['meta_key'];
        $value = maybe_unserialize($meta['meta_value']);
        if(!isset($userMeta[$key])){
            $userMeta[$key] = array();
        }
        $userMeta[$key][] = $value;
    }
            
    print_r($userMeta); exit;
    return $userMeta;
}

内容的提问来源于stack exchange,提问作者Manish Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:48:14