首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义WooCommerce费用在结帐时消失

自定义WooCommerce费用在结帐时消失
EN

Stack Overflow用户
提问于 2016-08-12 12:32:36
回答 2查看 3.6K关注 0票数 2

我在woocommerce_cart_calculate_fees上加了一个定制的费用

代码语言:javascript
复制
add_action('woocommerce_cart_calculate_fees', 'delivery_surcharge');
function delivery_surcharge() {
    global $woocommerce;
    // ...
    $woocommerce->cart->add_fee('Delivery fee', $fee, false, '');
}

但是,一旦用户单击结帐,费用就会被删除,而不是按总数计算。

通过执行以下检查,我已经验证了在调用woocommerce_checkout_process时尚未取消费用:

代码语言:javascript
复制
add_action('woocommerce_checkout_process', 'checkout_validator');
function checkout_validator() {
    global $woocommerce;
    wc_add_notice($woocommerce->cart->get_total(), 'error');
}

这给了我一个错误的结帐,显示了一个总额,其中包括海关费用。然而,当我第二次点击结账时,费用已经消失了,woocommerce_cart_calculate_fees需要第二次调用才能再次出现。

此外,WC_Cart::get_fees()woocommerce_checkout_process中签入时返回的数组中也存在费用。

编辑:请参阅更新5。

相关问题

“Woocommerce won't add my custom fee to the cart total”—Related but with no useful answer

更新

更新1: --我向WC_Checkout::create_order()添加了以下内容

代码语言:javascript
复制
  251 // Store fees
+ 252 error_log(print_r(WC()->cart->get_fees(), true));
  253 foreach ( WC()->cart->get_fees() as $fee_key => $fee ) {

输出了一个空数组,这意味着在签出处理和订单创建之间的某个时间,费用将被移除。

更新2:我执行了另一个类似于上面的调试检查,这次是通过添加到WC_Shortcode_Checkout::checkout()

代码语言:javascript
复制
  230 // Check cart has contents
  231 if ( WC()->cart->is_empty() ) {
  232     return;
  233 }
+ 234   
+ 235 error_log(print_r(WC()->cart->get_fees(), true));
  236
  237 // Check cart contents for errors
  238 do_action( 'woocommerce_check_cart_items' );

结果又是一个空数组。

更新3:终于有了一些进展!我再次执行了类似的检查,这次是在WC_Checkout::process_checkout()上,这是由WC_Ajax::checkout()调用的。

代码语言:javascript
复制
  359 if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) {
  360     define( 'WOOCOMMERCE_CHECKOUT', true );
  361 }
+ 362
+ 363 error_log(print_r(WC()->cart->get_fees(), true));
  364
  365 // Prevent timeout
  366 @set_time_limit(0);

而这笔费用实际上出现在error_log

代码语言:javascript
复制
[12-Aug-2016 13:45:24 UTC] Array
(
    [0] => stdClass Object
        (
            [id] => delivery-fee
            [name] => Delivery fee
            [amount] => 4
            [tax_class] => 
            [taxable] => 
            [tax] => 0
            [tax_data] => Array
                (
                )

        )

)

我将继续跟踪这个函数,直到我(希望)发现确切的位置,在那里的费用是不确定的。

更新4:,我已经设法追踪到在WC_Cart::calculate_totals()WC_Checkout::process_checkout()调用之后的某个地方没有设置费用。进一步调查。

更新5:我已经完全找到了问题。显然,WC_Cart::calculate_totals()WC_Cart::reset()打了电话,取消了所有费用。我不知道这是如何工作的,但不知怎么的,以前,这笔费用在打电话给WC_Cart::reset()时幸存了下来。此时,我不确定这是我的实现中的一个bug,还是WooCommerce本身中的一个bug。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 14:25:12

我自己解决的。结果发现,在我特定的、过时的WooCommerce版本中,WooCommerce没有被正确地调用,这是一个问题。更新解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2018-01-02 11:25:02

可以禁用使用此代码重置费用的操作。

代码语言:javascript
复制
remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38918072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档