我在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()时幸存了下来。此时,我不确定这是我的实现中的一个bug,还是WooCommerce本身中的一个bug。
发布于 2016-08-12 14:25:12
我自己解决的。结果发现,在我特定的、过时的WooCommerce版本中,WooCommerce没有被正确地调用,这是一个问题。更新解决了这个问题。
发布于 2018-01-02 11:25:02
可以禁用使用此代码重置费用的操作。
remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees'));https://stackoverflow.com/questions/38918072
复制相似问题