2016-08-12 5 views
1

で消える:カスタムWooCommerce料は、私が<code>woocommerce_cart_calculate_fees</code>にカスタム料金を追加し、チェックアウト

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'); 
} 

私のカスタム料金を含め合計を示すチェックアウトにエラーが発生しました。しかし、2回目のチェックアウトをクリックすると、料金は消えてしまい、woocommerce_cart_calculate_feesをもう一度呼び出す必要がありました。

にチェックされている場合、WC_Cart::get_fees()で返された配列にも料金があります。

編集: 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) { 

空の配列が出力され、チェックアウト処理と注文作成の間に料金が削除されることを意味します。

アップデート2: Iは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: 最後に、いくつかの進歩!

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に現れた:私は、同様のチェックが再び、WC_Ajax::checkout()によって呼び出されWC_Checkout::process_checkout()上のこの時間は行なわ!

[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自体のバグかどうかはわかりません。

+1

注: 'global $ woocommerce;を使用する代わりに、 $ Woocommerce-> cart-> add_fee( '配送料'、$ fee、false、 ''); 'WC() - > cart' **の構文を代わりに使うことができるので、グローバルなwoocommerce; '... WC() - >カート - > add_fee( '配送料'、$ fee、false、 ''); ** – LoicTheAztec

答えて

0

私はそれを自分で分類しました。特定の旧式のWooCommerceバージョンではwoocommerce_cart_calculate_feesが正しく呼び出されないという問題があったことが判明しました。問題の解決を更新しました。

0

このコードで料金をリセットするアクションを無効にすることができます。

remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees')); 
関連する問題