Ключевой момент этого урока именно научить вас изменять цену товаров через код для каких-то конкретных ситуаций, в качестве примера я решил показать вам, как сделать скидку 20% на все товары для авторизованных пользователей интернет-магазина, но вы можете использовать любое другое условие.
Ребята, на моём сайте есть супер-видеокурс по WooCommerce, всем рекомендую 🚀
Весь наш код будет состоять из двух хуков WooCommerce:
woocommerce_get_price_html
– отвечает в основном за отображение цены,woocommerce_before_calculate_totals
– участвует в формировании общей суммы заказа.Ну и код, конечно же, вы знаете, куда вставлять? Нет? … functions.php
текущей или дочерней темы или произвольный плагин.
add_filter( 'woocommerce_get_price_html', 'truemisha_display_price', 25, 2 ); function truemisha_display_price( $price_html, $product ) { // ничего не делаем в админке if ( is_admin() ) { return $price_html; } // если цена пустая, тоже забиваем if ( '' === $product->get_price() ) { return $price_html; } // класс, это наш пользователь сайта, ему вешаем скидку 20% if ( wc_current_user_has_role( 'customer' ) ) { $price_html = wc_price( wc_get_price_to_display( $product ) * 0.80 ); } return $price_html; } add_action( 'woocommerce_before_calculate_totals', 'truemisha_alter_price', 25 ); function truemisha_alter_price( $cart ) { // не делаем ничего в админке и если это не расчет через ajax if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; } // не наш пользователь if ( ! wc_current_user_has_role( 'customer' ) ) { return; } // запускаем цикл для всей корзины и вешаем на каждый товар доп 20% foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $price = $cart_item['data']->get_price(); $cart_item['data']->set_price( $price * 0.80 ); } }
Пара моментов про код выше:
woocommerce_before_calculate_totals
работает не только в Корзине WooCommerce, но и на странице оформления заказа, не беспокойтесь.Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Добрый день Михаил. Во-первых, хотел поблагодарить за Ваши уроки! Большое Вам спасибо! Все доходчиво объясняете. Во-вторых есть вопрос по теме - Изменяем цену программно.
Опишу ситуацию - на странице товара у меня есть калькулятор. После расчета меняется цена товара. Новую цену я отправляю методом POST и помещаю в переменную - $prisex и пытаюсь передать в корзину через кусок Вашего кода
Это удаётся сделать только на странице товара в корзине изменений не происходит. Не могли-бы Вы подсказать как предать новую цену в корзину . Заранее спасибо!
Добрый день Сергей,
Пожалуйста, очень рад, что уроки полезны и понятны 🙂
Хочу уточнить момент – получается, когда мы переходим на страницу корзины, то там изменения применяются, а на странице товара в мини-корзине изменений не происходит, верно?
Нет, не так. После того как нажимаете кнопку в "корзину" на странице товара происходит перезагрузка страницы и соответственно отправка POST. Перезагружается она на туже страницу, а именно карточку товара. И на странице карточка товара в мини корзине мы видим изменения в общей сумме заказа (она уже рассчитана по новой цене, но цена в мине корзине за единицу товара прежняя). При переходе на страницу корзины мы видим что цена за единицу товара и сумма за весь товар не изменилась
Михаил, добрый день!
Направьте в нужную сторону пожалуйста.
Как изменять отображаемую цену конкретного товара автоматически когда "щёлкаешь" селектор выбора количества (-+)? Т.е. - выбрал 2 или более - отображаемая цена сразу поменялась.
Я понимаю, что это завязано на $price_html и, очевидно, какой-то js-скрипт (чтоб привязаться к селектору количества), но совершенно не понимаю как это правильно связать.
Добрый день!
Вот как раз урок об этом.
Михаил, благодарю за ответ! Этот ваш урок я уже давно проштудировал и применил несколько раз в проектах)
Но сейчас мне нужно не совсем это. Не корзина. Очевидно, я не до конца точно сформулировал вопрос. Нужно, чтобы именно на странице товара (конкретного товара) менялась отображаемая цена при изменении его количества (по нажатию +-). Я поэтому и упомянул $price_html, т.к. по факту мне нужно просто "рисовать" новую цену вместо regular_price, если тригерится + и меняется количество. Если тригерится минус и количество = 1, то обратно "рисовать" regular_price.
И всё это на странице товара, а не в корзине. В корзине у меня уже применяется ваш код, который дает скидку в зависимости от количества и он прекрасно работает)
Здравствуйте! Все работает, но есть один нюанс: в мини-корзине цена показывается без учета скидки... Я так понимаю нужно что-то дописать в коде, не подскажите?
Здравствуйте!
А попробуйте сначала кеш в WooCommerce > Статус почистить.
Добрый день, Михаил - благодарю за урок, но тут проблемка нашлась у меня - woocommerce_mini_cart. В мини корзине не обновляются цены. В поле Общая цена - показывается обновленная цена с процентом, но у самого товара отображается старая цена. Как можно решить эту проблему?
Михаил, добрый день!
Код работает просто изумительно! Спасибо!
Единственный момент - при добавлении товара в мини-корзине скидка применяется дважды. Например, товар стоит 100 рублей, мы делаем скидку 20%. Должно быть 80 рублей, а в мини-корзине - 60.
Однако в обычной корзине все отлично.
Кэш чистил.
Возможно ошибка в коде?
Спасибо!
Мне кажется, чтобы в мини-корзине скидка не применялась дважды необходимо в js отвечающем за вывод мини корзины поковыряться. Но я могу быть не прав...