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