我在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本身的错误。
答案 0 :(得分:0)
我自己整理了一下。事实证明,在我特定的,过时的WooCommerce版本中没有正确调用woocommerce_cart_calculate_fees
是一个问题。更新解决了这个问题。
答案 1 :(得分:0)
您可以使用此代码禁用重置费用的操作。
remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees'));