Как автоматически удалять неиспользуемые видео из медиабиблиотеки WordPress

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

С течением времени медиабиблиотека WordPress может разрастаться, включая множество видеофайлов, которые больше не используются в контенте сайта. Это приводит к:

  • Перегрузке хранилища на сервере;
  • Ухудшению производительности бэкапа и восстановления;
  • Повышенным затратам на хостинг и бэкап;
  • Потере контроля над актуальностью контента.

Поэтому важно иметь метод для автоматического выявления и удаления неиспользуемых видеофайлов.

Как определить, какие видео не используются?

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

Для диагностики можно использовать SQL-запрос, который проверит связи вложений с контентом:

SELECT ID, post_title FROM wp_posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'video/%' AND ID NOT IN (SELECT meta_value FROM wp_postmeta WHERE meta_key = '_thumbnail_id') AND ID NOT IN (SELECT ID FROM wp_posts WHERE post_content LIKE CONCAT('%', guid, '%'));

Однако такой запрос не всегда точен из-за динамического добавления видео через сторонние плагины и шорткоды.

Пошаговое решение: автоматическое удаление неиспользуемых видео через WP-CLI

1. Установка WP-CLI

Если WP-CLI не установлен на вашем сервере, установите его согласно официальной инструкции https://wp-cli.org/.

2. Поиск медиафайлов-видео без использования

Создайте пользовательский PHP-скрипт для поиска неиспользуемых видео:

<?php
function get_unused_videos() {
    global $wpdb;
    $query = "SELECT p.ID, p.guid FROM {$wpdb->posts} p
              WHERE p.post_type = 'attachment'
              AND p.post_mime_type LIKE 'video/%'
              AND p.ID NOT IN (
                  SELECT DISTINCT pm.post_id FROM {$wpdb->postmeta} pm
                  WHERE pm.meta_value LIKE CONCAT('%', p.guid, '%')
              )
              AND p.ID NOT IN (
                  SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE CONCAT('%', p.guid, '%')
              )";
    return $wpdb->get_results( $query );
}

Заметьте, что поиск основан на совпадении URL видео в контенте и метаданных. Для более точного результата потребуется адаптация под конкретные плагины и кастомные поля.

3. Удаление неиспользуемых видео

Используйте WP-CLI для удаления найденных вложений, например:

wp media delete ID_вложения --yes

Где ID_вложения — идентификатор видеофайла из результата функции.

4. Автоматизация процесса (опционально)

Для регулярного удаления можно создать WP-Cron задачу:

add_action('wp_scheduled_delete_unused_videos', 'delete_unused_videos_function');

function delete_unused_videos_function() {
    $videos = get_unused_videos();
    foreach($videos as $video) {
        wp_delete_attachment($video->ID, true);
    }
}

if (!wp_next_scheduled('wp_scheduled_delete_unused_videos')) {
    wp_schedule_event(time(), 'daily', 'wp_scheduled_delete_unused_videos');
}

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

  • Перед и после запуска скрипта сравните количество видео в медиабиблиотеке через консоль WP-CLI командой wp media list --mime_type=video/*.
  • Проверьте, что видео действительно отсутствуют в контенте: пройдитесь по случайным постам и товарам.
  • Убедитесь, что сайт корректно отображает оставшиеся видео, без битых ссылок.

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

  • Ошибка: Удаляются нужные видео, используемые через кастомные шорткоды или плагины.
    Решение: Расширьте функцию поиска, чтобы учитывать кастомные мета-поля и проверять содержимое шорткодов.
  • Ошибка: WP-Cron не срабатывает автоматически.
    Решение: Проверьте, что WP-Cron активен или настройте системный cron на вызов wp-cron.php.
  • Ошибка: Скрипт слишком долго выполняется при большом объеме медиа.
    Решение: Делите удаление на партии, используйте транзакции и обрабатывайте по частям.

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

  • Всегда делайте резервную копию базы данных и файлов перед массовым удалением.
  • Тестируйте скрипты на копии сайта, чтобы избежать потери важных данных.
  • Ограничьте права пользователя, запускающего WP-CLI, чтобы предотвратить случайные удаления.
  • Для ускорения поиска используйте индексы по полям post_mime_type и post_content.
  • Можно интегрировать Clearfy Pro от WPShop для дополнительной очистки и оптимизации сайта: https://wpshop.ru/plugins/clearfy

Сравнение подходов: плагин vs код vs WP-CLI

МетодПлюсыМинусы
Плагины (например Media Cleaner)Простота использования, визуальный интерфейсНагрузка на сайт, не всегда точные результаты, могут конфликтовать
Код в functions.php или отдельном плагинеГибкость, можно адаптировать под сайтТребует разработки и тестирования, риск ошибок
WP-CLIБыстрота, подходит для больших сайтов, автоматизацияТребует доступа к серверу и навыков командной строки
Как автоматизировать добавление подписей к видео в WordPress
16.04.2026
Как исправить ошибку «Не загружается видео» в WooCommerce на WordPress
23.04.2026
Как удалить водяной знак с видео в WordPress без потери производительности
09.04.2026
Успешная интеграция видео в WooCommerce и исправление ошибок загрузки
26.05.2026
Как добавить видео в описание товара WooCommerce без плагинов
28.07.2026