Диагностика задачи: зачем нужно менять цены автоматически
В интернет-магазинах на WooCommerce часто требуется менять цены товаров в определённое время — например, запускать акции, скидки на выходные или поднимать цены в периоды повышенного спроса. Ручное редактирование цен неудобно и рискованно, особенно если товаров много. Автоматизация через код позволяет точно и вовремя обновлять цены без ошибок.
Как работает автообновление цен в WooCommerce
Основная идея — использовать WP-Cron для запуска функции, которая изменит цену нужных товаров по заданному расписанию. При этом изменения можно делать как для всех товаров, так и для выбранных категорий или товаров по ID.
Что именно изменяется
- Регулярная цена (
regular_price) - Цена по акции (
sale_price) - Дата начала и окончания акции (
sale_price_dates_from,sale_price_dates_to)
Пошаговое решение: пример кода автоматического снижения цен на 20% с 1 по 7 число каждого месяца
1. Регистрируем WP-Cron событие, если оно ещё не создано:
function wpfind_register_price_update_cron() {
if ( ! wp_next_scheduled( 'wpfind_update_prices_event' ) ) {
wp_schedule_event( strtotime('first day of this month 00:05'), 'monthly', 'wpfind_update_prices_event' );
}
}
add_action( 'wp', 'wpfind_register_price_update_cron' );2. Создаём функцию, которая будет обновлять цены:
function wpfind_update_prices() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
);
$products = get_posts( $args );
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
if ( ! $product ) continue;
$regular_price = $product->get_regular_price();
if ( ! $regular_price ) continue;
$new_sale_price = $regular_price * 0.8; // скидка 20%
$product->set_sale_price( $new_sale_price );
$product->set_date_on_sale_from( current_time( 'timestamp' ) );
// Устанавливаем окончание акции на 7 число текущего месяца 23:59
$sale_to = strtotime('7 day of this month 23:59');
$product->set_date_on_sale_to( $sale_to );
$product->save();
}
}
add_action( 'wpfind_update_prices_event', 'wpfind_update_prices' );3. Добавляем функцию для удаления акции после 7 числа (по аналогии с обновлением), чтобы цены возвращались к обычным:
function wpfind_remove_sales_after_7th() {
$today = date('j');
if ( $today <= 7 ) return; // Выполняем только после 7 числа
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_sale_price',
'compare' => 'EXISTS',
),
),
);
$products = get_posts( $args );
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
if ( ! $product ) continue;
$product->set_sale_price( '' );
$product->set_date_on_sale_from( '' );
$product->set_date_on_sale_to( '' );
$product->save();
}
}
add_action( 'wp', 'wpfind_remove_sales_after_7th' );Проверка результата после внедрения
- Убедитесь, что в таблице
wp_optionsсоздалась запись с cron задачейwpfind_update_prices_event(например, с помощью плагина WP Crontrol). - Вручную вызовите функцию
wpfind_update_prices()через консоль WP-CLI или временный вызов в шаблоне, чтобы проверить обновление цен. - Проверьте карточки товаров на фронтенде — должны появиться цены по акции и даты акции.
- После 7-го числа убедитесь, что акции снялись автоматически.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически — если на сайте мало трафика, cron-задачи могут не срабатывать. Решение: настроить системный cron для вызова
wp-cron.php. - Функции обновления цен вызываются слишком часто — используйте проверку даты и условия, чтобы избежать частого запуска.
- Цены не меняются — проверьте, что у товаров есть
regular_price, нет ошибок в логах, и что объектWC_Productкорректно создаётся. - Ошибка в сохранении продукта — убедитесь, что вызов
$product->save()происходит после всех изменений.
Практические советы по безопасности и производительности
- Для большого каталога товаров используйте пагинацию при выборке, чтобы не перегружать память.
- Добавьте проверку прав пользователя или запуска в фоне, если функции вызываются вручную.
- Ограничьте изменение цен только нужными категориями или тегами для точечного управления.
- Используйте кеширование WooCommerce и объектов, чтобы избежать лишних запросов.
Сравнение вариантов реализации автоматизации цен
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код через WP-Cron | Гибкость, точный контроль, без сторонних плагинов | Требует навыков, возможны проблемы с WP-Cron на слабых хостингах |
| Плагины для скидок и акций | Простота настройки, визуальные интерфейсы, дополнительные функции | Могут нагружать сайт, не всегда гибкие |
| Ручное изменение цен | Простота | Ошибки, трудоёмко, не автоматизировано |