Проблема: язык пользователя не сохраняется при работе с WooCommerce
При создании мультиязычного интернет-магазина на WordPress с WooCommerce часто возникает задача корректно передавать и сохранять выбранный пользователем язык на всех страницах и при оформлении заказа. Без правильной передачи языка возникают ситуации, когда после перехода на страницу корзины или оформления заказа язык меняется на язык по умолчанию, что ухудшает UX и ведет к потере конверсий.
Диагностика проблемы
Чтобы понять, передается ли язык корректно, надо проверить следующие моменты:
- Как реализовано переключение языков: плагин (Polylang, WPML) или кастомный функционал;
- Передается ли параметр языка в URL (например, /en/, /de/)
- Сохраняется ли язык в сессии или куках при переходах;
- Как WooCommerce обрабатывает язык в сессии и при генерации страниц оформления заказа;
Для проверки можно открыть консоль браузера, посмотреть cookie и параметры URL, а также отследить HTTP-запросы и сессии (через инструменты разработчика или плагины типа Query Monitor).
Пошаговое решение: автоматическая передача языка пользователя в WooCommerce
1. Убедитесь, что язык передается через URL
Большинство мультиязычных плагинов добавляют код языка в URL. Проверьте, что после выбора языка в адресе есть соответствующий префикс, например https://example.com/en/product/.
2. Сохраняйте язык в сессии WooCommerce
Для того чтобы WooCommerce корректно работал с языком пользователя, полезно сохранять выбранный язык в сессии. Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('init', function() {
if (isset($_GET['lang'])) {
WC()->session->set('user_lang', sanitize_text_field($_GET['lang']));
}
});Этот код сохраняет параметр языка из URL в сессии WooCommerce. Если вы используете Polylang, параметр может называться по-другому, например pll_language. Тогда замените lang на нужное имя.
3. Добавьте фильтр для локализации корзины и страницы оформления заказа
Чтобы WooCommerce отображал контент на нужном языке, можно подменить язык локализации, используя фильтр locale:
add_filter('locale', function($locale) {
if (is_admin()) {
return $locale; // не менять язык в админке
}
$user_lang = WC()->session->get('user_lang');
if ($user_lang) {
// Замените соответствие языков на ваше
$mapping = [
'en' => 'en_US',
'de' => 'de_DE',
'fr' => 'fr_FR',
'ru' => 'ru_RU',
];
if (array_key_exists($user_lang, $mapping)) {
return $mapping[$user_lang];
}
}
return $locale;
});Этот фильтр подменит язык локализации WooCommerce в зависимости от значения из сессии.
4. Передавайте язык в AJAX-запросах WooCommerce
Если на вашем сайте AJAX-запросы WooCommerce обрабатывают добавление в корзину или обновление, убедитесь, что язык передается в запросах. Для этого можно добавить в JavaScript передачу параметра языка:
jQuery.ajaxSetup({
data: {
lang: window.location.pathname.split('/')[1] || 'ru' // пример извлечения языка из URL
}
});А на сервере в PHP аналогично считывайте $_REQUEST['lang'] и обновляйте сессию.
Как проверить, что решение работает
- Перейдите на сайт, выберите язык (например, английский).
- Проверьте, что в URL появился префикс языка.
- Добавьте товар в корзину и перейдите к оформлению заказа.
- Убедитесь, что страницы корзины и оформления заказа отображаются на выбранном языке.
- Проверьте cookie и сессию WooCommerce через инструменты разработчика — значение языка должно сохраняться.
Частые ошибки и как их исправить
- Язык не сохраняется при переходе на страницу оформления заказа. Причина: отсутствует сохранение языка в сессии. Решение — добавить код сохранения языка в сессию (см. пункт 2).
- Фильтр
localeне работает. Возможно, WooCommerce или тема переопределяет локаль позже. Проверьте приоритет фильтра, попробуйте увеличить приоритет, напримерadd_filter('locale', 'func', 20). - Конфликт с другими плагинами мультиязычности. Убедитесь, что параметры языка совпадают и корректно передаются между плагинами и WooCommerce.
- Язык не передается в AJAX. Добавьте параметр языка в AJAX-запросы и обновите сессию на сервере.
Практические советы по безопасности и производительности
- Используйте
sanitize_text_field()для обработки входящих параметров языка, чтобы избежать XSS-уязвимостей. - Не храните язык в cookie без необходимости, лучше использовать сессию WooCommerce, которая более защищена.
- Если у вас очень большой трафик, следите за тем, чтобы фильтры и хуки не сильно нагружали сервер — кешируйте результаты, если возможно.
Сравнение способов передачи языка в WooCommerce
| Способ | Плюсы | Минусы |
|---|---|---|
| Передача языка в URL | Простота, видимость, совместимость с SEO | Требует настройки плагина, может влиять на структуру ссылок |
| Сохранение языка в сессии WooCommerce | Удобство, язык сохраняется при переходах | Требует дополнительного кода, не всегда работает с кешированием |
| Передача языка через cookie | Простота хранения | Менее безопасно, возможны проблемы с GDPR и политикой cookie |