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

WooCommerce编辑账户必填字段无法接受0值的解决方案咨询

WooCommerce账户自定义必填字段无法接受0值的解决方案

问题描述

我为WooCommerce账户详情页添加了自定义字段,并通过woocommerce_save_account_details_required_fields钩子将其设为必填,功能整体正常,但输入0时会被判定为空值,希望通过PHP钩子而非自定义JavaScript解决该兼容问题。

原实现代码

add_action( 'woocommerce_edit_account_form', 'andom_add_id_field_to_edit_account_form' );
function andom_add_id_field_to_edit_account_form() {
    $user = wp_get_current_user();
    ?>
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
      <label for="id_card"><?php _e( 'Id Card ', 'woocommerce' ); ?><span class="required">*</span></label>
      <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="id_card" id="id_card" value="<?php echo esc_attr( $user->id_card ); ?>" required />
    </p>
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
      <label for="adults"><?php _e( 'Adults in your household ', 'woocommerce' ); ?><span class="required">*</span></label>
      <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="adults" id="adults" value="<?php echo esc_attr( $user->adults ); ?>" required/>
    </p>
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
      <label for="children"><?php _e( 'Children >= 18 in your household ', 'woocommerce' ); ?><span class="required">*</span></label>
      <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="children" id="children" value="<?php echo esc_attr( $user->children ); ?>" required/>
    </p>
    <?php
}

add_filter( 'woocommerce_save_account_details_required_fields', 'andom_make_field_required' );
function andom_make_field_required( $required_fields ){

  $required_fields[ 'id_card' ] = 'Id Card';
  $required_fields[ 'adults' ] = 'Adults';
  $required_fields[ 'children' ] = 'Children';
  return $required_fields;

}

解决方案

问题根源是WooCommerce默认用PHP的empty()函数验证必填字段,而empty(0)会返回true,导致0被判定为空。以下通过钩子完全自定义验证逻辑,兼容0值:

1. 自定义字段验证规则

使用woocommerce_save_account_details_validation钩子替代默认验证,只拦截完全为空的字段,允许0值通过:

add_action( 'woocommerce_save_account_details_validation', 'andom_custom_account_field_validation', 10, 2 );
function andom_custom_account_field_validation( $errors, $user ) {
    // 验证身份证号(保持非空要求,身份证不应为0)
    if ( trim( $_POST['id_card'] ) === '' ) {
        $errors->add( 'id_card_error', __( '请填写身份证号', 'woocommerce' ) );
    }

    // 验证家庭成年人数,允许0值,仅拦截空输入
    if ( trim( $_POST['adults'] ) === '' ) {
        $errors->add( 'adults_error', __( '请填写家庭成年人数', 'woocommerce' ) );
    }

    // 验证家庭未成年人数,允许0值,仅拦截空输入
    if ( trim( $_POST['children'] ) === '' ) {
        $errors->add( 'children_error', __( '请填写家庭未成年人数', 'woocommerce' ) );
    }

    return $errors;
}

2. 移除默认必填字段规则

避免默认验证和自定义验证冲突,移除原woocommerce_save_account_details_required_fields中的规则:

add_filter( 'woocommerce_save_account_details_required_fields', 'andom_remove_default_required_check', 10, 1 );
function andom_remove_default_required_check( $required_fields ) {
    unset( $required_fields['id_card'] );
    unset( $required_fields['adults'] );
    unset( $required_fields['children'] );
    return $required_fields;
}

3. 确保0值正确保存

添加字段保存逻辑,确保0值能被存入用户元数据:

add_action( 'woocommerce_save_account_details', 'andom_save_custom_account_fields' );
function andom_save_custom_account_fields( $user_id ) {
    if ( isset( $_POST['id_card'] ) ) {
        update_user_meta( $user_id, 'id_card', sanitize_text_field( $_POST['id_card'] ) );
    }

    if ( isset( $_POST['adults'] ) ) {
        update_user_meta( $user_id, 'adults', sanitize_text_field( $_POST['adults'] ) );
    }

    if ( isset( $_POST['children'] ) ) {
        update_user_meta( $user_id, 'children', sanitize_text_field( $_POST['children'] ) );
    }
}

说明

  • 自定义验证通过检查trim($_POST['字段名']) === ''来判断是否为空,这样字符串"0"不会被判定为空。
  • 移除默认规则是为了防止WooCommerce自带的empty()验证提前拦截0值。
  • 保存逻辑直接处理输入值,确保0能被正确存储到用户信息中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:01:04