Диагностика проблемы с неактивными вариантами товаров
В WooCommerce при работе с вариативными товарами иногда появляются варианты, которые больше не используются или устарели — например, цвета или размеры, которые не продаются. Они остаются в базе и отображаются в админке и на сайте, что может запутывать покупателей и усложнять управление каталогом.
Чтобы убедиться, что у вас есть неактивные варианты, зайдите в раздел Товары > Все товары, выберите вариативный товар и откройте его редактирование. Вкладка "Вариации" покажет все варианты. Неактивные варианты — те, у которых запас равен нулю или статус "отключено".
Как проверить наличие неактивных вариантов в базе
SELECT p.ID, pm.meta_key, pm.meta_value FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation' AND (pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock');Этот запрос выведет варианты с отсутствием на складе (outofstock).
Пошаговое решение: автоматическое удаление неактивных вариантов
Для автоматизации процесса удаления неактивных вариантов используем WP-CLI или создадим кастомный скрипт в functions.php темы или в отдельном плагине. Ниже вариант с хуком WP-Cron, который ежедневно проверяет и удаляет варианты с нулевым запасом и статусом "outofstock".
function wpbuy_remove_inactive_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
[
'key' => '_manage_stock',
'value' => 'yes',
'compare' => '=',
],
[
'key' => '_stock',
'value' => 0,
'compare' => '<=',
'type' => 'NUMERIC',
],
],
];
$inactive_variations = get_posts($args);
foreach ($inactive_variations as $variation) {
wp_delete_post($variation->ID, true); // true - без помещения в корзину
}
}
if (!wp_next_scheduled('wpbuy_daily_inactive_variations_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpbuy_daily_inactive_variations_cleanup');
}
add_action('wpbuy_daily_inactive_variations_cleanup', 'wpbuy_remove_inactive_variations');Этот код создаст ежедневное задание, которое удалит все варианты с нулевым остатком и статусом outofstock, если у варианта включен учёт остатков (_manage_stock = yes).
Альтернативный вариант: ручной запуск через WP-CLI
wp post delete $(wp post list --post_type=product_variation --meta_key=_stock_status --meta_value=outofstock --field=ID) --forceКоманда удалит все варианты без остатка без помещения в корзину.
Проверка результата после внедрения
- Перейдите в админку WooCommerce в раздел Товары > Все товары и откройте вариативный товар. Во вкладке вариации убедитесь, что неактивные варианты исчезли.
- Для проверки через базу данных повторите SQL-запрос из раздела диагностики — запрос должен вернуть пустой результат.
- Проверьте логи WP-Cron, если настроены — должно быть событие очистки без ошибок.
Частые ошибки и как исправить
- Не удаляются варианты с нулевым остатком: Проверьте, что у варианта включён учёт остатков (
_manage_stock). Если нет, то условие фильтра не сработает. - Удаление удаляет ошибки: Если варианты удаляются, но потом появляются снова, возможно, плагины или импортеры восстанавливают их. Проверьте автоматические импорты и синхронизации.
- Пропуск активных вариантов: Скрипт ориентируется на мета-данные. Если статус запасов не обновляется корректно, добавьте дополнительную проверку атрибутов.
- WP-Cron не срабатывает: Убедитесь, что на хостинге разрешён WP-Cron или настройте системный cron для wp-cron.php.
Практические советы по безопасности и производительности
- Перед внедрением автоматического удаления создайте резервную копию базы данных.
- Используйте Clearfy Pro для оптимизации базы и удаления дублей, это поможет улучшить производительность.
- Если база большая, ограничьте количество вариантов, обрабатываемых за один запуск, добавив параметр
posts_per_pageи пагинацию. - Мониторьте логи WP-Cron и ошибки сервера, чтобы вовремя отследить сбои в работе скрипта.
Сравнение подходов к удалению неактивных вариантов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Автоматический WP-Cron | Полная автоматизация, не требует ручного вмешательства | Зависит от работы WP-Cron, нагрузка на сайт при большом количестве вариаций |
| Ручной запуск WP-CLI | Мгновенное выполнение, подходит для больших баз | Требует доступа к серверу и знаний WP-CLI |
| Ручное удаление через админку | Простота, визуальный контроль | Трудоемко при большом количестве вариантов |