Проблема: как автоматически менять цены товаров при колебаниях валюты
В 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 |