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

WooCommerce结账页ACF字段验证及已有值加载问题求助

WooCommerce + ACF 结账页自定义字段问题解决

核心问题概述

  1. ACF标记为必填的结账自定义字段,仅前端显示星号,无实际验证逻辑,用户可跳过填写完成结账
  2. 已登录用户曾填写过这些ACF字段,但结账页无法自动加载已有值,需重复填写

问题1:ACF必填字段未验证

当前字段显示代码

add_action( 'woocommerce_after_order_notes', 'checkout_display_acf_field' ); 
function checkout_display_acf_field() { 
    $acf_field_key_arr = array ( // 填入需要的字段Key
        'field_663d53424eeb3',
        'field_663d5100cb98f',
        'field_663d5144be5b5',
        'field_663d516a53a0f'
    );
    
    // 循环渲染每个字段
    foreach ( $acf_field_key_arr as $acf_field_key ) {
        acf_form( array(
            'form' => false, 
            'fields' => array( $acf_field_key )
        ) );
    }
}

尝试过的无效验证代码

方案1:woocommerce_after_checkout_validation 钩子

//* Validate custom checkout fields
add_action( 'woocommerce_after_checkout_validation', 'checkout_field_validation', 20, 2 );
function checkout_field_validation( $data, $errors ){

            if ( empty( $_POST['field_663d53424eeb3'] ) )
                $errors->add( 'field_663d53424eeb3',  __( "Please fill in the participant $j full name" ), 'error' );

            if ( empty( $_POST['field_663d5100cb98f'] ) )
                $errors->add( 'field_663d5100cb98f',  __( "Please fill in the participant $j email address" ), 'error' );
        }

方案2:另一个woocommerce_after_checkout_validation实现

add_action( 'woocommerce_after_checkout_validation', 'my_custom_checkout_field_process' );

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['field_663d53424eeb3'] ) {
        wc_add_notice( esc_html__( 'Please enter something into this new shiny field.' ), 'error' );
    }
}

方案3:ACF验证钩子

add_filter('acf/validate_value/key=field_663d53424eeb3', 'validate_email_field', 20, 4);
function validate_email_field( $valid, $value, $field, $input ) {
  if (!$valid) {
    return $valid;
  }
  if( email_exists( $value ) ) {
    $valid = 'email exists';
  }
   return $valid;
}

有效解决方案

问题根源:FunnelKit的结账流程可能绕过了默认WooCommerce验证,且ACF的acf_form在非ACF原生表单中不会自动触发验证。需结合ACF字段的required属性,手动在WooCommerce结账验证钩子中检查每个字段:

add_action( 'woocommerce_after_checkout_validation', 'acf_checkout_fields_validation', 10, 2 );
function acf_checkout_fields_validation( $data, $errors ) {
    // 定义需要验证的ACF字段Key和对应的错误提示
    $required_fields = array(
        'field_663d53424eeb3' => '请填写参与者全名',
        'field_663d5100cb98f' => '请填写参与者邮箱地址',
        'field_663d5144be5b5' => '请填写[对应字段名称]',
        'field_663d516a53a0f' => '请填写[对应字段名称]'
    );

    foreach ( $required_fields as $field_key => $error_msg ) {
        // 获取ACF字段对象,确认是否标记为必填
        $field = get_field_object( $field_key );
        if ( $field['required'] && empty( $_POST[ $field['name'] ] ) ) {
            $errors->add( 'acf_field_error', __( $error_msg, 'woocommerce' ), 'error' );
        }
    }
}

说明:

  • 使用$field['name']而非字段Key,因为ACF前端表单提交的是字段名称
  • 通过get_field_object确认字段是否真的设置为必填,避免硬编码逻辑
  • 错误提示可根据实际字段名称修改

问题2:已登录用户无法自动加载ACF字段值

尝试过的无效代码

方案1:acf/prepare_field钩子

add_action('acf/prepare_field/key=field_663d53424eeb3', 'populate_how_did_you_hear');

function populate_how_did_you_hear($field) {
  $field['value'] = get_field('field_663d53424eeb3', 'user_'.$user->ID);
  return $field;
}

方案2:acf/load_field钩子

add_filter('acf/load_field/key=field_663d53424eeb3', 'set_default_user', 20, 1);
function set_default_user($field) {
  $field['default_value'] = get_field('field_663d53424eeb3', 'user_'.$user->ID);
  return $field;
}

有效解决方案

问题根源:代码中未正确获取当前登录用户ID,且未针对所有字段统一处理:

// 为每个ACF结账字段加载用户已保存的值
add_filter('acf/load_field', 'load_user_acf_values_for_checkout', 10, 1);
function load_user_acf_values_for_checkout( $field ) {
    // 仅在结账页且用户登录时生效
    if ( is_checkout() && is_user_logged_in() ) {
        // 定义需要加载值的字段Key列表
        $target_fields = array(
            'field_663d53424eeb3',
            'field_663d5100cb98f',
            'field_663d5144be5b5',
            'field_663d516a53a0f'
        );

        if ( in_array( $field['key'], $target_fields ) ) {
            $current_user_id = get_current_user_id();
            // 获取用户已保存的字段值
            $saved_value = get_field( $field['key'], 'user_' . $current_user_id );
            if ( $saved_value ) {
                $field['value'] = $saved_value;
            }
        }
    }
    return $field;
}

说明:

  • 用acf/load_field全局钩子,一次性处理所有目标字段
  • 先判断是否在结账页且用户已登录,避免不必要的逻辑执行
  • 通过get_current_user_id()正确获取当前用户ID
  • 若用户有保存的值,直接赋值给字段的value属性,前端会自动填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:27:07