Добавьте расчетную комиссию на основе общей суммы после скидок в WooCommerce.

Я пытаюсь добавить комиссию в свою корзину woocommerce на основе промежуточного итога после применения скидок:

    add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );
function woocommerce_custom_surcharge() {
  global $woocommerce;

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $percentage = 0.01;
    $surcharge =  $woocommerce->cart->subtotal - $woocommerce->cart->get_cart_discount_total(); 
    $woocommerce->cart->add_fee( 'Surcharge', $surcharge, true, '' );

}

Я не верю, что такие вызовы, как $woocommerce->cart->get_cart_discount_total(), можно использовать в хуке действия, поэтому я продолжаю получать 0.00 за плату.

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

Что еще я могу использовать в действии, чтобы получить тот же номер и добавить процентную комиссию?


person mnguyen    schedule 27.02.2018    source источник


Ответы (2)


Аргумент объекта WC_Cart включен в хук действия woocommerce_cart_calculate_fees. Я также использую расчет суммы в процентах, так как я полагаю, что вы просто забыли об этом в своем коде.

Поэтому вы должны попробовать это вместо этого:

add_action( 'woocommerce_cart_calculate_fees','wc_custom_surcharge', 10, 1 );
function wc_custom_surcharge( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE set your percent rate
    $percent = 1; // 1%

    // Fee calculation
    $fee = ( $cart->subtotal - $cart->get_cart_discount_total() ) * $percent / 100;

    // Add the fee if it is bigger than O
    if( $fee > 0 )
        $cart->add_fee( __('Surcharge', 'woocommerce'), $fee, true );
}

Код находится в файле function.php вашей активной дочерней темы (или темы).

Проверено и работает отлично.

Примечание. Также global $woocommerce; с $woocommerce->cart уже давно заменены на WC()->cart. Объект WC() woocommerce уже включает себя global $woocommerce;


Конкретное обновление:

add_action( 'woocommerce_cart_calculate_fees','wc_custom_surcharge', 10, 1 );
function wc_custom_surcharge( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE set your percent rate and your state
    $percent = 6;
    $state = array('MI');

    $coupon_total = $cart->get_discount_total();

    // FEE calculation
    $fee = ( $cart->subtotal - $coupon_total ) * $percent / 100;

    if ( $fee > 0 && WC()->customer->get_shipping_state() == $state )
        $cart->add_fee( __('Tax', 'woocommerce'), $fee, false);
}

Код находится в файле function.php вашей активной дочерней темы (или темы).

Проверено и работает.

person LoicTheAztec    schedule 27.02.2018
comment
ваш код помог мне обнаружить, что get_cart_discount_total не работает с пользовательским типом скидки. Я добавил настраиваемый тип скидки для подарочных карт, который отображается в таблице и на задней панели как купон, но не учитывается в общей сумме скидки. я могу что-нибудь сделать здесь? - person mnguyen; 27.02.2018
comment
@mnguyen, пожалуйста, добавьте код своей индивидуальной скидки в свой вопрос в конце, отредактируйте его… когда это будет сделано, сообщите мне - person LoicTheAztec; 27.02.2018
comment
Я отправил вам сообщение через форму в вашем профиле с прикрепленным URL-адресом, чтобы идентифицировать меня. есть ссылка на среду разработки, чтобы увидеть. благодарю вас - person mnguyen; 27.02.2018

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

для всех, кто заинтересован: я использую плагин ignitewoo gift certificates pro и хотел создать комиссию на основе остатка после купонов. это код Лоика с некоторыми изменениями:

add_action( 'woocommerce_cart_calculate_fees','wc_custom_surcharge', 10, 1 );
function wc_custom_surcharge( $cart) {
    global $woocommerce;
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $state      = array('MI');

    // HERE set your percent rate
    $percent = 6;
    $coupTotal = 0;
    foreach ( $woocommerce->cart->applied_coupons as $cc ) {
    $coupon = new WC_Coupon( $cc );
    $amount = ign_get_coupon_amount( $coupon );
    $coupTotal += $amount;
    }


    // Fee calculation
    $fee = ($cart->subtotal - $coupTotal) * $percent/100;
if (( $fee > 0 ) AND  (in_array( WC()->customer->shipping_state, $state ) ))
        $cart->add_fee( __('Tax', 'woocommerce'), $fee, false);
}
person mnguyen    schedule 01.03.2018