Диагностика проблемы с обновлением остатков и вариантов товаров
В крупных магазинах на WooCommerce обновление остатков и управление вариантами товаров вручную занимает много времени и чревато ошибками. Часто бывает, что запасы не соответствуют реальности, а устаревшие варианты остаются активными, что приводит к потере продаж и негативному пользовательскому опыту.
Чтобы понять, нужна ли автоматизация, проверьте следующие признаки:
- Наличие множества товаров с вариациями, которые регулярно меняются;
- Отсутствие актуальности остатков на складе в админке и на фронтенде;
- Наличие неактивных или устаревших вариантов, доступных для покупки;
- Ручное обновление товаров занимает более часа в день.
Пошаговое решение: скрипт для автоматического обновления остатков и деактивации вариантов
1. Создание WP-Cron задачи для регулярного обновления
Добавим функцию, которая будет запускаться ежедневно и проверять остатки, а также отключать варианты с нулевым запасом.
add_action('wp', 'setup_daily_stock_update_cron');
function setup_daily_stock_update_cron() {
if (!wp_next_scheduled('daily_stock_update_event')) {
wp_schedule_event(time(), 'daily', 'daily_stock_update_event');
}
}
add_action('daily_stock_update_event', 'update_stock_and_variations');
function update_stock_and_variations() {
// Получаем все вариативные товары
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'tax_query' => [
[
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
],
],
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return;
}
while ($query->have_posts()) {
$query->the_post();
$parent_id = get_the_ID();
$product = wc_get_product($parent_id);
// Получаем варианты
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
$stock_quantity = $variation->get_stock_quantity();
if ($stock_quantity === 0) {
// Отключаем вариант
$variation->set_status('private');
$variation->save();
} else {
// Включаем вариант, если есть в наличии
if ($variation->get_status() !== 'publish') {
$variation->set_status('publish');
$variation->save();
}
}
}
}
wp_reset_postdata();
}
2. Очистка WP-Cron при деактивации плагина или темы
register_deactivation_hook(__FILE__, function() {
$timestamp = wp_next_scheduled('daily_stock_update_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'daily_stock_update_event');
}
});
Как проверить работоспособность скрипта
- В админке WooCommerce перейдите в «Товары» и проверьте статус вариантов товаров с нулевым остатком — они должны быть со статусом «личный» (private) и не отображаться на сайте.
- Установите плагин WP Crontrol (https://ru.wordpress.org/plugins/wp-crontrol/) и убедитесь, что задача
daily_stock_update_eventзапланирована и выполняется. - Включите логирование ошибок PHP и добавьте в функцию
update_stock_and_variationsвывод в лог, чтобы отследить запуск:
error_log('Update stock and variations run: ' . date('Y-m-d H:i:s'));
Частые ошибки и способы их устранения
- Задача WP-Cron не запускается автоматически. Причина — низкий трафик на сайте или отключенный WP-Cron. Решение — настроить системный cron на сервере, который вызывает
wp-cron.phpпо расписанию. - Варианты не меняют статус. Проверьте, что у вас есть права на изменение постов и что WooCommerce обновлен. Убедитесь, что статус задается правильной строкой ('publish' или 'private').
- Скрипт тормозит сайт при запуске. При большом количестве товаров используйте пакетную обработку (batch processing) или разбейте обновление на несколько вызовов с помощью Transients API.
Практические советы по безопасности и производительности
- Для ускорения работы функции используйте
WP_Queryс параметром'fields' => 'ids'чтобы получать только ID товаров. - Ограничьте периодичность запуска задачи до одного раза в сутки, чтобы не нагружать сервер.
- Используйте capability проверки, если функция вызывается вручную из админки.
- Регулярно делайте бэкапы базы данных перед внедрением автоматизации.
Таблица сравнения методов автоматического обновления остатков
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + кастомный PHP | Гибко, бесплатно, без сторонних плагинов | Нагрузка при большом каталоге, требует навыков разработки | Код из статьи |
| Плагины автоматизации (например, WP All Import, Stock Sync) | Простота настройки, готовые решения | Платные, могут быть избыточными | WP All Import Pro с аддоном Stock Sync |
| Вебхуки и внешние сервисы | Интеграция с ERP, автоматизация на стороне сервера | Сложность настройки, требует внешних ресурсов | Webhook от склада в ERP |