WooCommerce: как автоматически удалять старые вариации товаров и связанные медиа

Диагностика проблемы: почему нужно удалять старые вариации WooCommerce

В интернет-магазинах на WooCommerce часто появляются устаревшие вариации товаров, которые больше не используются или заменены новыми. Эти вариации занимают место в базе данных и на диске, особенно если к ним прикреплены изображения. Со временем это замедляет работу сайта и увеличивает затраты на хранение.

Признаки проблемы:

  • Увеличение размера базы данных без видимых новых товаров.
  • Наличие вариаций с пометкой «черновик», «удален» или неактивных в админке.
  • Медиафайлы, связанные с неиспользуемыми вариациями, загромождают библиотеку.

Как проверить наличие старых вариаций и связанных медиа

Для проверки используйте SQL-запросы через phpMyAdmin или wp-cli:

-- Найти вариации товаров, которые неактивны или старше 180 дней (пример)<br>SELECT p.ID, p.post_date, p.post_status<br>FROM wp_posts p<br>WHERE p.post_type = 'product_variation'<br>AND (p.post_status = 'draft' OR p.post_status = 'trash' OR p.post_date < NOW() - INTERVAL 180 DAY);

Для связанных медиафайлов можно проверить таблицу wp_postmeta с мета-ключом _thumbnail_id или другие связи:

SELECT pm.post_id, pm.meta_value AS attachment_id<br>FROM wp_postmeta pm<br>JOIN wp_posts p ON p.ID = pm.post_id<br>WHERE pm.meta_key = '_thumbnail_id'<br>AND p.post_type = 'product_variation'

Пошаговое решение: автоматическое удаление вариаций и связанных медиа

1. Создаем функцию для удаления вариаций и их медиа

Этот код удалит вариации старше 180 дней вместе с прикрепленными картинками.

function delete_old_product_variations_with_media() {<br>    $args = array(<br>        'post_type'      => 'product_variation',<br>        'post_status'    => array('publish', 'draft', 'private'),<br>        'date_query'     => array(<br>            array(<br>                'column' => 'post_date',<br>                'before' => '180 days ago',<br>            ),<br>        ),<br>        'posts_per_page' => -1,<br>        'fields'         => 'ids',<br>    );<br>    $variations = get_posts($args);<br>    if (empty($variations)) {<br>        return;<br>    }<br>    foreach ($variations as $variation_id) {<br>        // Получаем ID миниатюры вариации<br>        $thumbnail_id = get_post_meta($variation_id, '_thumbnail_id', true);<br>        // Удаляем миниатюру, если есть<br>        if ($thumbnail_id) {<br>            wp_delete_attachment($thumbnail_id, true);<br>        }<br>        // Удаляем все прикрепленные медиа к вариации<br>        $attachments = get_children(array(<br>            'post_parent'    => $variation_id,<br>            'post_type'      => 'attachment',<br>            'posts_per_page' => -1,<br>            'fields'         => 'ids',<br>        ));<br>        foreach ($attachments as $attachment_id) {<br>            wp_delete_attachment($attachment_id, true);<br>        }<br>        // Удаляем вариацию<br>        wp_delete_post($variation_id, true);<br>    }<br>}

2. Запускаем функцию по расписанию с помощью WP-Cron

Добавьте в functions.php или в свой плагин код для регистрации и запуска задачи:

if (!wp_next_scheduled('delete_old_variations_daily_event')) {<br>    wp_schedule_event(time(), 'daily', 'delete_old_variations_daily_event');<br>}<br>add_action('delete_old_variations_daily_event', 'delete_old_product_variations_with_media');

3. Ручной запуск для проверки

Для теста запустите функцию вручную из консоли WP-CLI или временно вызовите ее в админке:

delete_old_product_variations_with_media();

Проверка результата после внедрения

  • В админке WooCommerce проверьте, что в списке вариаций не осталось старых и неактивных.
  • Проверьте размер папки uploads и базу данных на уменьшение.
  • Убедитесь, что связанные изображения вариаций удалены из медиабиблиотеки.
  • Если используете WP-CLI, выполните запросы из раздела диагностики повторно — они не должны возвращать старые вариации.

Частые ошибки и как их исправить

  • Вариации не удаляются: Проверьте права пользователя, под которым запускается скрипт, и нет ли ограничений на удаление постов или вложений.
  • Остались медиафайлы: Иногда вложения могут быть не связаны напрямую с вариацией. Дополнительно проверьте все прикрепленные файлы, используя get_children().
  • Проблемы с WP-Cron: Если cron-задача не запускается, установите реальный системный cron или вызовите wp cron event run --due-now вручную.

Практические советы по безопасности и производительности

  • Перед удалением сделайте резервную копию базы и файлов.
  • Для больших магазинов запускайте удаление частями, ограничивая количество вариаций за один проход (например, 'posts_per_page' => 50 и пагинация).
  • Используйте wp_delete_attachment($id, true) с параметром true, чтобы удалять файлы с диска, а не только записи в базе.
  • Добавьте логирование удалений в файл или базу для аудита.
  • Для максимальной безопасности используйте capability проверки, если функция вызывается из интерфейса администратора.

Сравнение способов удаления старых вариаций

МетодПреимуществаНедостатки
Плагин очистки WooCommerceПростота использования, графический интерфейсМожет не удалять все связанные медиа, дополнительные плагины
Своя функция с WP-Cron (как в статье)Гибкость, полное удаление, автоматизацияТребует навыков разработки, контроль cron
Ручное удаление через админкуПростота, не требует кодаТрудоемко, риск забыть удалить медиа
Как удалить неиспользуемые метаданные в WordPress
05.04.2026
WooCommerce: автоматическое удаление заказов по статусу и срокам с использованием WP-Cron
21.05.2026
Как создать простую систему рейтинга в WordPress
04.12.2025
Как удалить все комментарии от определённого автора в WordPress
23.11.2025
Как удалить неиспользуемые теги в WordPress
11.02.2026

Сайт в разработке, скоро здесь будет портал о WordPress.