WordPress自定义函数问题:循环存ID入数组并更新ACF字段(ACF+WooCommerce)
多方寻找解决方案,目前接近完成但仍无法完全实现功能。
背景
涉及3种自定义文章类型:League(联盟)、User(用户)、Product(产品)。需要实现用户在WooCommerce下单后自动加入对应League:League由产品元数据中ACF创建的自定义关联字段确定(返回League ID),再通过ACF的update_field方法更新用户元数据中的关联字段。
期望流程
- 用户购买关联League A的产品A
- WooCommerce从订单/产品数据中获取League ID
- 使用该ID更新用户表中的ACF字段
- 用户成功加入对应League
问题描述
现有代码若直接用$newvalue替换update_field中的$value,会完全覆盖用户原有字段值。尝试先获取现有值存入数组再添加新值,但循环中获取的League ID无法正确存入数组——手动向数组添加固定ID(如125、1768)时函数可正常执行,循环获取的ID却不行。
现有代码
add_action( 'woocommerce_payment_complete', 'action_payment_complete', 10, 2 ); function action_payment_complete( $order_id, $order ) { $order = wc_get_order( $order_id ); $items = $order->get_items(); $user_id = $order->get_user_id(); $acf_id = 'user_' . $user_id . ''; // 获取当前字段值 $value = get_field('field_61b9677550d4c', $user_id, false); foreach ( $items as $item) { $product_id = $item->get_product_id(); $newvalue = get_field('field_63128891a83f9', $product_id, false); } $value[] = $newvalue; update_field('field_61b9677550d4c',$value, $acf_id); }
手动添加ID可正常运行的代码示例
add_action( 'woocommerce_payment_complete', 'action_payment_complete', 10, 2 ); function action_payment_complete( $order_id, $order ) { $order = wc_get_order( $order_id ); $items = $order->get_items(); $user_id = $order->get_user_id(); $acf_id = 'user_' . $user_id . ''; // 获取当前字段值 $value = get_field('field_61b9677550d4c', $user_id, false); foreach ( $items as $item) { $product_id = $item->get_product_id(); $newvalue = get_field('field_63128891a83f9', $product_id, false); } $value[] = 125; $value[] = 1768; update_field('field_61b9677550d4c',$value, $acf_id); }
解决方案
问题出在循环中每次覆盖$newvalue变量,最终仅添加了最后一个产品的League ID;同时未处理现有值非数组、重复League ID的情况。修正后的代码如下:
add_action( 'woocommerce_payment_complete', 'action_payment_complete', 10, 2 ); function action_payment_complete( $order_id, $order ) { // 跳过访客订单 if ( !$order->get_user_id() ) return; $order = wc_get_order( $order_id ); $items = $order->get_items(); $user_id = $order->get_user_id(); $acf_user_key = 'user_' . $user_id; $user_league_field = 'field_61b9677550d4c'; $product_league_field = 'field_63128891a83f9'; // 获取用户现有League ID,确保是数组格式 $existing_leagues = get_field( $user_league_field, $user_id, false ); $existing_leagues = is_array( $existing_leagues ) ? $existing_leagues : ( !empty( $existing_leagues ) ? [ $existing_leagues ] : [] ); $new_leagues = []; foreach ( $items as $item ) { $product_id = $item->get_product_id(); $league_id = get_field( $product_league_field, $product_id, false ); // 仅添加有效且未重复的League ID if ( !empty( $league_id ) && !in_array( $league_id, $existing_leagues ) && !in_array( $league_id, $new_leagues ) ) { $new_leagues[] = $league_id; } } // 合并现有与新League ID $updated_leagues = array_merge( $existing_leagues, $new_leagues ); // 更新ACF字段 if ( !empty( $updated_leagues ) ) { update_field( $user_league_field, $updated_leagues, $acf_user_key ); } }
关键修正点
- 循环内收集所有League ID:初始化
$new_leagues数组,循环中把每个产品的有效League ID添加进去,避免覆盖 - 处理数组格式:确保现有值是数组(ACF可能返回单个值或空)
- 去重逻辑:避免重复添加同一个League ID(用户已存在或订单内多个产品关联同一League)
- 访客订单判断:跳过未登录用户的订单,避免无效操作
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

