当前位置: 首页 > 知识库问答 >
问题:

结帐时,海关商务费消失

凌宏大
2023-03-14

我在woocommerce\u cart\u calculate\u fees上添加了自定义费用:

add_action('woocommerce_cart_calculate_fees', 'delivery_surcharge');
function delivery_surcharge() {
    global $woocommerce;
    // ...
    $woocommerce->cart->add_fee('Delivery fee', $fee, false, '');
}

但一旦用户点击结帐,费用就被删除,而不是计入总数。

我已通过执行以下检查来验证在调用woocommerce\u checkout\u过程时,费用尚未被删除:

add_action('woocommerce_checkout_process', 'checkout_validator');
function checkout_validator() {
    global $woocommerce;
    wc_add_notice($woocommerce->cart->get_total(), 'error');
}

这给了我一个错误,结帐时显示的总额,其中包括自定义费用。但是,当我第二次单击checkout时,费用已经消失,需要第二次调用woocommerce\u cart\u calculate\u fees才能再次显示。

此外,当签入woocommerce\u checkout\u过程时,WC\u Cart::get\u fees()返回的数组中也存在费用。

编辑:请参阅更新5。

“Woocommerce不会将我的自定义费用添加到购物车总额中”-相关但没有有用的答案

更新1:我将以下内容添加到WC\u Checkout::create\u order()

  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\u Shortcode\u Checkout::Checkout()

  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\u Checkout::process\u Checkout()上执行的,该检查由WC\u Ajax::Checkout()调用:

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

而费用实际出现在错误日志中

[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\u Checkout::process\u Checkout()调用WC\u Cart::calculate\u totals()之后,我设法找到了费用未结算的地方。进一步调查。

更新5:我已完全找到问题所在。显然WC\u Cart::calculate\u totals()调用WC\u Cart::reset(),这将取消所有费用。我不知道这是怎么回事,但不知何故,在之前,这笔费用在调用WC\u Cart::reset()后幸存了下来。在这一点上,我不确定这是我的实现中的错误还是WooCommerce本身的错误。


共有2个答案

田晨
2023-03-14

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

remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees'));
欧阳正谊
2023-03-14

我自己解决的。事实证明,在我特定的、过时的woocommerce版本中,woocommerce\u cart\u calculate\u fees没有被正确调用是一个问题。更新解决了这个问题。

 类似资料:
  • 因此,我正在开发一个插件的WooCommerce,我已经添加了一个选择包装,无论是在塑料袋或在卡通盒与每个有不同的成本。 用户选择一个选项,我需要WordPress来刷新价格,并通过使用添加正确的费用来更新成本: 增加WC_购物车费用并更新价格的最佳方式是什么?代码应该是什么样子? 使用$\u GET和$\u POST获取值可以吗?或者更好的方法是使用AJAX更新价格而不刷新页面吗? 目前,我使用

  • 帐号被登出 当前用户登录失效、异地登录时,都会发送这个消息。 消息体 EventUserLoginInvalid 例子 Kolin @Subscribe(threadMode = ThreadMode.MAIN) public fun onReceivedUserEvent(eventUserLoginInvalid: EventUserLoginInvalid){ // TODO

  • 我在为 端口设置 消费者以捕获消息时遇到问题。我的: 申请开始: 并且<code>514</code>端口已打开但未侦听 我可以在tcpdump中看到,tcpdump-I eth1-nn-A-s 0端口514和udp正确发送和接收消息。 有人能告诉我我做错了什么吗?

  • 我们有一个应用程序,消费者读取一条消息,线程执行许多操作,包括在生成另一主题的消息之前访问数据库。在线程上消耗和生成消息之间的时间可能需要几分钟。一旦生成了指向新主题的消息,就会进行提交,以表明我们已经完成了对消费者队列消息的处理。自动提交因此被禁用。 我正在使用高级消费者,我注意到的是zoowatch和kafka会话超时,因为我们在消费者队列上做任何事情之前需要太长时间,所以kafka每次线程返

  • 本文向大家介绍消费者和消费者组有什么关系?相关面试题,主要包含被问及消费者和消费者组有什么关系?时的应答技巧和注意事项,需要的朋友参考一下 每个消费者从属于消费组。具体关系如下:

  • 最近,我们与Kafka消费者和生产商之间出现了一些性能问题。我们在scala中使用Kafka Java API。打开和关闭消费者和生产者对象的良好做法是什么?我认为这是一个非常开放的问题,正确的答案总是,但我正在尝试对此进行推理。 消费者可以长时间运行连接并保持开放吗? 当我们完成信息生成时,生产者是否应该关闭?