WordPress AJAX增删用户元数据异常:产品收藏无法移除ID
你遇到的问题确实出在unset($fav_products[$product_id]);这行代码上。原因是你添加收藏时用$fav_products[] = $product_id;的方式追加元素,此时数组的键是自动生成的数字索引(比如0、1、2...),而不是产品ID本身。当你用产品ID作为键去执行unset时,数组里根本没有这个键,所以移除操作无效,数组内容和修改前一致,导致update_user_meta因为新旧元数据相同返回false,触发错误提示。
修复方案
- 正确定位并移除元素:用
array_search()找到产品ID在数组中的对应键,再执行unset操作 - 提前做权限检查:把权限验证逻辑放到代码开头,避免做无效的数组操作
- 统一产品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
相关产品推荐
相关产品推荐

