Диагностика проблемы: зачем удалять неактивные вариации
В магазинах WooCommerce с большим ассортиментом товаров часто накапливаются вариации, которые не продаются, устарели или были отключены. Такие вариации занимают место в базе данных, замедляют запросы и могут запутать администраторов и покупателей. Обычно WooCommerce не удаляет неактивные вариации автоматически, поэтому нужна кастомизация.
Как определить неактивные вариации товаров
Вариация считается неактивной, если у неё статус private или draft, либо если она отключена (поле menu_order или мета _stock_status может помочь выявить отсутствие наличия). Также можно учитывать дату последнего изменения или наличие продаж.
Пример запроса для поиска неактивных вариаций
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'private'],
'posts_per_page' => -1
];
$query = new WP_Query($args);
$variations = $query->posts;
Этот код найдёт все вариации с черновым или приватным статусом.
Пошаговое решение: автоматическое удаление неактивных вариаций
Ниже пример функции, которую можно добавить в functions.php или в кастомный плагин. Она удаляет вариации с указанными статусами и без последних продаж.
function wpgenerate_delete_inactive_variations() {
$args = [
'post_type' => 'product_variation',
'post_status' => ['draft', 'private'],
'posts_per_page' => -1
];
$query = new WP_Query($args);
foreach ($query->posts as $variation) {
// Проверим наличие продаж для вариации
$orders = wc_get_orders([
'limit' => 1,
'status' => ['completed', 'processing'],
'meta_key' => '_product_id',
'meta_value' => $variation->ID
]);
if (empty($orders)) {
wp_delete_post($variation->ID, true); // жёсткое удаление
}
}
}
// Запуск по крону или вручную
add_action('init', function() {
if (isset($_GET['delete_inactive_variations'])) {
wpgenerate_delete_inactive_variations();
echo 'Удаление завершено';
exit;
}
});Чтобы запустить удаление, достаточно добавить параметр ?delete_inactive_variations=1 к URL сайта (например, https://example.com/?delete_inactive_variations=1). Рекомендуется запускать это на тестовом сайте или использовать WP-Cron для периодической очистки.
Настройка регулярного запуска через WP-Cron
if (!wp_next_scheduled('wpgenerate_cron_delete_variations')) {
wp_schedule_event(time(), 'daily', 'wpgenerate_cron_delete_variations');
}
add_action('wpgenerate_cron_delete_variations', 'wpgenerate_delete_inactive_variations');Проверка результата после внедрения
- В админке WooCommerce откройте список вариаций товара и проверьте, что неактивные вариации удалены.
- Проверьте базу данных, используя phpMyAdmin или аналог, запросом
SELECT * FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('draft', 'private'). Результат должен быть пустым или содержать только актуальные вариации. - При запуске с параметром
?delete_inactive_variations=1в браузере вы должны увидеть сообщение «Удаление завершено».
Частые ошибки и как их исправить
- Неправильный статус вариации: Некоторые вариации могут иметь статус
publish, но быть фактически неактивными. Нужно расширить критерии поиска, например, добавить проверку наличия или мета-данных. - Удаление активных вариаций: Внимательно проверяйте фильтры, чтобы не удалить активные товары. Используйте логи и резервное копирование перед запуском.
- Отсутствие прав для удаления: Если код не удаляет, проверьте права пользователя и настройки безопасности хостинга.
- Пропуск вариаций с заказами: Убедитесь, что проверка заказов по ID вариации реализована корректно. В WooCommerce мета ключи для вариаций в заказах могут отличаться.
Практические советы по безопасности и производительности
- Всегда делайте резервное копирование перед массовым удалением данных.
- Ограничьте запуск функции только администраторам или по защищённому триггеру.
- При большом количестве вариаций используйте пакетную обработку — удаляйте по 50-100 штук за один запуск, чтобы избежать таймаутов.
- Логируйте удалённые вариации для аудита. Например, записывайте ID и дату удаления в отдельный файл или таблицу.
- Для ускорения запросов создайте индексы в базе на поле
post_statusи пост-тип.
Сравнение вариантов удаления неактивных вариаций
| Вариант | Плюсы | Минусы | Использование |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Медленно, риск пропуска вариаций | Маленькие магазины |
| Код с WP_Query и wp_delete_post | Автоматизация, гибкость | Требует навыков, возможны ошибки | Средние и большие магазины |
| Плагины очистки WooCommerce | Готовые решения, интерфейс | Могут быть платными, ограничены функционалом | Быстрая настройка без кода |