Диагностика задачи: зачем менять цены товаров автоматически?
В интернет-магазинах на WooCommerce зачастую требуется регулярно менять цены на товары в зависимости от распродаж, акций, сезонных скидок или изменения закупочных цен. Ручное обновление большого количества товаров неудобно и подвержено ошибкам. Автоматизация процесса с помощью кода позволяет экономить время и исключить человеческий фактор.
Как настроить автоматическое изменение цен по расписанию в WooCommerce
1. Использование WP-Cron для запуска задачи по расписанию
WordPress предоставляет встроенный планировщик задач WP-Cron, который позволяет запускать функции по расписанию. Для автоматического изменения цен создадим собственную задачу, которая будет срабатывать, например, ежедневно в определённое время.
if ( ! wp_next_scheduled( 'wpassist_change_product_prices_daily' ) ) {
wp_schedule_event( strtotime('02:00:00'), 'daily', 'wpassist_change_product_prices_daily' );
}
Здесь мы планируем событие, которое сработает каждый день в 2 часа ночи.
2. Функция для изменения цен товаров
Внутри обработчика события нужно пройтись по нужным товарам и изменить их цены. Ниже пример изменения цены всех товаров с категорией "Распродажа" — уменьшение цены на 10%.
add_action( 'wpassist_change_product_prices_daily', 'wpassist_update_sale_prices' );
function wpassist_update_sale_prices() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'rasprodazha',
],
],
];
$products = get_posts( $args );
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
if ( ! $product ) {
continue;
}
$regular_price = (float) $product->get_regular_price();
if ( $regular_price <= 0 ) {
continue;
}
$new_price = round( $regular_price * 0.9, 2 ); // скидка 10%
$product->set_sale_price( $new_price );
$product->save();
}
}
3. Очистка cron задачи при деактивации темы или плагина
Для чистоты кода важно отменять запланированные события при деактивации.
function wpassist_clear_scheduled_event() {
$timestamp = wp_next_scheduled( 'wpassist_change_product_prices_daily' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpassist_change_product_prices_daily' );
}
}
register_deactivation_hook( __FILE__, 'wpassist_clear_scheduled_event' );
Проверка результата после внедрения
- В админке WordPress установите плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/) для просмотра и управления запланированными задачами.
- Проверьте, что задача
wpassist_change_product_prices_dailyзапланирована и активна. - Вручную запустите задачу через WP Crontrol для проверки изменения цен без ожидания.
- Откройте карточки товаров из категории "Распродажа" и убедитесь, что цена продажи изменилась на 10% меньше регулярной.
Частые ошибки и как их исправить
- Задача не срабатывает: проверьте работу WP-Cron, иногда на серверах с низкой активностью посетителей cron не запускается. Для надежности настройте системный cron через хостинг.
- Цены не меняются: убедитесь, что категория товаров указана правильно и товары действительно имеют регулярную цену.
- Проблемы с сохранением товара: убедитесь в правильном использовании методов
set_sale_price()иsave()у объектаWC_Product.
Практические советы по безопасности и производительности
- При большом количестве товаров разбивайте обновление на партии, чтобы избежать превышения времени выполнения скрипта.
- Используйте транзиенты или кэширование для хранения результатов и минимизации запросов к базе.
- Ограничьте права доступа к коду, который меняет цены, чтобы исключить несанкционированные изменения.
Сравнение способов изменения цен в WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин автоматизации цен | Простота настройки, готовые функции | Зависимость от стороннего кода, возможные конфликты | Dynamic Pricing for WooCommerce |
| WP-Cron с кастомным кодом | Полный контроль, без лишних плагинов | Требуется программирование и тестирование | Код из статьи |
| Ручное обновление через админку | Простота и универсальность | Трудозатратно на больших магазинах | Редактирование товаров вручную |