根据Woocommerce 3中的送货方式显示或隐藏结帐字段

我正在尝试隐藏基于送货方式的结帐字段。

function premove_billing_checkout_fields($fields) { global $woocommerce; $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); $chosen_shipping = $chosen_methods[0]; if( $chosen_shipping === 'local_pickup:20' ) { unset($fields['billing']['billing_postcode']); unset($fields['billing']['billing_state']); unset($fields['billing']['billing_country']); } if( $chosen_shipping === 'wc_custom_shipping_pickpoint' ) { unset($fields['billing']['billing_postcode']); unset($fields['billing']['billing_address_1']); unset($fields['billing']['billing_state']); } return $fields; } add_filter('woocommerce_checkout_fields', 'premove_billing_checkout_fields', 990 ); 

此代码正常,但要隐藏我需要刷新页面的字段。 如何使用Ajax隐藏字段?

更新4 (2018年6月制作)
– 专门为Woocommerce 3.4.x添加了初始化延迟。
– 启用了送货地址复选框时解决了错误。
– 增强更轻,更有效的jQuery代码。
– 添加了条件字段validation

您不需要任何Ajax来实现此目的。 第一个函数将使所有必要的结帐字段不是“必需”,因为这是有条件地显示/隐藏结帐字段所必需的。 第二个function(主要是jQuery)将根据所选的送货方式显示/隐藏您想要的字段。

 // Conditional Show hide checkout fields based on chosen shipping methods add_action( 'wp_footer', 'custom_checkout_field_script' ); function custom_checkout_field_script() { // HERE your shipping methods rate IDs $local_pickup = 'local_pickup:20'; $pickpoint = 'wc_custom_shipping_pickpoint'; $required_text = esc_attr__( 'required', 'woocommerce' ); $required_html = '*'; ?>  session->get( 'chosen_shipping_methods' )[0]; $billing = ' ' . __('Billing', 'woocommerce') . ' '; $shipping = ' ' . __('Shipping', 'woocommerce') . ' '; $country = __('country.', 'woocommerce'); $address1 = __('address.', 'woocommerce'); $postcode = __('postcode.', 'woocommerce'); $state = __('state.', 'woocommerce'); $end_text = ' '. __('is a required field.', 'woocommerce'); if( $chosen_shipping_method == $local_pickup ) { if( empty($_POST['billing_address_1']) ) wc_add_notice( $billing . $address1 . $end_text, 'error' ); if( $_POST['ship_to_different_address'] ){ if( empty($_POST['shipping_address_1']) ) wc_add_notice( $shipping . $address1 . $end_text, 'error' ); } } elseif( $chosen_shipping_method == $pickpoint ) { if( empty($_POST['billing_country']) ) wc_add_notice( $billing . $country . $end_text, 'error' ); if( $_POST['ship_to_different_address'] ){ if( empty($_POST['shipping_country']) ) wc_add_notice( $shipping . $country . $end_text, 'error' ); } } else { if( empty($_POST['billing_country']) ) wc_add_notice( $billing . $country . $end_text, 'error' ); if( empty($_POST['billing_address_1']) ) wc_add_notice( $billing . $address1 . $end_text, 'error' ); if( empty($_POST['billing_postcode']) ) wc_add_notice( $billing . $postcode . $end_text, 'error' ); if( empty($_POST['billing_state']) ) wc_add_notice( $billing . $state . $end_text, 'error' ); if( $_POST['ship_to_different_address'] ){ if( empty($_POST['shipping_country']) ) wc_add_notice( $shipping . $country . $end_text, 'error' ); if( empty($_POST['shipping_address_1']) ) wc_add_notice( $shipping . $address1 . $end_text, 'error' ); if( empty($_POST['shipping_postcode']) ) wc_add_notice( $shipping . $postcode . $end_text, 'error' ); if( empty($_POST['shipping_state']) ) wc_add_notice( $shipping . $state . $end_text, 'error' ); } } } 

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

这已经过测试,适用于WooCommerce 3+