Диагностика проблемы: зачем удалять старый медиаконтент
С течением времени медиабиблиотека WordPress разрастается, занимая лишнее место на сервере и замедляя работу сайта. Особенно это критично для проектов с частыми загрузками: новостные порталы, магазины с большим количеством товаров, сайты с пользовательским контентом. В таких случаях важно регулярно удалять устаревшие или неиспользуемые файлы, чтобы оптимизировать хранилище и повысить производительность.
Как определить, какие файлы следует удалять
Для автоматизации удаления стоит ориентироваться не только на дату загрузки, но и на использование файлов в записях, постах, товарах WooCommerce или других кастомных типах записей. Однако, если задача — удалить все файлы, загруженные более N месяцев назад, и при этом не анализировать их использование, это можно сделать относительно просто.
Пример выборки файлов по дате загрузки
global $wpdb;
$months = 6; // Кол-во месяцев для хранения
$time_limit = date('Y-m-d H:i:s', strtotime("-{$months} months"));
$old_attachments = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_date < %s",
$time_limit
));
Пошаговое решение: скрипт для автоматического удаления
Создадим функцию, которая будет удалять все вложения, старше заданного срока, и запускать её через WP-Cron для регулярного выполнения.
Код функции удаления старого медиаконтента
function wpupload_delete_old_attachments() {
global $wpdb;
$months = 6; // Укажите количество месяцев для хранения
$time_limit = date('Y-m-d H:i:s', strtotime("-{$months} months"));
$old_attachments = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_date < %s",
$time_limit
));
foreach ($old_attachments as $attachment) {
// Удаляем вложение с возвратом результата
wp_delete_attachment($attachment->ID, true); // true — навсегда, без корзины
}
}
// Регистрация события в WP-Cron
if (!wp_next_scheduled('wpupload_delete_old_attachments_event')) {
wp_schedule_event(time(), 'daily', 'wpupload_delete_old_attachments_event');
}
add_action('wpupload_delete_old_attachments_event', 'wpupload_delete_old_attachments');
Как добавить активацию и деактивацию при инициализации плагина
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('wpupload_delete_old_attachments_event')) {
wp_schedule_event(time(), 'daily', 'wpupload_delete_old_attachments_event');
}
});
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wpupload_delete_old_attachments_event');
});
Проверка результата после внедрения
Для проверки корректной работы:
- В админке WordPress перейдите в Медиа > Библиотека и отфильтруйте файлы по дате загрузки (если доступно) или используйте SQL-запросы для оценки количества вложений старше установленного срока.
- Запустите функцию вручную через WP-CLI или временно добавьте вызов функции в шаблон и проверьте, что файлы удаляются.
- Проверьте, что после удаления в базе не осталось записей о файлах и сами файлы удалены из папки uploads.
Частые ошибки и как их исправить
- Удаление важных файлов, используемых на сайте: обязательно проверьте, что файлы не привязаны к публикациям или товарам, иначе контент сломается. Для этого можно расширить запрос, исключив вложения, которые используются.
- Неправильное расписание WP-Cron: если сайт мало посещаем, задачи WP-Cron могут не запускаться вовремя. Для надежности настройте системный cron или используйте плагин WP Crontrol для мониторинга.
- Права доступа к файлам: убедитесь, что серверный пользователь имеет права на удаление файлов в папке uploads.
- Превышение лимита времени выполнения скрипта: при большом количестве файлов разбивайте удаление на партии или используйте AJAX-запросы.
Практические советы по безопасности и производительности
- Перед удалением создавайте резервную копию медиабиблиотеки и базы данных.
- Добавьте логирование удалённых файлов для возможности отката и аудита.
- Для больших сайтов используйте WP-CLI команды для удаления, чтобы избежать тайм-аутов PHP.
- Оптимизируйте запросы к базе данных и используйте индексы по полю
post_date.
Сравнение вариантов удаления старого медиаконтента
| Метод | Плюсы | Минусы |
|---|---|---|
| Использование WP-Cron с кастомной функцией | Гибкость, автоматизация, контроль через код | Зависит от посещаемости сайта, требует навыков разработки |
| Плагины очистки медиатеки | Простота использования, готовый функционал | Могут быть избыточными, риск удаления нужных файлов |
| Ручное удаление через FTP и базу | Максимальный контроль | Трудозатратно и рискованно |