【问题标题】:WooCommerce update_checkout won't update shipping methodsWooCommerce update_checkout 不会更新运输方式
【发布时间】:2020-08-12 09:46:36
【问题描述】:

在我的 WooCommerce 网站上,如果您选择货到付款作为付款方式,我会使用此功能添加 4 欧元的费用:

add_action('woocommerce_cart_calculate_fees', 'increase_cod_cost');

function increase_cod_cost() {
  if(WC()->session->chosen_payment_method=='cod')
    WC()->cart->add_fee(__('COD Fee'), 4);
}

我还使用此功能在您更改付款方式时立即更新结帐,以便在您选择 cod 时添加费用,并在您选择任何其他方式时删除:

add_action('woocommerce_review_order_before_payment', 'custom_checkout_update');

function custom_checkout_update() {
  echo '
    <script type="text/javascript">
    (function($){
    $(\'form.checkout\').on(\'change\', \'input[name="payment_method"]\', function() {
    $(\'body\').trigger(\'update_checkout\');
    });
    })(jQuery);
    </script>
  ';
}

这两个功能都 100% 工作。

现在,我不想增加费用,而是想适当增加实际运费,所以我尝试了这个功能而不是第一个:

add_filter('woocommerce_package_rates', 'increase_cod_cost_2', 10, 2);

function increase_cod_cost_2($rates, $package) {
  if(WC()->session->chosen_payment_method=='cod')
    $rates['flat_rate:1']->cost=$rates['flat_rate:1']->cost+4;
  return $rates;
}

此功能也有效,但前提是我清空购物车然后再次添加产品。出于某种原因,它不会在我选择 cod 时立即更新运费。我真的不明白为什么 jQuery 函数可以通过添加费用来与第一个 php 函数一起使用,但不能通过更改运费来使用这个函数。你能帮我看看有什么问题吗?谢谢。

【问题讨论】:

  • 为什么不将其添加为不同的统一费率费用?为什么要修改现有的统一费率?

标签: php jquery ajax wordpress woocommerce


【解决方案1】:

我实际上无法帮助您完全了解问题所在,但我可以分享一些经验: 尝试在这些情况下包含日志命令,它可以帮助您查看何时调用钩子,是否调用它以及取决于您的日志详细信息代码是否通过 if 子句或落入 else 情况

根据经验和您所写的内容,并不总是调用第二个挂钩,因此它在您新添加产品时有效,但在结帐期间更改运输方式时无效。 所以我疯狂地猜测你可能需要另一个像

这样的钩子
do_action( 'woocommerce_shipping_method_chosen', $chosen_method );

或者当 woocommerce 去寻找可用的运输方式时触发的更好的东西。

注意钩子不是按顺序调用的,你增加了 4 美元韩 1 次...

PD:我注意到建议的钩子也不理想,您可以尝试以下方法之一:

add_action( 'woocommerce_load_shipping_methods', 'action_woocommerce_load_shipping_methods', 10, 1 ); 
add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );

或者在这里检查所有的 woocommerce 钩子: https://docs.woocommerce.com/wc-apidocs/hook-docs.html

【讨论】:

  • 我在接受的答案中发现了这个stackoverflow条目stackoverflow.com/questions/48786788/…,有一个观察,有时,您可能需要刷新运输方式:1)先清空购物车。 2) 转到运输区域设置,然后禁用/保存并重新启用/保存相关的运输方式。除此之外,剩下的唯一选择是使用消息进行适当的调试,以便您查看何时调用过滤器以及是否有某些事情使您不属于 if 子句(例如,尚未选择付款方式)
【解决方案2】:

请试试这个。

add_filter( 'woocommerce_package_rates', 'custom_shipping_costs', 20, 2 );
function custom_shipping_costs( $rates, $package ) {
    // New shipping cost (can be calculated)
    $new_cost = 1000;
    $tax_rate = 0.4;

    foreach( $rates as $rate_key => $rate ){
        // Excluding free shipping methods
        if( $rate->method_id != 'free_shipping'){

            // Set rate cost
            $rates[$rate_key]->cost = $new_cost;

            // Set taxes rate cost (if enabled)
            $taxes = array();
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $rates[$rate_key]->taxes[$key] > 0 )
                    $taxes[$key] = $new_cost * $tax_rate;
            }
            $rates[$rate_key]->taxes = $taxes;

        }
    }
    return $rates;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2015-06-28
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多