Проблема: накопление неактивных вариаций товаров в WooCommerce
В интернет-магазинах на WooCommerce со временем может накапливаться множество неиспользуемых или неактивных вариаций товаров. Они замедляют работу сайта, увеличивают размер базы данных и затрудняют управление каталогом. Часто такие вариации остаются после обновления ассортимента, изменения характеристик или тестирования.
Как диагностировать наличие неактивных вариаций
- Перейдите в «Товары» > «Все товары» в админке WooCommerce.
- Откройте товар с вариациями и проверьте, есть ли вариации с атрибутом
Статус: ЧерновикилиОтключено. - Можно выполнить SQL-запрос для поиска вариаций без продаж и с неактивным статусом:
SELECT p.ID, p.post_title, p.post_status FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND p.post_status != 'publish'
AND pm.meta_key = '_stock_status'
AND pm.meta_value = 'outofstock'
LIMIT 20;Этот запрос покажет вариации, которые не опубликованы и находятся в статусе "нет на складе".
Пошаговое решение: автоматическое удаление неактивных вариаций
Реализуем функцию, которая регулярно удаляет вариации с определёнными признаками неактивности: статус не опубликован, отсутствие заказов и отсутствие запасов.
1. Добавляем функцию удаления в файл темы functions.php или в свой плагин
function wc_delete_inactive_variations() {
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'pending', 'private'],
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
],
],
];
$variations = get_posts($args);
foreach ($variations as $variation) {
// Проверяем, были ли заказы с этой вариацией
$order_count = wc_get_orders([
'limit' => 1,
'status' => 'completed',
'return' => 'ids',
'meta_query' => [
[
'key' => '_product_id',
'value' => $variation->ID,
'compare' => '=',
]
]
]);
if (empty($order_count)) {
wp_delete_post($variation->ID, true); // Удаляем навсегда
}
}
}2. Регулярное выполнение удаления с помощью WP-Cron
Добавим событие wp_cron, чтобы запускать очистку раз в неделю.
function wc_schedule_variation_cleanup() {
if (!wp_next_scheduled('wc_variation_cleanup_event')) {
wp_schedule_event(time(), 'weekly', 'wc_variation_cleanup_event');
}
}
add_action('wp', 'wc_schedule_variation_cleanup');
add_action('wc_variation_cleanup_event', 'wc_delete_inactive_variations');Проверка результата после внедрения
- Перейдите в раздел «Все товары» и откройте товар с вариациями — неактивные вариации должны исчезнуть.
- Для ускоренной проверки можете вызвать функцию
wc_delete_inactive_variations()вручную из консоли WP-CLI или временно черезadd_action('init', 'wc_delete_inactive_variations');в functions.php. - Проверьте таблицу
wp_postsв базе данных, чтобы убедиться, что записи с типомproduct_variationи статусомdraft,pendingудалены.
Частые ошибки и как их исправить
- Удаляются активные вариации — убедитесь, что в запросе фильтруются только вариации с нужным статусом и отсутствием заказов.
- Функция не запускается по расписанию — проверьте, что WP-Cron работает корректно (например, посетите сайт, чтобы инициировать запуск cron).
- Проблемы с производительностью при большом количестве вариаций — используйте пагинацию в запросах, чтобы обрабатывать порциями.
- Отсутствие прав на удаление — убедитесь, что скрипт запускается с правами администратора.
Практические советы по оптимизации и безопасности
- Перед удалением сделайте резервную копию базы данных.
- Добавьте логирование удалённых вариаций в файл для контроля и отката.
- Используйте транзакции базы данных при массовом удалении, если позволяет среда.
- Проверяйте на тестовом сайте перед запуском на рабочем.
- Для больших магазинов используйте WP-CLI скрипт для запуска удаления с параметрами пагинации.
Сравнение способов удаления неактивных вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админ-панель | Простота, нет кода | Долго, не подходит для большого количества вариаций |
| Плагин для очистки WooCommerce | Автоматизация, настройки | Может замедлять сайт, лишние зависимости |
| Код с WP-Cron (описанный метод) | Лёгкий, контролируемый, без плагинов | Требует навыков, возможны ошибки при некорректном коде |