ds3464 2018-05-18 13:25
浏览 85
已采纳

根据Woocommerce中选择的付款方式停用送货方式

I need to disable specific shipping method if user selected payment "Cash on Delivery". The problem is that the following code works only if I reset WooCommerce transients each time and refresh. It doesn't work on user selection back and forth.

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;

}

I do have this code which should trigger and I see the output in console when I click around options.

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

I have tried with this, it doesn't work

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);

And I have also tried custom AJAX call which calls a PHP function and inside this filter, no result

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

What should I try next?

  • 写回答

1条回答 默认 最新

  • douzhaobo6488 2018-05-19 13:20
    关注

    Updated on March 2019

    Here is the complete working way to make "COD" payment method disable a specific shipping method.

    You will have to set in the first function the shipping method Id that you wish to hide.

    The code:

    add_action( 'woocommerce_package_rates','show_hide_shipping_methods', 10, 2 );
    function show_hide_shipping_methods( $rates, $package ) {
        // HERE Define your targeted shipping method ID
        $payment_method        = 'cod';
    
        $chosen_payment_method = WC()->session->get('chosen_payment_method');
    
        if( $payment_method == $chosen_payment_method ){
            unset($rates['flat_rate:12']);
        }
        return $rates;
    }
    
    add_action( 'woocommerce_review_order_before_payment', 'payment_methods_trigger_update_checkout' );
    function payment_methods_trigger_update_checkout(){
        // jQuery code
        ?>
        <script type="text/javascript">
            (function($){
                $( 'form.checkout' ).on( 'blur', 'input[name^="payment_method"]', function() {
                    setTimeout(function(){
                        $(document.body).trigger('update_checkout');
                    }, 250 );
                });
            })(jQuery);
        </script>
        <?php
    }
    
    add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods' );
    function refresh_shipping_methods( $post_data ){
        // HERE Define your targeted shipping method ID
        $payment_method = 'cod';
        $bool           = true;
    
        if ( WC()->session->get('chosen_payment_method') === $payment_method )
            $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();
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

    To be able to get the correct shipping method ID you can use your browser inspector, this way:

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程