Диагностика проблемы с неактивными вариантами
В WooCommerce часто возникает ситуация, когда вариации товаров с нулевым остатком или давно не продававшиеся остаются активными и доступны для выбора покупателям. Это ведет к плохому UX: покупатели выбирают вариант, который нельзя купить, что вызывает лишние обращения в поддержку и снижает конверсию.
Проверьте, есть ли такие варианты на вашем сайте:
- Откройте страницу товара с вариациями.
- Выполните несколько заказов с разными вариантами.
- Проверьте наличие вариантов с нулевым запасом или без продаж за последние 3 месяца.
Если такие варианты доступны к покупке, проблема актуальна.
Шаги решения: автоматическое отключение неактивных вариантов
1. Определение критериев неактивности варианта
Для отключения варианта будем использовать два условия:
- Остаток товара равен 0
- Нет продаж варианта за последние 90 дней
Для учета продаж используем мета-данные заказов WooCommerce.
2. Реализация функции отключения
Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин для пользовательских функций.
function disable_inactive_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$variations = get_posts($args);
$today = current_time('timestamp');
$days_limit = 90;
$disabled_count = 0;
foreach ($variations as $variation) {
$variation_id = $variation->ID;
$product = wc_get_product($variation_id);
if (!$product->managing_stock() || !$product->is_in_stock()) {
continue; // Вариант не управляет запасами или уже вне склада
}
$stock_quantity = $product->get_stock_quantity();
if ($stock_quantity > 0) {
continue; // Есть запас, не отключаем
}
// Проверяем продажи варианта за последние 90 дней
$args_orders = [
'limit' => -1,
'status' => ['completed', 'processing'],
'date_after' => date('Y-m-d', strtotime("-{$days_limit} days")),
'meta_key' => '_product_id',
'meta_value' => $variation_id,
'meta_compare' => '=',
];
$orders = wc_get_orders($args_orders);
$sales_count = 0;
foreach ($orders as $order) {
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $variation_id) {
$sales_count += $item->get_quantity();
}
}
}
if ($sales_count == 0) {
// Отключаем вариант
$variation->post_status = 'draft';
wp_update_post($variation);
$disabled_count++;
}
}
return $disabled_count;
}
// Запуск функции по крону или вручную
// Для ручного запуска вызовите: disable_inactive_variations();3. Автоматизация через WP-Cron
Чтобы функция запускалась автоматически, добавьте планировщик событий:
function schedule_disable_variations_event() {
if (!wp_next_scheduled('disable_inactive_variations_event')) {
wp_schedule_event(time(), 'daily', 'disable_inactive_variations_event');
}
}
add_action('wp', 'schedule_disable_variations_event');
add_action('disable_inactive_variations_event', function() {
disable_inactive_variations();
});Проверка результата после внедрения
- Запустите функцию вручную из админки или через
wp cli, если доступен:wp eval 'disable_inactive_variations();' - Проверьте статус вариаций в админке WooCommerce — они должны стать черновиками (
draft). - На фронтенде вариации с отключённым статусом не отображаются и не доступны для выбора.
- Отслеживайте работу планировщика в логах сервера или плагинах для cron.
Частые ошибки и как их исправить
- Функция не отключает вариации: Проверьте, что у вариаций включено управление запасами (
manage_stock), иначе условие$product->managing_stock()вернёт false. - Нет доступа к заказам через
wc_get_orders(): Убедитесь, что WooCommerce версии 3.0+ и функция вызывается в правильном контексте (например, не в ранних хуках). - Крон задачи не запускаются: Проверьте, активен ли WP-Cron и нет ли блокировок на стороне хостинга.
- Вариации не скрываются на сайте: Возможно, тема или плагин кэшируют данные, очистите кэш и проверьте снова.
Практические советы по безопасности и производительности
- Не запускайте функцию отключения вариаций на каждом запросе, используйте WP-Cron с дневным запуском.
- Для больших магазинов с тысячами вариаций делайте пакетную обработку, чтобы не превышать лимиты памяти и времени выполнения.
- Всегда делайте резервную копию базы данных перед массовыми изменениями статусов товаров.
- Для улучшения SEO используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpsetup.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-otklyuchenie-neaktivnyh-variantov-tovarov) для удаления дублирующего контента и оптимизации индексации доступных вариантов.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное отключение | Простота | Трудозатратно, ошибки | Малый ассортимент товаров |
| Автоматизация через код | Автоматически, гибко, бесплатно | Нужны навыки, требует тестирования | Средние и крупные магазины |
| Плагин для автоматизации | Удобство, поддержка | Стоимость, нагрузка | Большие магазины, без навыков программирования |