Проблема: необходимость автоматического обновления цен после завершения акции
В WooCommerce часто возникают ситуации, когда после окончания акции требуется автоматически скорректировать цены товаров, например, вернуть их к обычному значению или обновить согласно новым условиям. Ручное изменение цен неудобно и приводит к ошибкам, особенно при большом каталоге. В этой статье рассмотрим, как настроить автоматическое изменение цен с помощью кода без использования сторонних плагинов.
Диагностика задачи
Основные вопросы, которые нужно решить:
- Как определить дату окончания акции для товаров?
- Как автоматически обновить цену после даты окончания акции?
- Как избежать конфликтов с другими плагинами и кешами?
В WooCommerce акция обычно задаётся через поля sale_price и даты sale_price_dates_from и sale_price_dates_to. По окончании даты акции цена должна обновиться на обычную (regular_price).
Пошаговое решение
1. Создаем функцию для проверки и обновления цен
Добавим в functions.php или в свой плагин код, который по расписанию проверит товары и обновит цены:
function wc_update_prices_after_sale() {
// Получаем текущую дату в формате timestamp
$now = current_time('timestamp');
// Запрос товаров, у которых акция закончилась
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_sale_price_dates_to',
'value' => $now,
'compare' => '<=',
'type' => 'NUMERIC',
],
[
'key' => '_sale_price_dates_to',
'compare' => 'EXISTS',
]
],
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$product = wc_get_product($product_id);
if (!$product) continue;
// Сбрасываем цену продажи
$product->set_sale_price('');
$product->set_date_on_sale_to('');
$product->save();
// Обновляем метаданные для синхронизации
update_post_meta($product_id, '_sale_price', '');
update_post_meta($product_id, '_sale_price_dates_to', '');
}
}
2. Автоматизация через wp_cron
Добавим событие, чтобы функция запускалась ежедневно:
function wc_schedule_price_update_event() {
if (!wp_next_scheduled('wc_update_prices_cron_hook')) {
wp_schedule_event(time(), 'daily', 'wc_update_prices_cron_hook');
}
}
add_action('wp', 'wc_schedule_price_update_event');
add_action('wc_update_prices_cron_hook', 'wc_update_prices_after_sale');
3. Ручной запуск для теста
Для проверки можно временно вызвать функцию вручную:
add_action('admin_init', function() {
if (current_user_can('manage_options') && isset($_GET['run_price_update'])) {
wc_update_prices_after_sale();
echo 'Цены обновлены';
exit;
}
});
После теста удалите или закомментируйте этот код.
Проверка результата после внедрения
- Проверьте в админке WooCommerce, что у товаров с прошедшей датой акции поле "Акционная цена" очищено.
- На фронтенде убедитесь, что отображается обычная цена.
- Проверьте логи сервера или включите WP_DEBUG для выявления ошибок.
- Для запуска wp_cron вручную используйте плагин WP Crontrol или вызовите URL с параметром
?run_price_update=1в админке.
Частые ошибки и как их исправить
- Функция не запускается по расписанию: проверьте, включен ли wp_cron на сайте (опция
DISABLE_WP_CRONне должна быть true). Если сайт мало посещаем, используйте системный cron на сервере. - Цены не обновляются: убедитесь, что у товара правильно заполнено поле
_sale_price_dates_toв формате timestamp. - Конфликты с кешированием: после обновления цен очистите кеши (объектный, плагинов, CDN).
- Ошибки прав доступа: запуск функции требует прав администратора, проверяйте capability в ручном запуске.
Практические советы по безопасности и производительности
- Используйте
wp_schedule_eventс интервалом не реже суток, чтобы не перегружать сервер. - Добавьте логирование изменений в отдельный файл для аудита.
- При большом количестве товаров разбивайте обновление на партии, чтобы избежать превышения лимита памяти или времени выполнения.
- Регулярно очищайте устаревшие метаданные, связанные с акциями.
Сравнение вариантов автоматического обновления цен в WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код через wp_cron | Полный контроль, нет плагинов, гибкость | Требует знаний PHP, настройка cron | Как в статье |
| Плагины акции и скидок | Простая настройка, UI, поддержка | Нагрузка, возможные конфликты | WooCommerce Dynamic Pricing |
| Ручное обновление | Простота | Трудозатратно, риск ошибок | Через админку |