如何在WooCommerce结账页面将自定义字段存储到Session中
问题核心原因
原有代码存在3个问题导致状态刷新后丢失:
- 自定义复选框渲染时未读取Session存储的勾选状态,默认永远为未勾选
- 页脚脚本主动清空了存储勾选状态的
enable_feeSession字段 - 计算费用时未同步把勾选状态存入Session,刷新后无法读取历史状态
完整修正后代码
add_action( 'woocommerce_checkout_before_order_review', 'add_custom_checkout_checkbox', 20 ); function add_custom_checkout_checkbox(){ $carry_bag_label = get_field('label_carry_bag' , 'option'); // 从Session读取勾选状态作为默认值 $checked = WC()->session->get('enable_fee', false) ? 1 : 0; // 添加自定义复选框字段 woocommerce_form_field( 'installment_fee', array( 'type' => 'checkbox', 'label' => __($carry_bag_label), 'class' => array( 'form-row-wide' ), ), $checked ); } // 移除复选框的(optional)可选标识 add_filter( 'woocommerce_form_field' , 'remove_order_comments_optional_fields_label', 10, 4 ); function remove_order_comments_optional_fields_label( $field, $key, $args, $value ) { // 仅在结账页针对目标字段生效 if( 'installment_fee' === $key && is_checkout() ) { $optional = ' <span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>'; $field = str_replace( $optional, '', $field ); } return $field; } // jQuery交互脚本 add_action( 'wp_footer', 'checkout_fee_script' ); function checkout_fee_script() { // 仅在结账页加载 if( is_checkout() && ! is_wc_endpoint_url() ) : ?> <script type="text/javascript"> jQuery( function($){ if (typeof wc_checkout_params === 'undefined') return false; // 复选框状态变更时触发总价更新 $('form.checkout').on('change', 'input[name=installment_fee]', function(e){ $('body').trigger('update_checkout'); }); }); </script> <?php endif; } /** 计算购物车额外费用 **/ function cabinet_sides_additional_charges( $cart_object ) { if ( isset( $_POST['post_data'] ) ) { parse_str( $_POST['post_data'], $post_data ); } else { $post_data = $_POST; } // 同步更新Session中的勾选状态 $enable_fee = isset($post_data['installment_fee']) ? true : false; WC()->session->set('enable_fee', $enable_fee); if ( $enable_fee ) { $price_new = get_field('carry_bag_price', 'option'); WC()->cart->add_fee('Extra Carry Bag Price Added ',$price_new, false ); } } add_action( 'woocommerce_cart_calculate_fees','cabinet_sides_additional_charges' );
生效验证
替换原有代码后,勾选复选框等待总价更新后刷新页面,复选框会保持勾选状态,额外费用也会正常保留在总价中。
内容的提问来源于stack exchange,提问作者RC Chopra
相关产品推荐
相关产品推荐

