隐藏 WooCommerce 中特定运输方式的结帐运输字段部分
Hide checkout shipping fields section for specific shipping method in WooCommerce
有人问了下面的问题,我已经回答了。然后他删除它。所以我发布了问题和我的回答,因为这对社区很有用:
在 WooCommerce 中,我试图在不重新加载结帐页面的情况下动态更新复选框表单。
我有 2 种送货方式:"Delivery" 和 "Collect"。我试图仅禁用送货地址部分 (使用 "ship to another address if chosen method is collect" 复选框选项) 和所有送货字段。
首先我尝试了这个:
add_action( 'woocommerce_after_shipping_rate', 'carrier_custom_fields', 30, 2 );
function carrier_custom_fields( $method, $index ) {
if( ! is_checkout()) return; // Only on checkout page
$customer_carrier_method = 'local_pickup:1';
if( $method->id != $customer_carrier_method ) return; // Only display for "local_pickup"
$chosen_method_id = WC()->session->chosen_shipping_methods[ $index ];
// echo $chosen_method_id;
// If the chosen shipping method is 'legacy_local_pickup' we display
if($chosen_method_id == $customer_carrier_method ):
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false');
else :
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true');
endif;
}
然后我试了这个:
add_action( 'woocommerce_shipping_method_chosen', 'check_if_local_pickup', 10, 1 );
function check_if_local_pickup( $chosen_method ) {
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping = $chosen_methods[0];
if ($chosen_shipping == 'local_pickup:1') {
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false');
return true;
}
else
{
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true');
return true;
}
}
两者都不行。
如何在 WooCommerce 中隐藏特定选择的送货方式的结帐送货字段部分?
PHP 不是 "client side" (不是 "server side") 上的事件,因此需要使用jQuery。因此,要隐藏特定运输方式的运输字段部分,您将使用以下内容:
// Auto Show hide checkout shipping fields section based on chosen shipping methods
add_action( 'wp_footer', 'custom_checkout_field_script' );
function custom_checkout_field_script() {
// Only on checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
// HERE below define your local pickup shipping method
$local_pickup = 'local_pickup:1';
// Jquery code start
?>
<script>
jQuery(function($){
var a = 'checked',
b = 'input#ship-to-different-address-checkbox',
c = 'input[name^="shipping_method"]',
d = '<?php echo $local_pickup; ?>',
e = c + ':' + a
f = 'div.woocommerce-shipping-fields,' + b;
// 1. On load: when the chosen shipping method is our defined shipping method
if( $(e).val() === d ) {
// Hide shipping fields section
$(f).hide();
}
// 2. On shipping method "change" (Live event)
$( 'form.checkout' ).on( 'change', c, function() {
// When the chosen shipping method is our defined shipping method
if( $(e).val() === d ) {
// if the checkbox is checked, uncheck it first
if ( $(b).prop(a) ) {
$(b).click();
}
// Hide shipping fields section
$(f).hide();
} else if ( $(e).val() !== d ) {
// show closed shipping fields section with (unchecked checkbox)
$(f).show();
}
});
});
</script>
<?php
endif;
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
相关:How to make ship to different address checked when using Free Shipping and Flat Rate?
有人问了下面的问题,我已经回答了。然后他删除它。所以我发布了问题和我的回答,因为这对社区很有用:
在 WooCommerce 中,我试图在不重新加载结帐页面的情况下动态更新复选框表单。 我有 2 种送货方式:"Delivery" 和 "Collect"。我试图仅禁用送货地址部分 (使用 "ship to another address if chosen method is collect" 复选框选项) 和所有送货字段。
首先我尝试了这个:
add_action( 'woocommerce_after_shipping_rate', 'carrier_custom_fields', 30, 2 );
function carrier_custom_fields( $method, $index ) {
if( ! is_checkout()) return; // Only on checkout page
$customer_carrier_method = 'local_pickup:1';
if( $method->id != $customer_carrier_method ) return; // Only display for "local_pickup"
$chosen_method_id = WC()->session->chosen_shipping_methods[ $index ];
// echo $chosen_method_id;
// If the chosen shipping method is 'legacy_local_pickup' we display
if($chosen_method_id == $customer_carrier_method ):
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false');
else :
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true');
endif;
}
然后我试了这个:
add_action( 'woocommerce_shipping_method_chosen', 'check_if_local_pickup', 10, 1 );
function check_if_local_pickup( $chosen_method ) {
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping = $chosen_methods[0];
if ($chosen_shipping == 'local_pickup:1') {
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_false');
return true;
}
else
{
add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true');
return true;
}
}
两者都不行。
如何在 WooCommerce 中隐藏特定选择的送货方式的结帐送货字段部分?
PHP 不是 "client side" (不是 "server side") 上的事件,因此需要使用jQuery。因此,要隐藏特定运输方式的运输字段部分,您将使用以下内容:
// Auto Show hide checkout shipping fields section based on chosen shipping methods
add_action( 'wp_footer', 'custom_checkout_field_script' );
function custom_checkout_field_script() {
// Only on checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
// HERE below define your local pickup shipping method
$local_pickup = 'local_pickup:1';
// Jquery code start
?>
<script>
jQuery(function($){
var a = 'checked',
b = 'input#ship-to-different-address-checkbox',
c = 'input[name^="shipping_method"]',
d = '<?php echo $local_pickup; ?>',
e = c + ':' + a
f = 'div.woocommerce-shipping-fields,' + b;
// 1. On load: when the chosen shipping method is our defined shipping method
if( $(e).val() === d ) {
// Hide shipping fields section
$(f).hide();
}
// 2. On shipping method "change" (Live event)
$( 'form.checkout' ).on( 'change', c, function() {
// When the chosen shipping method is our defined shipping method
if( $(e).val() === d ) {
// if the checkbox is checked, uncheck it first
if ( $(b).prop(a) ) {
$(b).click();
}
// Hide shipping fields section
$(f).hide();
} else if ( $(e).val() !== d ) {
// show closed shipping fields section with (unchecked checkbox)
$(f).show();
}
});
});
</script>
<?php
endif;
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
相关:How to make ship to different address checked when using Free Shipping and Flat Rate?