2016-08-12 3 views
1

добавить пользовательскую плату на woocommerce_cart_calculate_fees:Пользовательских WooCommerce платы исчезает при оформлении заказа

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.

Edit: Смотрите обновление 5.

Похожие вопросы

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

Обновления

Update 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) { 

Пустой массив был выпущен, что означает, что сборы удаляются когда-то между обработкой заказа и созданием заказа.

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

     ) 

) 

Я буду продолжать отслеживать через эту функцию, пока я (надеюсь) не обнаружить точное место, в котором плата снята с охраной.

Update 4: мне удалось разыскать, что плата не установлена ​​где-то после того, как WC_Cart::calculate_totals() вызывается WC_Checkout::process_checkout(). Следствие.

Обновление 5: У меня есть полностью проблема. Видимо, WC_Cart::calculate_totals() звонит WC_Cart::reset(), который не устанавливает все сборы.Я не уверен, как это когда-либо срабатывало, но каким-то образом, ранее, гонорар выжил при звонке до WC_Cart::reset(). На данный момент я не уверен, что это ошибка в моей реализации или в самой WooCommerce.

+1

Примечание: вместо этого используется 'global $ woocommerce; $ woocommerce-> cart-> add_fee ('Стоимость доставки', $ fee, false, ''); 'вы можете просто использовать **' WC() -> cart' ** вместо синтаксиса, так что вам больше не понадобится ' глобальная $ woocommerce; '... Итак, у вас будет только: **' WC() -> cart-> add_fee («Плата за доставку», $ fee, false, ''); '** – LoicTheAztec

ответ

0

Я сам разобрался. Оказывается, это была проблема с woocommerce_cart_calculate_fees, которая не была правильно названа в моей устаревшей версии WooCommerce. Обновление решило проблему.

0

Вы можете отключить действие, которое сбрасывает комиссию с помощью этого кода.

remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees')); 
Смежные вопросы