で消える:カスタム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自体のバグかどうかはわかりません。
注: 'global $ woocommerce;を使用する代わりに、 $ Woocommerce-> cart-> add_fee( '配送料'、$ fee、false、 ''); 'WC() - > cart' **の構文を代わりに使うことができるので、グローバルなwoocommerce; '... WC() - >カート - > add_fee( '配送料'、$ fee、false、 ''); ** – LoicTheAztec