Как автоматизировать удаление неиспользуемых вариативных изображений WooCommerce

В чем проблема с вариативными изображениями в WooCommerce?

При работе с вариативными товарами WooCommerce создаёт для каждой вариации отдельные изображения. Часто после редактирования или удаления вариаций остаются медиафайлы, которые не используются ни в одном товаре. Они занимают место на сервере и могут замедлять работу сайта при резервном копировании и оптимизации.

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

Для начала нужно понять, какие изображения относятся к вариациям, и есть ли они в текущих товарах. Вот простой алгоритм проверки:

  • Получить ID всех вариативных товаров.
  • Для каждого вариационного товара получить ID вариаций (child products).
  • Собрать ID изображений, привязанных к вариациям через метаполя (_thumbnail_id).
  • Сравнить с базой медиафайлов — выявить изображения, которые не связаны ни с одной вариацией.

Пример запроса для получения ID вариаций и связанных с ними изображений:

$args = [
    'post_type' => 'product_variation',
    'posts_per_page' => -1,
    'fields' => 'ids',
];
$variation_ids = get_posts($args);

$used_image_ids = [];
foreach ($variation_ids as $variation_id) {
    $thumb_id = get_post_meta($variation_id, '_thumbnail_id', true);
    if ($thumb_id) {
        $used_image_ids[] = (int) $thumb_id;
    }
}
$used_image_ids = array_unique($used_image_ids);

Далее можно получить все ID вложений из библиотеки и исключить те, что используются:

$all_attachments = get_posts([
    'post_type' => 'attachment',
    'posts_per_page' => -1,
    'fields' => 'ids',
]);

$unused_images = array_diff($all_attachments, $used_image_ids);

Пошаговое решение: автоматизация удаления неиспользуемых изображений

1. Создайте резервную копию сайта и базы данных перед началом.

2. Добавьте следующий код в отдельный плагин или файл functions.php вашей темы для безопасного запуска:

function wpguest_delete_unused_variation_images() {
    $variation_ids = get_posts([
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ]);

    $used_image_ids = [];
    foreach ($variation_ids as $variation_id) {
        $thumb_id = get_post_meta($variation_id, '_thumbnail_id', true);
        if ($thumb_id) {
            $used_image_ids[] = (int) $thumb_id;
        }
    }
    $used_image_ids = array_unique($used_image_ids);

    $all_attachments = get_posts([
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ]);

    $unused_images = array_diff($all_attachments, $used_image_ids);

    foreach ($unused_images as $image_id) {
        // Удаляем изображение с принудительным удалением из файловой системы
        wp_delete_attachment($image_id, true);
    }

    return count($unused_images);
}

// Запуск функции вручную через WP-CLI или временно через админку
// Пример для временного вызова:
// add_action('admin_init', function() {
//     $deleted_count = wpguest_delete_unused_variation_images();
//     echo "Удалено неиспользуемых изображений: $deleted_count";
//     exit;
// });

3. Запустите функцию один раз вручную (через WP-CLI или временно добавив вызов в админку, как показано в комментариях).

4. После удаления снимите временный вызов, чтобы код не выполнялся при каждом заходе в админку.

Проверка результата

  • Перейдите в Медиафайлы и убедитесь, что количество изображений уменьшилось.
  • Проверьте товары с вариациями — все вариационные изображения должны отображаться корректно.
  • Запустите wp guest_delete_unused_variation_images() повторно — функция должна возвращать 0 удалённых файлов, если всё правильно.

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

  • Удалены нужные изображения вариаций: Проверьте, что метаполе _thumbnail_id актуально. Если изображения назначены через другие метаданные или плагины, их нужно добавить в список используемых вручную.
  • Функция не удаляет изображения: Убедитесь, что у WordPress есть права на удаление файлов и что функция wp_delete_attachment вызывается с параметром true для принудительного удаления.
  • Большое время выполнения: При большом количестве изображений разбейте удаление на части с помощью WP-Cron или WP-CLI, чтобы избежать таймаутов.

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

  • Всегда делайте резервные копии перед массовым удалением файлов.
  • Запускайте удаление в периоды низкой нагрузки.
  • Для сайтов с большим каталогом используйте WP-CLI команду или создайте задачу WP-Cron с лимитом на количество удаляемых файлов за один запуск.
  • Для контроля изменений можно вести лог удалённых ID изображений.

Сравнение вариантов удаления неиспользуемых изображений

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПросто, не требует кодаДолго, не выявляет вариативные неиспользуемыеПодходит для малого каталога
Кодовая автоматизация (описанный скрипт)Точный контроль, автоматизацияТребует базовых знаний PHP, риски при неправильном использованииЛучший вариант для разработчиков
Плагины очистки медиаУдобство, поддержкаМогут пропускать вариационные изображенияИспользовать с осторожностью, проверить покрытие
Как отключить авторизацию по телефону в WordPress
28.12.2025
Как установить ограничение на размер файлов при загрузке в WordPress
10.01.2026
Автоматическое удаление старых товаров и заказов WooCommerce по дате
09.06.2026
Как удалить или изменить meta robots в WordPress для разных типов страниц
18.12.2025
Как избежать ошибки 429 в WooCommerce при автообновлении корзины
19.04.2026