Диагностика проблемы: почему нужно автоматическое обновление каталога WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость регулярно обновлять цены, наличие товаров или другие данные каталога. Ручное обновление через админ-панель неудобно и занимает много времени, особенно при большом количестве товаров. Чтобы решить эту задачу, можно использовать встроенный планировщик задач WordPress — WP-Cron.
WP-Cron позволяет запускать PHP-функции по расписанию, например, раз в час или ежедневно. Это обеспечивает автоматическое обновление каталога без вашего участия.
Как проверить, работает ли WP-Cron на вашем сайте
- Проверьте, активирован ли WP-Cron по умолчанию. Для этого откройте файл
wp-config.phpи убедитесь, что нет строкиdefine('DISABLE_WP_CRON', true);. - Установите плагин WP Crontrol — с его помощью можно просмотреть, какие задачи запланированы и когда они выполняются.
- В разделе «Инструменты» → «Cron Events» плагина WP Crontrol можно видеть активные события и запускать их вручную для теста.
Пошаговое решение: настройка автоматического обновления каталога WooCommerce с WP-Cron
1. Создаем функцию обновления каталога
В файле functions.php вашей дочерней темы или в собственном плагине добавьте функцию, которая обновит нужные данные. В примере ниже обновим цены товаров, добавив 10% к базовой цене.
function wps_update_woocommerce_prices() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$product = wc_get_product($product_id);
if ($product) {
$regular_price = (float) $product->get_regular_price();
$new_price = $regular_price * 1.10; // Увеличиваем на 10%
$product->set_price($new_price);
$product->save();
}
}
}2. Регистрируем событие WP-Cron
Теперь нужно зарегистрировать событие, которое будет запускать эту функцию, например, ежедневно.
function wps_schedule_daily_update() {
if (!wp_next_scheduled('wps_daily_update_hook')) {
wp_schedule_event(time(), 'daily', 'wps_daily_update_hook');
}
}
add_action('wp', 'wps_schedule_daily_update');
add_action('wps_daily_update_hook', 'wps_update_woocommerce_prices');3. Удаление задачи при деактивации
Чтобы избежать дублирования и утечек, при деактивации плагина или темы нужно отменить расписание.
function wps_clear_scheduled_update() {
$timestamp = wp_next_scheduled('wps_daily_update_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wps_daily_update_hook');
}
}
register_deactivation_hook(__FILE__, 'wps_clear_scheduled_update');Проверка результата после внедрения
- Запустите вручную задачу через плагин WP Crontrol — перейдите в «Cron Events», найдите
wps_daily_update_hookи нажмите «Run Now». - Проверьте цены товаров в админке WooCommerce — должны увеличиться на 10%.
- Подождите следующий запланированный запуск (например, сутки) и убедитесь, что обновление происходит автоматически.
Частые ошибки и как их исправить
- WP-Cron не срабатывает регулярно: Если на сайте низкий трафик, WP-Cron может не запускаться. Решение — настроить системный cron на сервере, чтобы вызывать wp-cron.php каждые 15 минут. Например, команда для crontab:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Функция обновления не изменяет цены: Проверьте, что функция
wc_get_product()возвращает объект, а также что цены передаются в правильном формате (число). Логируйте ошибки с помощьюerror_log(). - Дублирование задач WP-Cron: Убедитесь, что функция регистрации задач вызывается один раз, а не на каждом запросе без проверки
wp_next_scheduled().
Практические советы по безопасности и производительности
- Не запускайте обновления каталога слишком часто, чтобы не нагружать базу данных.
- Если у вас большой магазин, разбивайте обновление на партии по 50-100 товаров, чтобы избежать таймаутов.
- Добавьте проверку nonce и прав доступа, если запускаете обновление через AJAX или запросы.
- Для критичных изменений лучше делать резервную копию базы перед обновлением.
Сравнение вариантов автоматического обновления каталога WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron | Встроенный, не требует доступа к серверу, легко настраивается | Зависит от посещаемости сайта, может не запускаться вовремя | Код из статьи |
| Системный cron | Точный запуск по расписанию, надежность | Требует доступа к серверу, настройка сложнее | crontab + wget wp-cron.php |
| Плагины обновления | Удобный интерфейс, дополнительные функции | Могут замедлять сайт, зависят от стороннего кода | WP All Import, WP Crontrol |