Динамическое изменение цены продукта woocommerce

Я пытаюсь динамически добавить пользовательскую плату к цене продукта в woocommerce. Я делал это много раз в прошлом, но сейчас это не работает. Вот мой код.

    function calculate_eyehole_fee( $cart_object ) {  
    global $isProcessed;
    if( !WC()->session->__isset( "reload_checkout" )) {

        $eyeHoleFee = 30.00;
        $ribbonFee = 20.00;

        // Get exchange rate details and defined fees
        $strCurrencyCode = get_woocommerce_currency();
        $arrExchangeRates = get_option('wc_aelia_currency_switcher');
        $fltExchangeRate = $arrExchangeRates['exchange_rates'][$strCurrencyCode]['rate'];

        $eveHoleCurrFee = $eyeHoleFee * $fltExchangeRate;
        $ribbonCurrFee = $ribbonFee * $fltExchangeRate;

        foreach ( $cart_object->cart_contents as $key => $value ) {

            $additionCost = 0.0;
            if( isset( $value["eyeHoleReq"] ) && $value["eyeHoleReq"] == 'yes' ) {
                $fltEyeFee = $eveHoleCurrFee;
                $additionCost = $fltEyeFee;
            } 
            if( isset( $value["eyeRibbon"] ) && $value["eyeRibbon"] == 'yes' ) {
                $fltRibbonFee = $ribbonCurrFee;
                $additionCost += $fltRibbonFee;
            }
            $cart_object->cart_contents[$key]['data']->price += $additionCost;
        } 
        $isProcessed = true;  
    }
    print('<pre>');print_r($cart_object);print('</pre>');
}

add_action( 'woocommerce_before_calculate_totals', 'calculate_eyehole_fee', 99 );

Моя цена обновляется в объекте корзины, но не отражает где. Следовательно, итоговые значения также неверно рассчитаны.


person Vidish Purohit    schedule 21.05.2017    source источник


Ответы (1)


После обновления woocommerce 3.0 мы не можем напрямую устанавливать цену. Вместо этого мы должны использовать метод set_price(). Итак, следующее должно работать:

function calculate_eyehole_fee( $cart_object ) {  
    global $isProcessed;
    if( !WC()->session->__isset( "reload_checkout" )) {

        $eyeHoleFee = 30.00;
        $ribbonFee = 20.00;

        // Get exchange rate details and defined fees
        $strCurrencyCode = get_woocommerce_currency();
        $arrExchangeRates = get_option('wc_aelia_currency_switcher');
        $fltExchangeRate = $arrExchangeRates['exchange_rates'][$strCurrencyCode]['rate'];

        $eveHoleCurrFee = $eyeHoleFee * $fltExchangeRate;
        $ribbonCurrFee = $ribbonFee * $fltExchangeRate;

        foreach ( $cart_object->get_cart() as $key => $value ) {

            $additionCost = 0.0;
            if( isset( $value["eyeHoleReq"] ) && $value["eyeHoleReq"] == 'yes' ) {
                $fltEyeFee = $eveHoleCurrFee;
                $additionCost = $fltEyeFee;
            } 
            if( isset( $value["eyeRibbon"] ) && $value["eyeRibbon"] == 'yes' ) {
                $fltRibbonFee = $ribbonCurrFee;
                $additionCost += $fltRibbonFee;
            }
            $defPrice = $value['data']->get_price('edit');
            $value['data']->set_price((float) $defPrice + $additionCost);
        } 
        $isProcessed = true;  
    }
    print('<pre>');print_r($cart_object);print('</pre>');
}

add_action( 'woocommerce_before_calculate_totals', 'calculate_eyehole_fee', 99 );
person Oleg    schedule 21.05.2017