Диагностика проблемы: накопление старых чертежей и документов в медиа библиотеке
В крупных компаниях и проектах, где 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) | Простой в использовании, визуальный интерфейс | Нагрузка на сайт, может удалять важные файлы без правильных настроек |
| Ручное удаление через админку | Контроль, минимальные риски удаления | Трудоёмко, не подходит для больших объёмов |