WordPress(PHP)中关联用户ID的嵌套元数组读写删除问题咨询
解决WordPress Post Meta中嵌套数组的访问与删除问题
看起来你当前的存储方式有个小问题:每次调用add_post_meta()都会新增一条独立的元数据记录,而不是把用户数据合并到同一个数组里——这就是为什么get_post_meta()返回的是一个包含多个子数组的数组,每个子数组对应一次add_post_meta的调用。我们先修正这个基础问题,再解决你的两个核心需求。
第一步:修正数组的存储方式
首先,应该使用update_post_meta()替代add_post_meta()来存储数组,这样每次都是更新同一个tmp键下的完整数组,而不是新增条目:
// 先获取已有的数组(如果不存在则返回空数组) $existing_tmp = get_post_meta($post_id, 'tmp', true) ?: []; // 添加当前用户的数据到数组中 $existing_tmp[get_current_user_id()] = ['id' => 5, 'ref' => true]; // 更新元数据 update_post_meta($post_id, 'tmp', $existing_tmp);
这样存储后,调用get_post_meta($post_id, 'tmp', true)会直接得到一个包含所有用户数据的单个数组,比如:
Array ( [32] => Array ( [id] => 10 [ref] => ) [44] => Array ( [id] => 20 [ref] => ) )
问题1:直接访问当前用户的数组条目
有了正确的存储结构后,不用任何循环就能直接通过用户ID访问对应数据:
// 获取完整的用户数据数组 $tmp = get_post_meta($post_id, 'tmp', true) ?: []; // 获取当前用户ID $current_user_id = get_current_user_id(); // 直接访问,用null合并运算符处理用户不存在的情况 $current_user_data = $tmp[$current_user_id] ?? null; // 示例输出 if ($current_user_data) { error_log(print_r($current_user_data, true)); }
如果因为历史原因已经用add_post_meta()存了多条数据,需要先合并成一个数组再处理:
// 获取所有旧的元数据条目(数组的数组) $old_tmp_entries = get_post_meta($post_id, 'tmp'); // 合并成单个数组 $merged_tmp = []; foreach ($old_tmp_entries as $entry) { $merged_tmp = array_merge($merged_tmp, $entry); } // 更新为合并后的数组,并删除旧的多条元数据 update_post_meta($post_id, 'tmp', $merged_tmp); delete_post_meta($post_id, 'tmp'); // 这会删除所有旧的重复条目,只保留更新后的那一条
合并完成后就可以用上面的方式直接访问了。
问题2:删除指定用户ID的条目
同样基于正确的存储结构,我们可以先获取完整数组,删除指定键,再更新回去:
// 获取完整数组 $tmp = get_post_meta($post_id, 'tmp', true) ?: []; // 指定要删除的用户ID $user_id_to_delete = 44; // 如果该用户存在则删除 if (isset($tmp[$user_id_to_delete])) { unset($tmp[$user_id_to_delete]); // 更新元数据(如果数组为空,可以选择删除整个元数据键) if (!empty($tmp)) { update_post_meta($post_id, 'tmp', $tmp); } else { delete_post_meta($post_id, 'tmp'); // 数组为空时清理掉元数据 } }
执行后,get_post_meta($post_id, 'tmp', true)就会返回只包含用户32的数组:
Array ( [32] => Array ( [id] => 10 [ref] => ) )
为什么不用delete_post_meta()直接处理嵌套数组?
WordPress的delete_post_meta()是针对整个元数据键或特定值的,它无法直接操作嵌套数组里的单个元素。所以正确的做法是先把完整数组取出来,修改后再存回去,这是处理嵌套元数据数组的标准方式。
内容的提问来源于stack exchange,提问作者Mr. Jo
相关产品推荐
相关产品推荐

