• Всем здравствуйте. Есть проблема с woocommerce, судя по поиску очень популярна, но я не смог с ней справится, уже сил нет.

    Woocommerce самый стандартный, не кастомизированый (v4.6).
    Не могу изменить цену товара, при добавлении в корзину.

    Ситуация такая:
    На странице одного товара имеется калькулятор. При вводе данных меняю цену визуально и в форму woocommerce, с одной кнопкой, создаю скрытый input, куда записываю стоимость с калькулятора.

    <form class="cart" action="" method="post" enctype="multipart/form-data">
    
    	<div class="quantity hidden">
    		<input type="hidden" id="quantity_5fcd43afc4ba0" class="qty" name="quantity" value="1">
    	</div>
    	<button type="submit" name="add-to-cart" value="2584" class="single_add_to_cart_button button">Купить</button>
    	<input type="hidden" value="11960" name="change-product-price">
    </form>

    Мне нужно эту новую сумму применить при добавлении в корзину.

    Нагуглил такое решение:

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 9999, 1);
    function add_custom_price( $cart ) {
    	$new_price = $_REQUEST['change-product-price'];
    	// Avoiding hook repetition (when using price calculations for example)
    	if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
    		return;
    
    	foreach ( $cart->get_cart() as $item ) {
    		$item['data']->set_price( $new_price );
    	}
    }

    Но цена становится равной 0. Записывал все это дело в логи, срабатывает этот экшн 2 раза. На первом вызове цена есть, на втором уже не определена.

    Не знаю что делать.
    Подскажите пожалуйста, кто сталкивался.
    За ранее большое спасибо!

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Здравствуйте.

    Вероятно, потому что при втором вызове $_REQUEST уже пустой.

    Попробуйте так:

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    function add_custom_price( $cart ) {
    	if( isset( $_REQUEST['change-product-price'] ) ) {
    		foreach ( $cart->get_cart() as $item ) {
    			$item['data']->set_price( $_REQUEST['change-product-price'] );
    		}
    	}
    }

    @denisco Так тоже делал. В таком случае цена не меняется вообще. Т.е проверку не проходит, так как REQUEST уже пустой.
    Может нужно в куки писать цену или в сессию?

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Не помню сталкивался ли с такой задачей, но я бы попробовать добавить новую цену в cart_item через хук woocommerce_add_cart_item_data, ну а потом уже использовать её в woocommerce_before_calculate_totals.

    Вот тут даже вроде какой-то пример есть.

    @denisco Да, это сработало, спасибо. Я такое же решение использовал до этого, но без сессии, и цена не менялась. С сессией работает как нужно.
    Еще раз спасибо большое!

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Изменение цены товара в корзину» закрыта для новых ответов.