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

WordPress AJAX增删用户元数据异常:产品收藏无法移除ID

你遇到的问题确实出在unset($fav_products[$product_id]);这行代码上。原因是你添加收藏时用$fav_products[] = $product_id;的方式追加元素,此时数组的键是自动生成的数字索引(比如0、1、2...),而不是产品ID本身。当你用产品ID作为键去执行unset时,数组里根本没有这个键,所以移除操作无效,数组内容和修改前一致,导致update_user_meta因为新旧元数据相同返回false,触发错误提示。

修复方案

  1. 正确定位并移除元素:用array_search()找到产品ID在数组中的对应键,再执行unset操作
  2. 提前做权限检查:把权限验证逻辑放到代码开头,避免做无效的数组操作
  3. 统一产品ID类型:将product_id转为整数,避免字符串和整数类型不匹配导致查找失败

修改后的完整函数代码:

function update_user_meta_ajax() {
    // 先做权限检查,避免无用操作
    $user_id = isset( $_POST['user_id'] ) ? intval( $_POST['user_id'] ) : 0;
    if (! current_user_can('edit_user', $user_id)) {
        wp_send_json_error(array('message' => 'Insufficient permissions.'));
    }

    $product_id = isset( $_POST['product_id'] ) ? intval( $_POST['product_id'] ) : 0;
    $meta_key = isset( $_POST['meta_key'] ) ? sanitize_text_field( $_POST['meta_key'] ) : '';
    $meta_value = isset( $_POST['meta_value'] ) ? sanitize_text_field( $_POST['meta_value'] ) : '';

    // 获取已保存的收藏数组
    $fav_products = get_user_meta($user_id, 'fav_products', true);
    
    // 初始化空数组(如果元数据不存在)
    $fav_products = is_array($fav_products) ? $fav_products : array();

    // 添加或移除收藏
    if($meta_value == 'yes'){
        // 避免重复添加相同产品ID
        if(!in_array($product_id, $fav_products)){
            $fav_products[] = $product_id; 
        }
    }else{
        // 找到产品ID在数组中的键
        $key = array_search($product_id, $fav_products);
        if($key !== false){
            unset($fav_products[$key]);
            // 可选:重新索引数组(如果需要保持连续的数字键)
            $fav_products = array_values($fav_products);
        }
    }

    if (update_user_meta($user_id, $meta_key, $fav_products)) {
        wp_send_json_success();
    } else {
        wp_send_json_error(array('message' => 'Failed to update user meta.'));
    }

    wp_die();
}

关键修改点说明

  • 权限检查前置:一开始就验证用户权限,避免后续做无效的数组操作
  • 产品ID转整数:确保和数组中存储的ID类型一致,避免array_search因为类型不匹配找不到元素
  • 移除逻辑优化:用array_search精准定位元素的键,仅当找到时才执行unset;可选的array_values可以重新整理数组索引,避免出现断号的情况
  • 添加去重:新增了重复添加的判断,防止同一个产品ID被多次加入收藏数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:35:03