求助:查询元数据数组含当前文章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
相关产品推荐
相关产品推荐

