Проблема: цены товаров не обновляются при смене валюты в WooCommerce
Во многих интернет-магазинах на WooCommerce реализована поддержка нескольких валют. Однако при смене валюты пользователи часто сталкиваются с тем, что цены товаров не обновляются автоматически, а отображаются в базовой валюте без пересчёта. Это приводит к потере продаж и неудобству для клиентов.
Диагностика проблемы
- Проверьте, установлен ли плагин мультивалютности и как он реализован (через сторонние плагины или кастомный код).
- Посмотрите, есть ли автоматический пересчёт цен при переключении валюты.
- Проверьте, хранятся ли цены товаров в базе данных в одной валюте или для каждой валюты есть отдельные метаполя.
- Посмотрите консоль браузера на предмет ошибок JavaScript, которые могут препятствовать обновлению цен.
Пошаговое решение автоматического обновления цен
1. Использование плагина мультивалютности с автоматическим курсом
Рекомендуется использовать проверенные плагины, которые автоматически конвертируют цены по актуальному курсу, например:
- Clearfy Pro — содержит модули для SEO и оптимизации, но также поддерживает интеграции с мультивалютными плагинами.
- WooCommerce Multilingual + WPML — популярный вариант с поддержкой валют.
- Currency Switcher for WooCommerce — простой и надежный переключатель валют.
Плюс такого решения — минимальный кастомный код, минус — возможные ограничения бесплатных версий.
2. Кастомный код для обновления цен с использованием AJAX
Если плагин не подходит, реализуйте автоматическое обновление с помощью AJAX. Вот пример упрощённого варианта:
add_action('wp_enqueue_scripts', function() {
wp_enqueue_script('wc-currency-switch', get_stylesheet_directory_uri() . '/js/currency-switch.js', ['jquery'], '1.0', true);
wp_localize_script('wc-currency-switch', 'wcCurrencyData', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wc_currency_nonce')
]);
});
add_action('wp_ajax_update_product_prices', 'update_product_prices_callback');
add_action('wp_ajax_nopriv_update_product_prices', 'update_product_prices_callback');
function update_product_prices_callback() {
check_ajax_referer('wc_currency_nonce', 'nonce');
$currency = sanitize_text_field($_POST['currency']);
global $wpdb;
// Пример: получаем курс из внешнего API (заглушка)
$rates = [
'USD' => 1,
'EUR' => 0.85,
'RUB' => 75
];
$base_currency = 'USD';
if (!isset($rates[$currency])) {
wp_send_json_error('Неизвестная валюта');
}
$rate = $rates[$currency] / $rates[$base_currency];
// Получаем ID товаров на странице (пример для 10 товаров)
$product_ids = array_map('absint', $_POST['product_ids']);
$prices = [];
foreach ($product_ids as $id) {
$base_price = get_post_meta($id, '_regular_price', true);
$converted_price = round($base_price * $rate, 2);
$prices[$id] = wc_price($converted_price, ['currency' => $currency]);
}
wp_send_json_success(['prices' => $prices]);
}JS (currency-switch.js):
jQuery(function($) {
$('.currency-switcher').on('change', function() {
var selectedCurrency = $(this).val();
var productIds = [];
$('.product').each(function() {
productIds.push($(this).data('product-id'));
});
$.ajax({
url: wcCurrencyData.ajax_url,
method: 'POST',
data: {
action: 'update_product_prices',
currency: selectedCurrency,
product_ids: productIds,
nonce: wcCurrencyData.nonce
},
success: function(response) {
if (response.success) {
$.each(response.data.prices, function(id, priceHtml) {
$('.product[data-product-id="' + id + '"] .price').html(priceHtml);
});
} else {
console.error('Ошибка обновления цен:', response.data);
}
}
});
});
});Проверка результата
- Откройте страницу магазина и переключите валюту через селектор.
- Убедитесь, что цены всех товаров изменились согласно новому курсу.
- Проверьте консоль браузера на предмет ошибок JavaScript.
- Для плагинов — убедитесь, что они обновляют цены без перезагрузки страницы.
Частые ошибки и их устранение
- Цены не меняются при переключении валюты: проверьте правильность AJAX-запроса и nonce, а также наличие JS-обработчика.
- Отображаются некорректные цены: убедитесь в правильности курса валют и что цены берутся из метаполей _regular_price или _price.
- Конфликты с другими плагинами: отключите плагины кэширования и кэш браузера при тестировании.
- Курс валют не обновляется: настройте регулярный вызов API для получения актуальных курсов.
Практические советы по производительности и безопасности
- Используйте кеширование курсов валют, чтобы не делать запросы к API на каждый AJAX-запрос.
- Ограничьте обновление цен только для видимых на странице товаров, чтобы снизить нагрузку.
- Защищайте AJAX-запросы с помощью nonce и валидации данных.
- При использовании плагинов мультивалютности следите за их обновлениями и совместимостью с вашим WooCommerce.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| Готовый плагин мультивалютности | Быстрая настройка, автоматические курсы, поддержка | Может быть платным, лишний функционал |
| Кастомный AJAX-скрипт | Полный контроль, оптимизация под задачи | Требует разработки и поддержки, возможны ошибки |
| Статический переключатель без обновления цен | Простота реализации | Неудобство для пользователей, потеря конверсий |