【问题标题】:Add a fee based on chosen shipping method in WooCommerce根据在 WooCommerce 中选择的运输方式添加费用
【发布时间】:2019-05-20 14:38:27
【问题描述】:

在 WooCommerce 中,当用户选择特定的运输方式时,我需要添加费用。

我找到了 "Add a fee based on shipping method and payment method in Woocommerce" 答案,看起来正是我需要的。

我已经尝试了代码并删除了我不需要的有关付款方式的部分。

问题是当我更改运输方式时没有添加费用,看起来我只是在会话中保留旧值。

这是我的代码:

// Add a conditional fee
add_action( 'woocommerce_cart_calculate_fees', 'add_cod_fee', 20, 1 );
function add_cod_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $chosen_shipping_method_id = WC()->session->get( 'chosen_shipping_methods' )[0];

    var_dump($chosen_shipping_method_id); die;

    switch($chosen_shipping_method_id){
        case 'flat_rate:3': {
            $fee_text = __( "Spese per ritiro", "woocommerce" );
            $cart->add_fee( $fee_text, 12, false );
            break;
        }
        case 'flat_rate:4': {
            $fee_text = __( "Spese per consegna a domicilio", "woocommerce" );
            $cart->add_fee( $fee_text, 24, false );
            break;
        }

    }
}

// Refresh checkout on payment method change
add_action( 'wp_footer', 'refresh_checkout_script' );
function refresh_checkout_script() {
    // Only on checkout page
    if( is_checkout() && ! is_wc_endpoint_url('order-received') ) :
    ?>
    <script type="text/javascript">
    jQuery(function($){
        // On payment method change
        $('form.woocommerce-checkout').on( 'change', '.shipping_method', function(){
            // Refresh checkout
            $('body').trigger('update_checkout');
        });
    })
    </script>
    <?php
    endif;
}

它只是保留$chosen_shipping_method_id中的旧值

【问题讨论】:

    标签: php wordpress woocommerce cart shipping-method


    【解决方案1】:

    如果您评论 var_dump($chosen_shipping_method_id); die;,您的代码运行良好。此外,jQuery 脚本不需要,因为它用于默认情况下不更新结帐的付款方式。

    所以你的情况还有其他问题。

    现在我重新审视了您的代码(它也可以工作)

    // Add a conditional fee
    add_action( 'woocommerce_cart_calculate_fees', 'flat_rate_based_fee', 20, 1 );
    function flat_rate_based_fee( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
    
        if( in_array( 'flat_rate:3', $chosen_shipping_methods ) ) {
            $fee = array( 'text' => __( "Spese per ritiro", "woocommerce" ), 'amount' => 12 );
        } elseif ( in_array( 'flat_rate:4', $chosen_shipping_methods ) ) {
            $fee = array( 'text' => __( "Spese per consegna a domicilio", "woocommerce" ), 'amount' => 24 );
        }
    
        if( isset($fee) ) {
            $cart->add_fee( $fee['text'], $fee['amount'], false );
        }
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。

    经过测试和工作(在 Woocommerce 3.5.x 和 3.6.x 上)。见working live on this test server

    【讨论】:

    • 好的,我的问题是将该代码与订阅插件一起使用,它将费用添加到每周订阅而不是订单中。我已将 $cart-&gt;add_fee 更改为 WC()-&gt;cart-&gt;add_fee,现在它可以工作了
    • @LoicTheAztec 好一个。如何在方法本身上添加/删除价格而不是使用 add_fee?
    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 2018-10-28
    • 2020-01-05
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多