如果在Woocommerce中选择了COD付款,请禁用特定的送货方式

如果用户选择付款“货到付款”,我需要禁用特定的送货方式。 问题是,只有每次重置WooCommerce瞬态并刷新时,以下代码才有效。 它不适用于来回的用户选择。

add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 ); function alter_shipping_methods( $rates ) { $chosen_gateway = WC()->session->chosen_payment_method; // If payment is Cash on delivery remove specific shipping if($chosen_gateway == 'cod') { foreach ( $rates as $rate_id => $rate ) { if ( $rate->label === 'Hrvatska pošta' ) { unset( $rates[ $rate_id ] ); } } } return $rates; } 

我确实有这个代码应该触发,当我点击选项时,我会在控制台中看到输出。

 jQuery(document.body).on('change', 'input[name="payment_method"]', function() { console.log('Payment method changed'); jQuery('body').trigger('update_checkout'); }); 

我试过这个,它不起作用

 function action_woocommerce_checkout_update_order_review($array, $int) { WC()->cart->calculate_shipping(); return; } add_action('woocommerce_checkout_update_order_review', 'action_woocommerce_checkout_update_order_review', 10, 2); 

我也尝试过调用PHP函数的自定义AJAX调用,在这个filter中没有结果

 add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 ); 

我接下来应该尝试什么?

以下是使“COD”付款方式禁用特定送货方式的完整工作方式。

您必须在第一个函数中设置要隐藏的送货方法ID。

代码:

 // Conditionally show/hide shipping methods add_filter( 'woocommerce_package_rates','show_hide_shipping_methods', 90, 2 ); function show_hide_shipping_methods( $rates, $package ) { if ( WC()->session->get('hide_shipping' ) == '1' ){ // HERE below set your shipping methods IDs to be removed unset($rates['flat_rate:12']); } return $rates; } // Function that gets the Ajax data add_action( 'wp_ajax_session_hideit', 'wc_session_hide_shipping_method' ); add_action( 'wp_ajax_nopriv_session_hideit', 'wc_session_hide_shipping_method' ); function wc_session_hide_shipping_method() { if ( isset($_POST['disable_smi']) && $_POST['disable_smi'] == '1' ){ WC()->session->set('hide_shipping', '1' ); } else { WC()->session->set('hide_shipping', '0' ); } // Just for testing ==> To be removed echo json_encode( WC()->session->get('billing_ups' ) ); die(); // Alway at the end (to avoid server error 500) } // Enabling, disabling and refreshing session shipping methods data add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 ); function refresh_shipping_methods( $post_data ){ $bool = true; if ( WC()->session->get('hide_shipping' ) == '1' ) $bool = false; // Mandatory to make it work with shipping methods foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){ WC()->session->set( 'shipping_for_package_' . $package_key, $bool ); } WC()->cart->calculate_shipping(); } // The Jquery script add_action( 'wp_footer', 'custom_checkout_script' ); function custom_checkout_script() { if( ! is_checkout() ) return; ?>   

代码位于活动子主题(或活动主题)的function.php文件中。 经过测试和工作。

为了能够获得正确的送货方式ID,您可以使用浏览器检查器,这样:

在此处输入图像描述