Проблема: автоматическое изменение цены при выборе варианта товара в WooCommerce
В стандартной работе WooCommerce при выборе варианта товара (вариации) на странице товара цена автоматически меняется согласно выбранной вариации. Иногда это мешает, например, если требуется отображать фиксированную цену или кастомный расчет цены вне зависимости от варианта. В таком случае нужно отключить или изменить это поведение.
Диагностика проблемы
Первым шагом необходимо понять, откуда именно идет изменение цены. Обычно это скрипты WooCommerce, которые подставляют цену вариации в элемент с классом .woocommerce-Price-amount. Для диагностики:
- Откройте страницу товара с вариациями;
- Выберите вариант товара;
- Обратите внимание на элемент цены — меняется ли текст внутри
<span class="woocommerce-Price-amount">; - Проверьте консоль браузера на наличие JavaScript ошибок.
Если цена меняется динамически без перезагрузки страницы — это подтверждает работу скриптов WooCommerce.
Пошаговое решение: отключение автоизменения цены
Чтобы отключить динамическую замену цены при выборе варианта товара, нужно убрать стандартный скрипт, который WooCommerce использует для этой цели, а затем при необходимости реализовать собственное отображение цены.
1. Отключение скрипта вариаций WooCommerce
В файле functions.php вашей темы или дочерней темы добавьте следующий код:
function disable_wc_single_variation_script() {
wp_dequeue_script('wc-add-to-cart-variation');
}
add_action('wp_enqueue_scripts', 'disable_wc_single_variation_script', 100);
Этот код отключит скрипт, который отвечает за динамическое обновление цены, наличия и других данных вариации.
2. Фиксация цены товара
Если требуется всегда показывать базовую цену товара (без учета вариаций), можно заменить вывод цены в шаблоне:
add_filter('woocommerce_variable_sale_price_html', 'fixed_price_display', 10, 2);
add_filter('woocommerce_variable_price_html', 'fixed_price_display', 10, 2);
function fixed_price_display($price, $product) {
// Возвращаем минимальную цену вариаций или базовую цену
$regular_price = $product->get_regular_price();
return wc_price($regular_price);
}
Этот фильтр заставит WooCommerce показывать цену товара как фиксированную, игнорируя цены вариаций.
Проверка результата после внедрения
- Очистите кэш браузера и сайта (если используете кеширующие плагины);
- Перейдите на страницу товара с вариациями;
- Выберите разные варианты товара;
- Убедитесь, что цена не меняется динамически и остается фиксированной.
Частые ошибки и как их исправить
- Цена все равно меняется — возможно, тема или другой плагин подключает собственный скрипт для вариаций. Проверьте список подключаемых скриптов через инструменты разработчика и дополнительно отключите их.
- Ошибка JavaScript после отключения скрипта — если на странице есть другие скрипты, завязанные на динамическое обновление вариаций, они могут сломаться. В этом случае разрабатывайте кастомные решения с учетом отключения стандартного скрипта.
- Цена не отображается — убедитесь, что ваш фильтр для цены возвращает корректный HTML, используйте функцию
wc_price()для правильного форматирования.
Практические советы по безопасности и производительности
- Отключение скрипта
wc-add-to-cart-variationможет повлиять на функционал выбора вариаций, поэтому тестируйте на разных устройствах и браузерах. - Не вносите изменения напрямую в плагины WooCommerce — используйте дочернюю тему или плагин для кастомных функций.
- Если используете кеширование, обязательно очищайте кэш после изменений, чтобы избежать показа устаревших данных.
Сравнительная таблица вариантов решения
| Метод | Плюсы | Минусы | Компромиссы |
|---|---|---|---|
| Отключение скрипта wc-add-to-cart-variation | Простота реализации, быстрое отключение автоизменения цены | Потеря стандартного функционала выбора вариаций (отображение наличия, цены) | Требуется дополнительная кастомизация для показа нужной информации |
| Фильтр цены с возвратом фиксированной | Сохраняет скрипты, меняет только отображение цены | Цена вариаций не отображается, что может сбить пользователя | Удобно для сайтов с фиксированными ценами, но ограничивает UX |
| Кастомный скрипт для отображения цены | Гибкость, можно реализовать любые правила вывода | Требует разработки и поддержки | Оптимальный вариант для сложных задач |