Диагностика задачи: зачем автоматизировать изменение цен в WooCommerce
В интернет-магазинах на WooCommerce часто требуется автоматически менять цены товаров в зависимости от акций, сезонных скидок или других условий. Ручное изменение цен неудобно, особенно при большом ассортименте. Для автоматизации можно использовать штатный механизм WP-Cron WordPress, который позволяет запускать задачи по расписанию.
Пошаговое решение: настройка WP-Cron для изменения цен товаров
1. Создаем функцию для изменения цен
Напишем функцию, которая изменит цену всех товаров, например, уменьшит цену на 10%.
function wpeditor_apply_discount_to_all_products() {
// Получаем все ID товаров
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => 'publish',
];
$product_ids = get_posts($args);
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if (!$product) continue;
$regular_price = $product->get_regular_price();
if (!$regular_price) continue;
// Уменьшаем цену на 10%
$new_price = round($regular_price * 0.9, 2);
// Обновляем цену
$product->set_sale_price($new_price);
$product->save();
}
}2. Регистрируем событие WP-Cron
Добавляем в functions.php регистрацию задачи, которая будет запускаться, например, ежедневно.
function wpeditor_schedule_daily_price_update() {
if (!wp_next_scheduled('wpeditor_daily_price_update_event')) {
wp_schedule_event(time(), 'daily', 'wpeditor_daily_price_update_event');
}
}
add_action('wp', 'wpeditor_schedule_daily_price_update');
// Хук для запуска нашей функции
add_action('wpeditor_daily_price_update_event', 'wpeditor_apply_discount_to_all_products');3. Очистка расписания при деактивации темы или плагина
Чтобы не оставлять задачи после удаления, добавьте очистку:
function wpeditor_clear_scheduled_price_update() {
$timestamp = wp_next_scheduled('wpeditor_daily_price_update_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpeditor_daily_price_update_event');
}
}
register_deactivation_hook(__FILE__, 'wpeditor_clear_scheduled_price_update');Проверка результата после внедрения
- В админке WooCommerce проверьте цены товаров — должна появиться скидочная цена с уменьшением на 10%.
- Проверьте журнал ошибок сервера и логи WP-Cron (можно использовать плагин WP Crontrol) для подтверждения срабатывания задачи.
- Ручной запуск задачи через WP Crontrol подтвердит корректность функции без ожидания cron-события.
Частые ошибки и как исправить
- Цены не меняются: Проверьте, что функция получает товары и цены. Добавьте логирование или var_dump внутри цикла.
- WP-Cron не запускается: На некоторых серверах cron-задания WP-Cron не срабатывают без посещения сайта. Используйте системный cron или плагин WP Crontrol.
- Скидочная цена не отображается: Убедитесь, что шаблон темы корректно выводит
sale_price. Также проверьте статус товара. - Проблемы с производительностью: При большом количестве товаров разбейте обновление на части с помощью offset и limit.
Практические советы по безопасности и производительности
- Ограничьте количество обновляемых товаров за один запуск, если товаров много, чтобы избежать таймаутов.
- Используйте транзиенты для кэширования данных, если функция сложная.
- Обязательно делайте бэкап базы перед массовыми изменениями.
- Для более сложных условий обновления цен используйте пользовательские поля или метаданные.
Сравнение вариантов автоматизации изменения цен
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-Cron + собственный код | Максимальная гибкость, нет лишних плагинов | Нужны навыки PHP, возможны проблемы с cron | Для точных кастомных условий |
| Плагины акций и скидок | Простая настройка, готовый функционал | Могут быть ресурсоёмкими, ограниченная гибкость | Для стандартных сценариев |
| Системный cron + WP-CLI | Надежный запуск, подходит для больших сайтов | Требует доступа к серверу и навыков работы с консолью | При больших объемах и необходимости точного контроля |