Медиабиблиотека WordPress со временем может разрастаться и накапливать много неиспользуемых или устаревших файлов. Это приводит к увеличению размера сайта и замедлению его работы, особенно если хостинг ограничен по дисковому пространству. В этой статье рассмотрим, как автоматически удалять старые файлы из медиабиблиотеки WordPress по расписанию с помощью PHP-кода и WP-Cron, а также какие плагины помогут упростить задачу.
Почему важно удалять старые файлы из медиабиблиотеки
Со временем в медиабиблиотеке накапливаются:
- неиспользуемые изображения и видео, которые больше не вставлены ни в один пост или страницу;
- автоматические миниатюры, генерируемые темами и плагинами;
- старые версии изображений и неактуальные файлы;
- временные файлы, оставшиеся после обновлений или переноса сайта.
Удаление таких файлов освобождает место на сервере и улучшает производительность сайта. Кроме того, регулярная чистка медиабиблиотеки снижает риск ошибок при бэкапах и миграциях.
Основные этапы автоматического удаления файлов по расписанию
Для реализации автоматического удаления нам понадобятся следующие шаги:
- Определить критерии для удаления — например, файлы, не используемые в постах и старше определённого времени.
- Создать функцию, которая будет находить и удалять такие файлы.
- Запланировать выполнение этой функции по расписанию с помощью WP-Cron.
Рассмотрим каждый шаг подробнее.
Определение критериев для удаления
Самый надёжный способ — проверить, какие медиафайлы не прикреплены к записям (posts) или страницам и не используются нигде на сайте. Также можно ограничиться удалением файлов, загруженных раньше определённого времени (например, старше 6 месяцев).
Для проверки использования файлов можно анализировать содержимое постов и метаданные. Это сложно и ресурсоёмко, поэтому в большинстве случаев достаточно проверять, есть ли у файла связь с постом (post_parent) и дату загрузки.
Пример функции для удаления старых неиспользуемых медиафайлов
function wpall_delete_old_unused_media() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));
$args = array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'inherit',
'date_query' => array(
array('before' => $date_threshold),
),
'meta_query' => array(
array(
'key' => '_wp_attached_file',
'compare' => 'EXISTS',
),
),
);
$attachments = get_posts($args);
$deleted_count = 0;
foreach ($attachments as $attachment) {
// Проверяем, прикреплён ли файл к посту
if (empty($attachment->post_parent)) {
// Проверяем, используется ли файл в содержимом сайта
$file_url = wp_get_attachment_url($attachment->ID);
global $wpdb;
$usage_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
'%' . $wpdb->esc_like($file_url) . '%'
));
if ($usage_count == 0) {
// Удаляем файл и запись из базы
wp_delete_attachment($attachment->ID, true);
$deleted_count++;
}
}
}
return $deleted_count;
}
Данная функция ищет все вложения старше 6 месяцев, не прикреплённые к постам, и проверяет, есть ли ссылка на них в содержимом. Если нет — удаляет.
Настройка WP-Cron для автоматического запуска
Чтобы функция выполнялась регулярно, добавим расписание и событие в WP-Cron.
Добавление собственного расписания
function wpall_custom_cron_schedules($schedules) {
if(!isset($schedules['weekly'])) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __('Раз в неделю')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpall_custom_cron_schedules');
Запланировать событие
function wpall_schedule_media_cleanup() {
if (!wp_next_scheduled('wpall_daily_media_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpall_daily_media_cleanup');
}
}
add_action('wp', 'wpall_schedule_media_cleanup');
Подключение функции к событию
add_action('wpall_daily_media_cleanup', 'wpall_delete_old_unused_media');
Теперь функция wpall_delete_old_unused_media будет вызываться еженедельно и удалять старые неиспользуемые медиафайлы.
Плагины для упрощения очистки медиабиблиотеки
Если не хочется писать код, можно использовать плагины, которые помогают находить и удалять неиспользуемые файлы:
- Media Cleaner — популярный плагин для поиска и удаления неиспользуемых медиафайлов. Позволяет делать резервные копии и восстанавливать удалённые файлы.
- Clearfy Pro — комплексный плагин оптимизации, который умеет убирать неиспользуемое из медиабиблиотеки и оптимизировать базу данных.
Советы и предупреждения при удалении файлов
Удаление медиафайлов может привести к проблемам, если они используются в скрытых местах, например, в настройках темы, виджетах или плагинах. Рекомендуется:
- Обязательно делать бэкап сайта перед автоматической очисткой.
- Тестировать функцию на тестовом сайте или на небольшой выборке.
- Проверять логи, чтобы убедиться, что удаляются только неиспользуемые файлы.
- Использовать безопасный режим удаления — например, сначала помечать файлы для удаления, а потом удалять вручную.
Выводы
Автоматизация удаления старых и неиспользуемых файлов из медиабиблиотеки WordPress помогает поддерживать сайт в оптимальном состоянии, экономит место на сервере и снижает нагрузку. Используя пример кода и WP-Cron из этой статьи, вы сможете настроить своевременную очистку, а при необходимости — дополнить её удобными плагинами, например, Media Cleaner или Clearfy Pro.