2016-08-12 1 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'); 
} 

사용자 정의 수수료를 포함 총을 표시합니다. 그러나 두 번째로 체크 아웃을 클릭하면 수수료가 사라지고 두 번째로 다시 호출해야합니다 (woocommerce_cart_calculate_fees).

woocommerce_checkout_process에 체크하면 WC_Cart::get_fees()에 의해 반환 된 배열에 수수료도 있습니다.

편집 : 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 : 마지막으로 일부 진행!

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() -> 카트'** 문법을 대신 사용할 수 있으므로 더 이상' global $ woocommerce; ... 그래서 WC() -> cart-> add_fee ('배달 수수료', $ 수수료, 허위, ') ** – LoicTheAztec

답변

0

나는 그것을 스스로 분류했다. WOOCommerce의 구형 버전에서 올바르게 호출되지 않는 것이 문제였습니다. 업데이트로 문제가 해결되었습니다.

0

이 코드를 사용하여 수수료를 재설정하는 작업을 비활성화 할 수 있습니다.

remove_action('woocommerce_cart_reset', array(WC()->cart->fees_api(), 'remove_all_fees')); 
관련 문제