Диагностика проблемы с неиспользуемыми вариантами товаров в WooCommerce
В WooCommerce часто накапливаются варианты товаров (вариации), которые перестали использоваться: например, устаревшие цвета, размеры или комбинации. Они могут создавать путаницу, замедлять работу сайта и усложнять управление каталогом. Задача — выявить и удалить эти неактивные варианты автоматически без ручного поиска.
Как определить неиспользуемые варианты товаров
Неиспользуемыми считаются вариации, которые:
- Не связаны с активным родительским товаром (продуктом-конфигурацией).
- Отключены (статус "черновик" или "отключено").
- Не имеют запасов на складе и не продаются.
- Имеют дату окончания продаж в прошлом (если используется поле "Дата окончания").
Для диагностики можно использовать SQL-запросы и WP CLI или написать PHP-скрипт на базе WooCommerce API.
Пошаговое решение: автоматическое удаление неиспользуемых вариаций
1. Создаем WP-CLI команду для поиска и удаления вариантов
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc-clean-unused-variations', function() {
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'private', 'trash'],
'numberposts' => -1
];
$variations = get_posts($args);
$deleted_count = 0;
foreach ($variations as $variation) {
$parent_id = wp_get_post_parent_id($variation->ID);
if (!$parent_id || get_post_status($parent_id) !== 'publish') {
wp_delete_post($variation->ID, true);
$deleted_count++;
continue;
}
// Проверяем наличие запасов
$stock = get_post_meta($variation->ID, '_stock', true);
if ($stock === '0' || $stock === '') {
wp_delete_post($variation->ID, true);
$deleted_count++;
}
}
WP_CLI::success("Удалено вариантов: $deleted_count");
});
}
2. Как запустить команду
В терминале на сервере с WP CLI выполните:
wp wc-clean-unused-variations
Команда удалит все вариации, которые не относятся к опубликованным продуктам или имеют 0 запасов.
3. Автоматизация с помощью WP Cron
Чтобы регулярно очищать базу, добавьте в functions.php или в свой плагин следующий код:
if (!wp_next_scheduled('wc_clean_unused_variations_event')) {
wp_schedule_event(time(), 'daily', 'wc_clean_unused_variations_event');
}
add_action('wc_clean_unused_variations_event', function() {
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'private', 'trash'],
'numberposts' => -1
];
$variations = get_posts($args);
foreach ($variations as $variation) {
$parent_id = wp_get_post_parent_id($variation->ID);
if (!$parent_id || get_post_status($parent_id) !== 'publish') {
wp_delete_post($variation->ID, true);
continue;
}
$stock = get_post_meta($variation->ID, '_stock', true);
if ($stock === '0' || $stock === '') {
wp_delete_post($variation->ID, true);
}
}
});
Проверка результата после внедрения
- Через WP Admin перейдите в раздел «Товары» — «Вариации» и убедитесь, что неиспользуемые варианты исчезли.
- Запустите SQL-запрос для проверки количества вариаций:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';. Сравните число до и после удаления. - Проверьте логи сервера/хостинга на предмет ошибок при удалении.
- Используйте WP CLI команду
wp wc-clean-unused-variations --dry-runдля тестового запуска (добавьте функционал dry-run при необходимости).
Частые ошибки и как их исправить
- Удаление активных вариаций: Проверьте, что родительский товар опубликован. Иногда товары могут быть в статусе "черновик" или "отключено", и их вариации удалятся по ошибке.
- Потеря данных запасов: Убедитесь, что мета-ключ
_stockкорректно установлен для всех вариаций. Если используется сторонний складской плагин, возможно, нужно адаптировать проверку. - Проблемы с WP Cron: Если планировщик не срабатывает, настройте системный cron или вызов wp-cron.php через cron на сервере.
- Недостаточно прав: Команда WP CLI должна запускаться от пользователя с правами на удаление записей.
Практические советы по производительности и безопасности
- Перед массовым удалением создайте резервную копию базы данных.
- Используйте транзакции и ограничивайте количество удаляемых вариаций за один запуск, чтобы избежать таймаутов.
- Проверяйте совместимость с плагинами, которые управляют вариациями или запасами, чтобы не удалить нужные данные.
- Для сайтов с большим каталогом создайте пагинацию в выборке, например, обрабатывайте по 100 вариаций за раз.
Сравнение вариантов удаления неиспользуемых вариаций
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление через админку | Удаление вариаций по одной или списком вручную | Простое, не требует кода | Долго, риск пропуска вариаций |
| WP CLI команда (код выше) | Автоматизированное удаление через консоль | Быстро, можно запускать по расписанию | Требует доступа к серверу и базовые навыки CLI |
| Плагин очистки | Использование сторонних плагинов для очистки | Удобно, интерфейс | Может быть несовместим, нагрузка на сайт |