wp-kurs.ru wordpress WP-Kurs

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

Проблема: как автоматически менять цены товаров при колебаниях валюты

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

Диагностика проблемы

  • Цены товаров в WooCommerce не соответствуют актуальному курсу валюты.
  • Ручное обновление цен слишком трудоемко и подвержено ошибкам.
  • Отсутствует автоматизация, что влияет на прибыль и ценообразование.

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

Пошаговое решение: настройка автопересчёта цен товаров

1. Получение курса валюты из внешнего API

Для примера используем API ExchangeRate-API. Зарегистрируйтесь и получите ключ API.

function get_usd_to_rub_rate() {
    $api_key = 'ваш_ключ_api';
    $url = 'https://v6.exchangerate-api.com/v6/' . $api_key . '/latest/USD';

    $response = wp_remote_get($url);
    if (is_wp_error($response)) {
        return false;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (!isset($data['conversion_rates']['RUB'])) {
        return false;
    }

    return floatval($data['conversion_rates']['RUB']);
}

2. Функция для обновления цен товаров

Предположим, что в базе цены указаны в USD, а нужно показывать в рублях с учетом актуального курса.

function update_product_prices_by_rate($rate) {
    if (!$rate) {
        error_log('Ошибка: курс валют не получен');
        return;
    }

    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'posts_per_page' => -1
    ];

    $products = get_posts($args);

    foreach ($products as $product_post) {
        $product = wc_get_product($product_post->ID);
        $price_usd = get_post_meta($product->get_id(), '_price_usd', true);

        if (!$price_usd) {
            // Если цена в USD не сохранена, сохраняем текущую цену как базовую
            $price_usd = $product->get_regular_price();
            update_post_meta($product->get_id(), '_price_usd', $price_usd);
        }

        $new_price = round($price_usd * $rate, 2);

        // Обновляем цену в WooCommerce
        $product->set_regular_price($new_price);
        $product->set_sale_price(''); // сбрасываем скидку
        $product->save();
    }
}

3. Автоматизация обновления с помощью WP-Cron

Добавим задачу, которая будет обновлять цены ежедневно в 3:00 ночи.

add_action('woocommerce_update_prices_cron', 'woocommerce_update_prices_daily');

function woocommerce_update_prices_daily() {
    $rate = get_usd_to_rub_rate();
    update_product_prices_by_rate($rate);
}

// Планируем задачу при активации темы или плагина
function woocommerce_schedule_price_update() {
    if (!wp_next_scheduled('woocommerce_update_prices_cron')) {
        wp_schedule_event(strtotime('03:00:00'), 'daily', 'woocommerce_update_prices_cron');
    }
}
add_action('wp', 'woocommerce_schedule_price_update');

// Очистка расписания при деактивации
function woocommerce_clear_price_update_schedule() {
    $timestamp = wp_next_scheduled('woocommerce_update_prices_cron');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'woocommerce_update_prices_cron');
    }
}

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

  • Через админку WooCommerce проверьте, что цены товаров изменились в соответствии с текущим курсом.
  • Логируйте ошибки в error_log, чтобы убедиться в корректности получения курса.
  • Можно вручную запустить функцию woocommerce_update_prices_daily() для теста.
  • Для отладки выведите курс валюты с помощью error_log('Курс USD-RUB: ' . $rate);.

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

  • Ошибка получения курса валюты: Проверьте корректность API ключа, доступность сервиса и формат ответа.
  • Цены не обновляются: Убедитесь, что WP-Cron работает (например, запускается при посещении сайта), или используйте системный cron для запуска wp-cron.php.
  • Цена не сохраняется: Проверьте, что у товаров есть метаполе _price_usd с базовой ценой в USD.
  • Неправильные цены после обновления: Убедитесь, что округление чисел и преобразование типов корректны.

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

  • Кэшируйте курс валюты, чтобы избежать частых запросов к API (например, сохраняйте курс в transient на сутки).
  • Используйте WP-Cron только для планирования задач, а для надежности запускайте системный cron.
  • Протестируйте работу на тестовой среде, чтобы избежать сбоев в боевом магазине.
  • Ограничьте права API ключа, если это возможно, чтобы исключить злоупотребления.
  • Резервируйте базу перед массовыми обновлениями, чтобы быстро откатить изменения при ошибках.

Сравнение методов обновления цен

МетодПреимуществаНедостаткиПример
Плагин мультивалютностиГотовое решение, поддержка курсов, пользовательский выбор валютЗависимость от стороннего кода, возможные конфликты, стоимостьWooCommerce Multilingual, Currency Switcher
Ручное обновление ценПростота, контрольТрудозатратно, высок риск ошибокЧерез админку или CSV
Кодовое автопересчитывание (описано выше)Автоматизация, гибкость, кастомизация под задачиНужны навыки разработки, поддержка кодаФункции с WP-Cron и API
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее