WooCommerce 如何用WC_Checkout get_value()获取自定义结账字段值
问题核心原因
自定义字段无法自动回填、$checkout->get_value('gst_no') 返回null的本质,是WooCommerce默认的会话存储逻辑只会自动收录系统内置的结账字段,你添加的自定义字段没有被纳入整个提交、校验、存会话的流程,提交时输入的值根本没有被写入用户会话,自然无法被读取回填。
实现字段自动回填的完整步骤
按顺序添加以下代码到主题的functions.php即可:
1. 给自定义字段添加提交校验
WooCommerce在处理结账提交时,只有经过合法校验的字段才会被纳入后续流程,否则会被直接过滤丢弃:
add_action( 'woocommerce_checkout_process', 'bbloomer_validate_gst_checkout_field' ); function bbloomer_validate_gst_checkout_field() { if ( empty( $_POST['gst_no'] ) ) { wc_add_notice( 'GST Number 为必填项', 'error' ); } }
2. 核心逻辑:把自定义字段值写入用户会话
WooCommerce的$checkout->get_value()方法,会优先从当前用户会话中读取对应字段的值——这也是系统默认字段能在支付跳转后返回自动填充的原因。需要在用户提交结账时,把自定义字段的值手动写入会话:
add_action( 'woocommerce_checkout_update_session', 'bbloomer_save_gst_value_to_session' ); function bbloomer_save_gst_value_to_session() { if ( ! empty( $_POST['gst_no'] ) ) { WC()->session->set( 'gst_no', sanitize_text_field( $_POST['gst_no'] ) ); } }
3. 把字段值持久化到用户账户
完成会话存储的基础上,可以额外把字段值写入用户账户元数据,让登录用户下次进入结账页时也能自动带出已保存的GST号,不用重复输入:
add_action( 'woocommerce_checkout_update_customer', 'bbloomer_save_gst_value_to_user_meta', 10, 2 ); function bbloomer_save_gst_value_to_user_meta( $customer, $data ) { if ( ! empty( $_POST['gst_no'] ) ) { update_user_meta( $customer->get_id(), 'gst_no', sanitize_text_field( $_POST['gst_no'] ) ); } }
效果验证
完成以上代码添加后,你原来编写的自定义字段渲染代码不需要做任何修改:
- 当用户输入GST号跳转到支付页、再返回结账页时,自定义字段会和系统默认账单字段一样,自动带出之前输入的内容
- 你原来添加的调试代码
error_log( $checkout->get_value( 'gst_no' ) )也会正常打印出用户输入的GST值,不再返回null - 登录用户下次进入结账页时,会自动带出之前保存到账户的GST号,无需重复填写
测试前请清空站点缓存、浏览器本地的WooCommerce会话缓存,避免旧的缓存值干扰测试结果。
内容的提问来源于stack exchange,提问作者dc09
相关产品推荐
相关产品推荐

