WooCommerce: автоматическое обновление стоимости товаров при изменении валюты

Проблема: цены товаров не обновляются при смене валюты в 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-скриптПолный контроль, оптимизация под задачиТребует разработки и поддержки, возможны ошибки
Статический переключатель без обновления ценПростота реализацииНеудобство для пользователей, потеря конверсий
Как избежать проблем с разрешением файлов в WooCommerce при загрузке изображений товаров
19.05.2026
Как установить границы пагинации в WordPress для улучшения навигации
01.01.2026
Как установить бесплатный SSL в WordPress без проблем
15.12.2025
Как отладить и решить ошибки Fatal Error в WordPress
25.01.2026
Как создать многоуровневую пагинацию в WordPress с поддержкой AJAX
04.01.2026