Диагностика задачи: зачем нужна мультивалютность в WooCommerce
Большинство интернет-магазинов WooCommerce по умолчанию работают с одной валютой. Однако, если вы продаёте товары международной аудитории, возникает необходимость отображать цены в разных валютах, чтобы повысить конверсию и удобство пользователей.
Типичные признаки необходимости мультивалютной поддержки:
- Посетители из разных стран жалуются на неудобство конвертации;
- Резкое падение продаж с международных IP;
- Желание расширить рынок без установки дополнительных плагинов.
Пошаговое решение: добавляем мультивалютность вручную через код
1. Создаём пользовательский селектор валют
Добавим селектор валют в верхнюю часть сайта, чтобы пользователь мог выбрать нужную валюту.
add_action('wp_head', function() {
if (!isset($_COOKIE['user_currency'])) {
setcookie('user_currency', 'USD', time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN);
$_COOKIE['user_currency'] = 'USD';
}
});
add_action('wp_footer', function() {
?>
<form method="post" id="currency-switcher" style="position: fixed; top: 10px; right: 10px; z-index: 9999;">
<select name="user_currency" onchange="document.getElementById('currency-switcher').submit()">
<option value="USD" <?php selected($_COOKIE['user_currency'], 'USD'); ?>>USD</option>
<option value="EUR" <?php selected($_COOKIE['user_currency'], 'EUR'); ?>>EUR</option>
<option value="RUB" <?php selected($_COOKIE['user_currency'], 'RUB'); ?>>RUB</option>
</select>
</form>
<?php
});
add_action('init', function() {
if (isset($_POST['user_currency'])) {
setcookie('user_currency', sanitize_text_field($_POST['user_currency']), time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN);
// Перезагружаем страницу для применения новой валюты
wp_safe_redirect($_SERVER['REQUEST_URI']);
exit;
}
});2. Подключаем конвертацию цен на фронтенде
Для конвертации цен внедрим фильтр woocommerce_get_price_html, который будет изменять отображаемую цену с учётом выбранной валюты.
add_filter('woocommerce_get_price_html', function($price_html, $product) {
$currency = $_COOKIE['user_currency'] ?? 'USD';
$price = $product->get_price();
// Курсы валют (пример, можно обновлять через API)
$rates = [
'USD' => 1,
'EUR' => 0.9,
'RUB' => 70,
];
// Если валюта не поддерживается, возвращаем изначальную цену
if (!isset($rates[$currency])) {
return $price_html;
}
$converted_price = $price * $rates[$currency];
// Форматируем цену
switch ($currency) {
case 'EUR':
$symbol = '€';
break;
case 'RUB':
$symbol = '₽';
break;
default:
$symbol = '$';
}
return sprintf('%s%.2f', $symbol, $converted_price);
}, 10, 2);3. Сохраняем валюту в заказах
Для корректного отображения цены в админке и отправляемых уведомлениях сохраним выбранную валюту в метаданных заказа.
add_action('woocommerce_checkout_create_order', function($order) {
if (isset($_COOKIE['user_currency'])) {
$order->update_meta_data('user_currency', sanitize_text_field($_COOKIE['user_currency']));
} else {
$order->update_meta_data('user_currency', 'USD');
}
});Проверка результата после внедрения
- На сайте появился селектор валют, который меняет отображение цен сразу после выбора;
- Цены товаров на страницах каталога, карточках товаров и в корзине отображаются в выбранной валюте;
- Созданные заказы содержат метаданные с валютой;
- Ручная смена валюты через селектор сохраняется в cookie и применяется на всех страницах.
Частые ошибки и как их исправить
- Цены не меняются после выбора валюты: проверьте, что куки устанавливаются и доступны, а также что фильтр
woocommerce_get_price_htmlподключён с правильным приоритетом. - Курс валют устарел: используйте API актуальных курсов из внешних сервисов (например, exchangeratesapi.io) и обновляйте массив
$ratesавтоматически. - Цена в корзине и на странице оформления заказа не совпадает с отображаемой: добавьте фильтры на расчёт цены
woocommerce_product_get_priceиwoocommerce_product_get_regular_priceдля конвертации, а также учитывайте валюту при создании и обработке заказов. - Проблемы с кешированием: при использовании плагинов кеширования исключите из кеша страницы с переключателем валют или добавьте динамические фрагменты.
Практические советы по безопасности и производительности
- Не доверяйте значениям из
$_COOKIEнапрямую — всегда фильтруйте и проверяйте. - Курсы валют лучше хранить в transient с временем жизни 12 часов, чтобы не перегружать сервер при частых запросах.
- Для улучшения UX используйте AJAX для смены валюты без перезагрузки страницы.
- Учитывайте, что WooCommerce по умолчанию не поддерживает мультивалютность, поэтому для сложных кейсов лучше использовать специализированные плагины (например, WooCommerce Multilingual), особенно если нужны платежи в разных валютах.
Сравнение подходов к мультивалютности в WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручная реализация через фильтры и куки | Полный контроль, без дополнительных плагинов, легковесно | Требует поддержки, нет интеграции с платежными шлюзами, ограниченная функциональность |
| Плагины мультивалютности (например, WooCommerce Multilingual) | Полная интеграция с платежами, автоматическое обновление курсов, удобный интерфейс | Дополнительная нагрузка, возможные конфликты, платные версии |
| Внешний сервис конвертации + кастомный код | Актуальные курсы, можно гибко настраивать | Зависимость от API, сложность в поддержке |