Удаление старых медиа файлов в WordPress с помощью PHP

В процессе эксплуатации сайта на WordPress медиа библиотека со временем разрастается, часто остаются неиспользуемые или устаревшие файлы — изображения, видео, документы. Они занимают место на сервере и могут замедлять работу сайта. В этой статье мы рассмотрим, как автоматизировать удаление старых медиа файлов, которые не используются в записях и страницах, с помощью PHP скрипта. Это решение поможет сэкономить место и поддерживать порядок в медиа библиотеке.

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

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

  • Перенасыщение файловой системы и базы данных лишними объектами.
  • Увеличение размера резервных копий и времени их создания.
  • Потенциальное замедление работы сайта при больших объемах медиа.
  • Риск хранения устаревшей, неактуальной информации.

Ручное удаление — долгий и утомительный процесс, особенно при большом количестве файлов. Автоматизация с помощью PHP решает эту проблему.

Как определить, какие медиа файлы не используются

Для начала нужно понять, что означает «неиспользуемый» файл. Обычно это файлы, которые загружены в библиотеку, но не вставлены в содержимое страниц, записей, или не назначены как миниатюры (featured images).

Основные способы проверки использования медиа файлов:

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

В нашем скрипте мы реализуем поиск по содержимому и метаданным, чтобы надежно определить неиспользуемые объекты.

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

Ниже пример функции wpfinder_delete_unused_media_files(), которую можно запустить один раз через wp-cli, cron или временно в шаблоне. Скрипт проверяет все вложения, ищет их использование и удаляет неиспользуемые.

function wpfinder_delete_unused_media_files() {
    global $wpdb;

    // Получаем все вложения (медиа)
    $attachments = get_posts([
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'post_status' => 'any',
        'fields' => 'ids',
    ]);

    $deleted_count = 0;

    foreach ($attachments as $attachment_id) {
        $used = false;

        // Проверяем, используется ли как миниатюра
        $thumbnail_query = $wpdb->get_var($wpdb->prepare(
            "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND meta_value = %d LIMIT 1",
            $attachment_id
        ));
        if ($thumbnail_query) {
            $used = true;
        }

        // Проверяем, связан ли вложение с постом (parent)
        $parent_id = wp_get_post_parent_id($attachment_id);
        if ($parent_id) {
            $used = true;
        }

        // Проверяем вхождение ID вложения в контент всех постов.
        if (!$used) {
            $attachment_url = wp_get_attachment_url($attachment_id);
            if ($attachment_url) {
                $posts_with_attachment = $wpdb->get_var($wpdb->prepare(
                    "SELECT ID FROM $wpdb->posts WHERE post_content LIKE %s LIMIT 1",
                    '%' . $wpdb->esc_like($attachment_url) . '%'
                ));
                if ($posts_with_attachment) {
                    $used = true;
                }
            }
        }

        // Если не найдено использование — удаляем вложение
        if (!$used) {
            wp_delete_attachment($attachment_id, true);
            $deleted_count++;
        }
    }

    return $deleted_count;
}

Этот код:

  • Выбирает все вложения.
  • Проверяет, используется ли вложение как миниатюра, есть ли связь с родительским постом.
  • Ищет вхождение URL вложения в контент постов.
  • Если не используется, удаляет вложение без возможности восстановления (параметр true в wp_delete_attachment).

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

Рекомендуется перед запуском сделать резервную копию сайта и базы данных. Для запуска можно:

  • Запустить функцию через wp-cli: создать отдельный PHP-файл в корне сайта, подключить wp-load.php и вызвать функцию.
  • Добавить вызов функции в шаблон (например, в functions.php) с условием, чтобы запуск был однократным.
  • Использовать cron-задачу для периодического удаления.

Пример wp-cli команды:

php wp-cli.php --require=delete-unused-media.php eval "echo wpfinder_delete_unused_media_files();"

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

Если не хочется писать код, можно использовать готовые плагины. Однако внимательно проверяйте отзывы и делайте бэкапы.

  • Media Cleaner — анализирует библиотеку и помогает удалять неиспользуемые файлы.
  • Clearfy Pro — среди множества функций есть оптимизация и очистка медиа.

Использование плагинов удобно, если нужно больше автоматизации и визуального контроля.

Заключение

Регулярная очистка медиа библиотеки от неиспользуемых файлов — важный этап в сопровождении WordPress сайта. С помощью предложенного PHP скрипта можно быстро найти и удалить старые медиа, освобождая место и повышая производительность. Для более удобного управления можно подключить проверенные плагины, например, Clearfy Pro. Не забывайте делать резервные копии перед очисткой!

Автозаполнение форм в WordPress: обработка данных и примеры кода
24.11.2025
Диагностика и решение проблем с неработающим AJAX в WooCommerce
23.05.2026
Как настроить отложенный запуск задач в WordPress с помощью WP-Cron
02.03.2026
Как создать динамическую таблицу в WordPress с помощью шорткода
05.11.2025
Запрет доступа к административной панели WordPress по IP: как ограничить доступ безопасно
21.11.2025