自定义WooCommerce费用在结账时消失

时间:2016-08-12 12:32:36

标签: php wordpress woocommerce

我在woocommerce_cart_calculate_fees上添加了自定义费用:

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

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

我已通过执行以下检查确认在调用woocommerce_checkout_process时尚未删除费用:

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

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

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

  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

[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()的电话中幸免于难。在这一点上,我不确定这是否是我的实现或WooCommerce本身的错误。

2 个答案:

答案 0 :(得分:0)

我自己整理了一下。事实证明,在我特定的,过时的WooCommerce版本中没有正确调用woocommerce_cart_calculate_fees是一个问题。更新解决了这个问题。

答案 1 :(得分:0)

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

remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees'));
相关问题