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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:57:49