Диагностика проблемы: когда и зачем удалять старые вариации
В WooCommerce с течением времени накапливаются вариации товаров, которые уже не используются или устарели. Это приводит к раздуванию базы данных, замедлению загрузки страниц с товарами и усложнению управления каталогом. Стандартных инструментов для массового удаления вариаций нет, а ручное удаление через админку неудобно и долго.
Если вы замечаете, что в базе много вариаций, которые не отображаются в каталоге, либо хотите автоматизировать регулярное удаление старых вариаций (например, по дате создания или по определённым мета-данным), нужно использовать кастомный PHP-код.
Пошаговое решение: удаляем вариации через WP-CLI и код в functions.php
1. Определяем критерии удаления
Например, удалим все вариации товара, созданные более 180 дней назад:
$days_threshold = 180; // дней
$timestamp_threshold = strtotime("-{$days_threshold} days");2. Запрос вариаций для удаления
Используем WP_Query для выборки вариаций с нужным условием:
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'date_query' => [
[
'before' => date('Y-m-d H:i:s', $timestamp_threshold),
'inclusive' => true,
],
],
'fields' => 'ids',
'post_status' => 'publish',
];
$query = new WP_Query($args);
$variation_ids = $query->posts;3. Удаление вариаций через wp_delete_post
Удаляем вариации с принудительным удалением из базы:
foreach ($variation_ids as $variation_id) {
wp_delete_post($variation_id, true);
}4. Интеграция кода в functions.php или отдельный плагин
Оборачиваем логику в функцию и вызываем по хуку, например, при админской загрузке или через WP-CLI команду.
function delete_old_product_variations() {
$days_threshold = 180;
$timestamp_threshold = strtotime("-{$days_threshold} days");
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'date_query' => [
[
'before' => date('Y-m-d H:i:s', $timestamp_threshold),
'inclusive' => true,
],
],
'fields' => 'ids',
'post_status' => 'publish',
];
$query = new WP_Query($args);
if (empty($query->posts)) {
return;
}
foreach ($query->posts as $variation_id) {
wp_delete_post($variation_id, true);
}
}
add_action('admin_init', 'delete_old_product_variations');Проверка результата после внедрения
- Перейдите в раздел «Товары» — «Вариации» в админке WooCommerce и убедитесь, что старые вариации исчезли.
- Проверьте размер таблицы
wp_postsс типомproduct_variationв базе данных — количество должно уменьшиться. - Выполните в базе запрос на подсчёт вариаций, созданных более 180 дней назад:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY);Результат должен быть 0.
Частые ошибки и как их исправить
- Ошибка: Вариации не удаляются, хотя код выполняется.
Причина: Вариации имеют статус, отличный отpublish. Решение — добавить'post_status' => ['publish', 'private', 'draft']в аргументы WP_Query. - Ошибка: Удаление происходит не полностью, остаются мета-данные.
Причина: Используетсяwp_delete_postс вторым параметромfalse(корзина). Решение — обязательно поставитьtrueдля полного удаления. - Ошибка: Ресурсоёмкая операция приводит к таймауту.
Решение: Делайте удаление частями, например, по 50 вариаций за раз с помощью пагинации WP_Query и повторного вызова функции.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед массовым удалением.
- Запускайте удаление вручную либо через WP-CLI, чтобы избежать нагрузки на сайт при посещениях пользователей.
- Для регулярного удаления используйте WP-Cron с ограничением количества удаляемых вариаций за запуск.
- Добавляйте проверку прав пользователя при вызове функции (например,
current_user_can('manage_woocommerce')), чтобы предотвратить случайный запуск неавторизованным.
Сравнение способов удаления вариаций WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Долго, неудобно при большом количестве | Использовать только для единичных случаев |
| Использование плагинов | Интерфейс, дополнительные функции | Могут грузить сайт, не всегда гибко | Хорошо для непрофессионалов, но проверять нагрузку |
| Код на PHP + WP-CLI | Полный контроль, быстрая обработка | Требует навыков, риск ошибки | Рекомендуется для опытных разработчиков с бэкапами |