wplang.ru wordpress WP Lang

WooCommerce: как добавить динамическое изменение стоимости товара в зависимости от выбранного языка

Диагностика проблемы: почему цена не меняется при смене языка

В WooCommerce на многоязычных сайтах часто возникает задача показывать разные цены товаров в зависимости от выбранного языка. По умолчанию WooCommerce этого не поддерживает – цена хранится в одном месте и не зависит от языка. Это приводит к тому, что при переключении языка цена остается одинаковой, что может вводить пользователя в заблуждение и снижать конверсию.

Чтобы проверить, есть ли у вас эта проблема, переключитесь на другой язык и посмотрите цену товара. Если она не меняется, значит функционал динамического изменения стоимости не реализован.

Пошаговое решение: добавляем динамическую цену по языку через код

1. Используем хук woocommerce_product_get_price

Для изменения цены на лету при выводе товара в WooCommerce можно использовать фильтр woocommerce_product_get_price. Он позволяет подменить цену товара перед отображением.

2. Определяем текущий язык

Если вы используете популярные плагины для мультиязычности (например, WPML или Polylang), нужно получить текущий язык сайта. Пример для Polylang:

function get_current_language_code() {
    if ( function_exists('pll_current_language') ) {
        return pll_current_language();
    }
    return 'default'; // язык по умолчанию
}

3. Добавляем массив с ценами по языкам

Создаем массив, где ключ — код языка, а значение — нужная цена, например:

$prices_by_language = [
    'ru' => 1000, // цена для русского
    'en' => 30,   // цена для английского
    'de' => 28    // цена для немецкого
];

4. Подключаем фильтр для замены цены

add_filter('woocommerce_product_get_price', 'change_price_by_language', 10, 2);
function change_price_by_language($price, $product) {
    $lang = get_current_language_code();

    $prices_by_language = [
        'ru' => 1000,
        'en' => 30,
        'de' => 28
    ];

    if ( isset($prices_by_language[$lang]) ) {
        return $prices_by_language[$lang];
    }

    return $price;
}

Такой код заменит цену на сайте согласно текущему языку.

Проверка результата после внедрения

  1. Переключитесь на каждый из языков на сайте.
  2. Откройте страницу товара и убедитесь, что цена меняется согласно заданному массиву.
  3. Проверьте корзину и оплату: цены должны обновляться и там тоже.

Для проверки корректности можно использовать инструменты разработчика браузера и убедиться, что цена в HTML соответствует ожидаемой.

Частые ошибки и как их исправить

  • Цена не меняется: возможно, вы забыли добавить фильтр или неправильно определили текущий язык. Проверьте корректность функции получения языка.
  • Цена меняется только на страницах товара, но не в корзине: в этом случае нужно добавить аналогичный фильтр для woocommerce_product_get_price_in_cart и woocommerce_cart_item_price.
  • Конфликт с кешированием: если на сайте включено кеширование, цены могут не обновляться сразу. Очистите кеш и проверьте снова.
  • Проблемы с валютами: если на сайте используется мультивалютность, может потребоваться дополнительно синхронизировать цены с валютами.

Практические советы для расширения и безопасности

  • Храните цены по языкам не в коде, а в настройках темы или отдельной таблице, чтобы было проще управлять.
  • Для WooCommerce с большим количеством товаров и языков лучше использовать специализированные плагины, чтобы избежать ошибок.
  • Всегда проверяйте, что цена возвращается в формате строки с десятичной точкой, например '30.00'.
  • Для повышения производительности кешируйте результаты определения цены, если вычисления сложные.
  • Убедитесь, что фильтры применяются с правильным приоритетом, чтобы избежать конфликтов с другими плагинами.

Дополнительный код для корректного отображения цены в корзине и чекауте

add_filter('woocommerce_product_get_price_in_cart', 'change_price_by_language_in_cart', 10, 2);
function change_price_by_language_in_cart($price, $product) {
    return change_price_by_language($price, $product);
}

add_filter('woocommerce_cart_item_price', 'change_price_display_in_cart', 10, 3);
function change_price_display_in_cart($price_html, $cart_item, $cart_item_key) {
    $product = $cart_item['data'];
    $price = change_price_by_language($product->get_price(), $product);
    return wc_price($price);
}

Сравнение подходов изменения цены по языку

МетодПлюсыМинусы
Код через фильтры (пример выше)Быстро, гибко, без плагиновТребует поддержки, не масштабируется для большого каталога
Плагины мультиязычности с поддержкой ценПолная интеграция, удобный интерфейсСтоимость, нагрузка на сайт
Отдельные товары на каждый языкМаксимальная гибкостьСложность управления, возможны дубли
×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙