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

求助:查询元数据数组含当前文章ID的WP用户返回空数组

解决WordPress查询包含特定文章ID的用户元数组问题

你遇到的核心问题是:WordPress会把数组类型的用户元序列化成字符串存储在数据库中,而默认的get_users元查询是精确匹配,自然无法匹配到序列化后的字符串内容,所以返回空数组。下面给你两种可行的解决方案,优先推荐第二种更符合WordPress规范的方式:


方案1:临时修复查询逻辑(适配序列化数组)

针对已经存储的序列化数组,我们可以通过LIKE查询匹配序列化后的格式来定位目标用户。注意要精准匹配,避免误判类似100这种包含10的数值:

$current_post_id = 10; // 当前文章ID
$users = get_users(array(
    'meta_query' => array(
        array(
            'key'     => 'training_event_attending',
            'value'   => 'i:' . $current_post_id . ';', // 匹配序列化后的整数格式
            'compare' => 'LIKE',
        ),
    ),
));

说明

  • 整数数组序列化后的格式是i:10;,用这个作为匹配值可以精准定位数组中包含该ID的条目,不会误匹配100这类数值。
  • 缺点:LIKE查询无法利用数据库索引,用户量较大时性能会受影响。

方案2:优化用户元存储方式(推荐)

WordPress支持同一个元键存储多个值,我们可以把每个文章ID作为单独的用户元条目存储,这样查询更高效,也更符合WordPress的设计规范。

步骤1:修改存储逻辑

原来的update_user_meta存储数组的方式,替换为add_user_meta添加单值:

// 添加单个事件ID到用户元(false允许重复元键)
add_user_meta($current_user->ID, 'training_event_attending', 10, false);

步骤2:高效查询用户

现在可以用精确匹配查询,性能大幅提升:

$current_post_id = 10;
$users = get_users(array(
    'meta_query' => array(
        array(
            'key'     => 'training_event_attending',
            'value'   => $current_post_id,
            'compare' => '=',
            'type'    => 'NUMERIC', // 指定数值类型,匹配更精准
        ),
    ),
));

迁移现有数据(可选)

如果已经有大量数组格式的旧数据,可以用以下脚本批量转换为多值用户元(运行前请备份数据库):

// 遍历所有用户迁移数据
$all_users = get_users();
foreach ($all_users as $user) {
    $events = get_user_meta($user->ID, 'training_event_attending', true);
    if (is_array($events) && !empty($events)) {
        // 删除旧的数组元数据
        delete_user_meta($user->ID, 'training_event_attending');
        // 逐个添加事件ID作为单独元数据
        foreach ($events as $event_id) {
            add_user_meta($user->ID, 'training_event_attending', $event_id, false);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:41:19