WooCommerce下单后累加更新user_meta中meta_first值的需求
WooCommerce下单后累加更新用户user_meta的实现方案
问题说明
需要通过woocommerce_thankyou钩子实现:用户下单后,用产品的meta_first(数字输入框)和meta_second(下拉选择框)值更新用户user_meta。其中meta_first需累加用户现有值(比如第一次下单产品meta_first为10,用户meta_first变为10;第二次下单产品meta_first为20,用户meta_first更新为10+20=30),meta_second保持原有覆盖逻辑(若需其他逻辑可自行调整)。
现有代码的问题
原代码存在以下问题导致需求无法实现:
- 函数定义语法错误,缺少
function关键字 - 重复获取用户ID,且未判断用户是否登录(访客订单无需处理)
- 变量名不匹配:定义了
$get_meta_first,却使用未定义的$meta_first meta_first直接覆盖用户现有值,未做累加处理- 未考虑产品变体的元值(变体产品应优先读取变体自身的元数据)
修正后的代码
// 下单完成后累加更新用户user_meta add_action('woocommerce_thankyou', 'wp_user_meta_update'); function wp_user_meta_update($order_id) { // 获取订单对象 $order = wc_get_order($order_id); if (!$order) return; // 获取订单关联的用户ID,仅处理登录用户 $user_id = $order->get_user_id(); if (!$user_id) return; // 获取订单中的所有商品 $items = $order->get_items(); if (empty($items)) return; foreach ($items as $item) { $product = $item->get_product(); if (!$product) continue; // 获取产品/变体的meta_first值,优先取变体的元数据 $meta_first = $product->get_meta('meta_first', true); // 转为数字,确保累加计算正确 $meta_first = is_numeric($meta_first) ? (int)$meta_first : 0; // 获取用户当前的meta_first值,默认0 $current_meta_first = get_user_meta($user_id, 'meta_first', true); $current_meta_first = is_numeric($current_meta_first) ? (int)$current_meta_first : 0; // 累加后更新用户meta_first update_user_meta($user_id, 'meta_first', $current_meta_first + $meta_first); // 处理meta_second,优先取变体的元数据,直接覆盖用户现有值 $meta_second = $product->get_meta('meta_second', true); if (!empty($meta_second)) { update_user_meta($user_id, 'meta_second', $meta_second); } } }
关键修改说明
- 语法修正:补全
function关键字,规范函数定义 - 用户判断:仅处理登录用户的订单(访客无user_id,跳过)
- 元值获取优化:使用
$product->get_meta()统一获取产品/变体的元数据,优先读取变体自身的元值 - 累加逻辑实现:先获取用户当前的
meta_first值,转为数字后与当前产品的meta_first相加,再更新 - 变量安全处理:对元值做数字校验,避免非数值导致计算错误
- 空值判断:对订单、商品、元值做空值检查,避免报错
内容的提问来源于stack exchange,提问作者Rohit kc
相关产品推荐
相关产品推荐

