Автоматическое удаление старых чертежей и документов из медиа библиотеки WordPress

Диагностика проблемы: накопление старых чертежей и документов в медиа библиотеке

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

Как определить, какие файлы удалять

Чаще всего для удаления подходят медиафайлы, которые не прикреплены к активным постам и были загружены более определённого времени назад (например, старше 180 дней). Можно ориентироваться на расширения файлов (PDF, DWG, DXF для чертежей), а также на метаданные, если они присутствуют.

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

Для выявления неиспользуемых файлов можно использовать SQL-запрос:

SELECT ID, post_title, post_date FROM wp_posts
WHERE post_type = 'attachment'
AND post_mime_type IN ('application/pdf', 'application/acad', 'image/vnd.dwg')
AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY)
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_parent > 0);

Этот запрос возвращает вложения с нужными расширениями, которые старше 180 дней и не связаны с другими постами.

Пошаговое решение: автоматическое удаление через wp-cron

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

1. Создание функции удаления

function wpscan_delete_old_drawings() {
    global $wpdb;
    // Выбираем ID вложений старше 180 дней с нужным MIME и без связи
    $attachments = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts}
         WHERE post_type = 'attachment'
         AND post_mime_type IN (%s, %s, %s)
         AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY)
         AND post_parent = 0",
        'application/pdf', 'image/vnd.dwg', 'image/x-dwg'
    ));

    foreach ($attachments as $attachment_id) {
        wp_delete_attachment($attachment_id, true);
    }
}

2. Регистрация планировщика wp-cron

if (!wp_next_scheduled('wpscan_daily_delete_old_drawings')) {
    wp_schedule_event(time(), 'daily', 'wpscan_daily_delete_old_drawings');
}
add_action('wpscan_daily_delete_old_drawings', 'wpscan_delete_old_drawings');

3. Очистка планировщика при деактивации плагина

register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wpscan_daily_delete_old_drawings');
});

Как проверить, что удаление работает

1. Запустите функцию вручную через WP-CLI или добавьте временный вызов wpscan_delete_old_drawings(); в functions.php для теста.
2. Проверьте, что файлы и записи вложений со старыми чертежами исчезли из медиа библиотеки.
3. Включите журналирование для отслеживания удалённых ID:

function wpscan_delete_old_drawings() {
    global $wpdb;
    $attachments = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts}
         WHERE post_type = 'attachment'
         AND post_mime_type IN (%s, %s, %s)
         AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY)
         AND post_parent = 0",
        'application/pdf', 'image/vnd.dwg', 'image/x-dwg'
    ));

    foreach ($attachments as $attachment_id) {
        if (wp_delete_attachment($attachment_id, true)) {
            error_log("Deleted attachment ID: " . $attachment_id);
        }
    }
}

Проверьте файл debug.log в папке wp-content на наличие записей.

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

  • Удаление не происходит: планировщик wp-cron может не сработать из-за низкой посещаемости сайта. Решение — настроить системный cron или запустить wp-cron вручную через WP-CLI.
  • Удаляются нужные файлы: проверьте корректность условий выборки, убедитесь, что post_parent=0 не исключает вложения, используемые в постах.
  • Ошибки прав доступа: убедитесь, что у PHP есть права на удаление файлов в папке uploads.

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

  • Перед удалением создавайте резервные копии базы данных и файлов.
  • Используйте транзакции или временно отключайте кэш при массовом удалении, чтобы избежать проблем с целостностью.
  • Для крупных библиотек разбивайте удаление на несколько частей с помощью LIMIT и циклов, чтобы не перегружать сервер.
  • Ограничьте MIME-типы к тем, что реально используются в вашем проекте, чтобы избежать случайного удаления.
  • Для мониторинга используйте плагины аудита или пишите логи в отдельные файлы.

Сравнение методов удаления старых медиафайлов

МетодПреимуществаНедостатки
Код в functions.php с wp-cronГибкость, автоматизация, не требует сторонних плагиновТребует технических навыков, возможны проблемы с wp-cron
Плагин для очистки медиа (например Media Cleaner)Простой в использовании, визуальный интерфейсНагрузка на сайт, может удалять важные файлы без правильных настроек
Ручное удаление через админкуКонтроль, минимальные риски удаленияТрудоёмко, не подходит для больших объёмов
Как установить лимит на запросы REST API WordPress для защиты сайта
21.03.2026
Как отключить автоматические обновления WordPress без плагинов
07.12.2025
Как настроить отправку писем WordPress через SMTP: плагины и примеры кода
21.02.2026
Удаление метаданных из фото в WordPress: как защитить сайт и ускорить загрузку
04.01.2026
Как автоматизировать удаление старых заказов в WooCommerce
18.03.2026