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

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 );
    }
}

关键修正点

  1. 循环内收集所有League ID:初始化$new_leagues数组,循环中把每个产品的有效League ID添加进去,避免覆盖
  2. 处理数组格式:确保现有值是数组(ACF可能返回单个值或空)
  3. 去重逻辑:避免重复添加同一个League ID(用户已存在或订单内多个产品关联同一League)
  4. 访客订单判断:跳过未登录用户的订单,避免无效操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:36:50