Со временем в медиабиблиотеке WordPress накапливаются устаревшие и неиспользуемые файлы: изображения, видео, документы. Они занимают место на сервере, замедляют работу сайта и усложняют резервное копирование. В этой статье разберём, как автоматически очищать старый медиаконтент с помощью кода и готовых плагинов, чтобы поддерживать порядок и оптимизировать производительность сайта.
Почему важно удалять старый медиаконтент в WordPress
Медиабиблиотека WordPress по умолчанию не удаляет файлы, даже если записи или страницы, где они использовались, были удалены. Такие файлы остаются «мертвыми» и занимают место на диске. Это может привести к следующим проблемам:
- Рост размера резервных копий и времени их создания.
- Перегрузка сервера и возможные ограничения хостинга.
- Сложности с управлением файлами и визуальной навигацией в медиабиблиотеке.
- Потенциальные риски безопасности из-за устаревших файлов.
Автоматизация очистки избавит от необходимости делать это вручную и обеспечит регулярное поддержание чистоты сайта.
Настройка автоматической очистки старых файлов с помощью WP Cron
Создание функции удаления файлов, неиспользуемых более 30 дней
Для начала создадим функцию, которая будет искать и удалять файлы, не привязанные к постам и которые были загружены более 30 дней назад.
function wpupload_delete_old_unused_media() {
$days = 30; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'date_query' => array(
array(
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_wpupload_attachment_used',
'compare' => 'NOT EXISTS',
),
),
);
$attachments = get_posts($args);
foreach ($attachments as $attachment) {
// Проверяем, используется ли файл в контенте
$used = false;
$posts = get_posts(array(
's' => basename(get_attached_file($attachment->ID)),
'post_type' => 'any',
'posts_per_page' => 1,
));
if (!empty($posts)) {
$used = true;
update_post_meta($attachment->ID, '_wpupload_attachment_used', 1);
}
if (!$used) {
wp_delete_attachment($attachment->ID, true);
}
}
}Эта функция ищет вложения (attachment), которые старше 30 дней, и проверяет, используются ли они в каких-либо постах. Если нет — удаляет их с сервера.
Регистрация задачи WP Cron для периодического запуска
Чтобы функция запускалась автоматически, зарегистрируем событие в планировщике WordPress:
function wpupload_schedule_cleanup() {
if (!wp_next_scheduled('wpupload_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpupload_cleanup_event');
}
}
add_action('wp', 'wpupload_schedule_cleanup');
add_action('wpupload_cleanup_event', 'wpupload_delete_old_unused_media');Этот код добавляет ежедневный запуск функции очистки.
Использование плагинов для автоматической очистки медиабиблиотеки
Если вы не хотите писать код, можно использовать готовые плагины, которые помогают управлять и очищать медиабиблиотеку:
- Media Cleaner — анализирует медиафайлы и удаляет неиспользуемые. Есть бесплатная и PRO версии. Позволяет безопасно очищать библиотеку без риска удалить нужные файлы.
- WP-Optimize — комплексное решение для оптимизации базы данных и медиа, включая удаление неиспользуемых изображений.
- Enable Media Replace — позволяет заменять файлы в медиабиблиотеке, что помогает поддерживать актуальность контента.
Для автоматизации процесса можно настроить запуск плагина Media Cleaner с помощью WP Cron, используя его API — подробности есть в документации плагина.
Как интегрировать очистку медиаконтента с WP Upload Dir для разделения и управления файлами
Если у вас на сайте большое количество загруженных файлов, можно использовать плагин WP Upload Dir для разделения файлов по папкам и категориям. Это упрощает поиск и удаление устаревших файлов.
Например, настройка плагина позволяет хранить изображения и видео в отдельных папках, что облегчает идентификацию старых файлов для автоматического удаления.
Можно дополнительно расширить функцию очистки, проверяя файлы в определённых директориях:
function wpupload_delete_old_files_in_custom_dir() {
$upload_dir = wp_upload_dir();
$custom_dir = $upload_dir['basedir'] . '/custom_folder';
$files = glob($custom_dir . '/*');
$now = time();
$days = 30 * 24 * 60 * 60;
foreach ($files as $file) {
if (is_file($file)) {
$file_time = filemtime($file);
if (($now - $file_time) > $days) {
unlink($file); // Удаление файла
}
}
}
}Практические рекомендации и безопасность при очистке медиаконтента
Автоматическое удаление файлов требует осторожности. Вот несколько советов, чтобы не потерять важные данные:
- Перед запуском очистки сделайте полный бэкап сайта и базы данных.
- Тестируйте функцию удаления на тестовом сайте или копии базы.
- Используйте мета-поля и кэширование для ускорения проверки использования файлов.
- Добавьте в логи информацию о удалённых файлах для последующего анализа.
- Регулярно проверяйте медиабиблиотеку вручную, чтобы убедиться в правильности работы скриптов.
Для примера можно добавить логирование удалённых файлов:
function wpupload_log_deleted_file($file) {
$log_file = WP_CONTENT_DIR . '/wpupload_deleted_files.log';
$log_entry = date('Y-m-d H:i:s') . " - Deleted: " . $file . PHP_EOL;
file_put_contents($log_file, $log_entry, FILE_APPEND);
}
// В функции удаления добавить вызов:
// wpupload_log_deleted_file(get_attached_file($attachment->ID));