WooCommerce结账字段自定义代码无效问题求助
WooCommerce自主定价模式下结账字段精简方案
问题情况
我店铺做免费教程,用「自主定价(Name Your Price)」模式,只交付文件,所以结账页面要尽量精简,删掉没用的字段。用代码片段插件跑了移除字段的代码,虽然echo "Download"能输出说明代码执行了,但字段还是在;把required设成false也没用。接下来还想实现:用户定价大于0(也就是捐赠)的时候才显示邮箱字段。
问题根源
你代码里先unset删了字段,之后又去改这些已删除字段的required属性,这完全是无效操作——字段都没了,修改不存在的元素自然没用。另外,可能是钩子优先级不够,你的代码被主题或其他插件的修改给覆盖了。
修正后的移除字段代码
add_filter( 'woocommerce_checkout_fields', 'custom_remove_woo_checkout_fields', 999 ); function custom_remove_woo_checkout_fields( $fields ) { // 批量移除账单字段 $billing_fields = [ 'billing_first_name', 'billing_last_name', 'billing_company', 'billing_address_1', 'billing_address_2', 'billing_city', 'billing_postcode', 'billing_country', 'billing_state', 'billing_phone', 'billing_email' ]; foreach ( $billing_fields as $field ) { unset( $fields['billing'][ $field ] ); } // 批量移除配送字段 $shipping_fields = [ 'shipping_first_name', 'shipping_last_name', 'shipping_company', 'shipping_address_1', 'shipping_address_2', 'shipping_city', 'shipping_postcode', 'shipping_country', 'shipping_state' ]; foreach ( $shipping_fields as $field ) { unset( $fields['shipping'][ $field ] ); } // 删掉订单备注 unset( $fields['order']['order_comments'] ); return $fields; }
- 给钩子加了
999的优先级,确保你的代码在其他修改结账字段的代码之后执行,避免被覆盖。 - 用循环批量删字段,不再做修改已删除字段的无用操作,逻辑更清晰。
实现「定价大于0时显示邮箱」的功能
要结合前端JS监听价格变化,控制字段显示,同时后端做验证防止漏洞:
前端控制代码(加到主题footer或代码插件)
jQuery(document).ready(function($) { // 替换成你自主定价输入框的实际name属性 const priceInput = $('input[name="your-price"]'); // 邮箱字段容器的选择器,默认是#billing_email_field const emailField = $('#billing_email_field'); // 页面加载先隐藏邮箱 emailField.hide(); // 监听价格输入变化 priceInput.on('input change', function() { const inputPrice = parseFloat($(this).val()) || 0; if (inputPrice > 0) { emailField.show(); $('#billing_email').prop('required', true); } else { emailField.hide(); $('#billing_email').prop('required', false); } }); });
后端验证代码(防止用户绕过前端验证)
add_action('woocommerce_checkout_process', 'custom_check_donation_email'); function custom_check_donation_email() { // 替换成你自主定价字段的实际name属性 $donationAmount = isset($_POST['your-price']) ? floatval($_POST['your-price']) : 0; if ($donationAmount > 0 && empty($_POST['billing_email'])) { wc_add_notice('捐赠时请填写邮箱地址', 'error'); } }
内容的提问来源于stack exchange,提问作者Minutepapillon
相关产品推荐
相关产品推荐

