Автоматическое удаление старых чертежей и документов из медиа библиотеки 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 для повышения безопасности
15.01.2026
Как автоматизировать удаление старых заказов в WooCommerce
18.03.2026
Как удалить старые версии постов в WordPress с помощью кода
27.12.2025
Как удалить заблокированные или замедленные заказы WooCommerce с помощью кода
01.05.2026
Как защитить WordPress от атак с помощью Content Security Policy
20.12.2025