В процессе работы с WordPress накапливается большое количество медиа файлов: изображения, видео, аудио и другие вложения. Со временем многие из них становятся неактуальными — например, прикрепленные к удаленным постам или неиспользуемые в контенте. Это негативно влияет на размер хранилища и производительность сайта. В этой статье мы подробно рассмотрим, как создать автоматическую систему удаления старых и неиспользуемых медиа файлов в WordPress с помощью WP-Cron и собственного кода.
Почему важно удалять старые медиа файлы в WordPress
Медиа файлы занимают значительный объем дискового пространства, особенно на сайтах с большим количеством публикаций и загрузок. Если не контролировать их количество, это может привести к следующим проблемам:
- Переполнение хранилища хостинга и дополнительные расходы.
- Замедление работы сайта из-за большого количества файлов и роста базы данных.
- Сложности с резервным копированием и восстановлением.
- Повышенная нагрузка при генерации миниатюр и обработке изображений.
Автоматизация удаления старых или неиспользуемых файлов позволяет поддерживать порядок и оптимизировать ресурсы сайта.
Обзор подхода: как удалить старые медиа файлы программно
Прежде чем приступить к коду, важно определить критерии удаления:
- Возраст файла (например, медиа, которые не использовались и которым больше 6 месяцев).
- Отсутствие привязки к постам — медиа, которые не прикреплены к каким-либо записям.
- Отсутствие использования в контенте сайта.
Мы будем использовать WP_Query и функции WordPress для поиска таких файлов, а затем удалять их с помощью wp_delete_attachment(). Для автоматизации применим WP-Cron, чтобы задача выполнялась регулярно.
Создаем функцию удаления старых медиа файлов
Добавим в файл functions.php вашей темы или в отдельный плагин следующий код:
function wpcommunity_delete_old_unused_attachments() {
$days = 180; // Возраст файла в днях
$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,
'fields' => 'ids',
);
$attachments = get_posts($args);
$deleted_count = 0;
foreach ($attachments as $attachment_id) {
// Проверяем, прикреплен ли файл к посту
$parent_id = wp_get_post_parent_id($attachment_id);
if ($parent_id) {
continue; // Файл используется
}
// Проверяем, используется ли файл внутри постов (в контенте)
$file_url = wp_get_attachment_url($attachment_id);
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s AND post_status = 'publish'",
'%' . $wpdb->esc_like($file_url) . '%'
));
if ($count == 0) {
// Удаляем вложение и его файлы
wp_delete_attachment($attachment_id, true);
$deleted_count++;
}
}
return $deleted_count;
}Эта функция ищет все медиа файлы старше 180 дней, которые не имеют родительского поста и не используются в опубликованном контенте, и удаляет их безвозвратно.
Автоматизация с помощью WP-Cron
Чтобы задача выполнялась регулярно, например, раз в неделю, добавим расписание в WP-Cron.
function wpcommunity_schedule_delete_old_attachments() {
if (!wp_next_scheduled('wpcommunity_delete_old_attachments_hook')) {
wp_schedule_event(time(), 'weekly', 'wpcommunity_delete_old_attachments_hook');
}
}
add_action('wp', 'wpcommunity_schedule_delete_old_attachments');
add_action('wpcommunity_delete_old_attachments_hook', function() {
$deleted = wpcommunity_delete_old_unused_attachments();
if ($deleted > 0) {
error_log('WPCommunity: удалено старых медиа файлов - ' . $deleted);
}
});Сначала мы регистрируем событие, которое запускается еженедельно и вызывает нашу функцию удаления. Логирование помогает отслеживать работу скрипта в файле журнала ошибок PHP.
Дополнительные советы и плагины для работы с медиа файлами
Если вы предпочитаете готовые решения или хотите расширить возможности:
- Media Cleaner — плагин для поиска и удаления неиспользуемых медиа файлов с удобным интерфейсом.
- WP Optimize — комплексный плагин для оптимизации базы данных и удаления мусора, включая медиа.
- Clearfy Pro — плагин для оптимизации и безопасности WordPress, который помогает управлять медиа и другими ресурсами сайта.
Используйте эти инструменты в дополнение к автоматизации, чтобы поддерживать сайт в порядке.
Обработка исключений и безопасность
Удаление медиа файлов — операция необратимая, поэтому важно предусмотреть меры безопасности:
- Обязательно делайте резервные копии сайта и базы данных перед настройкой автоматического удаления.
- Можно добавить фильтры, чтобы исключать из удаления важные файлы по MIME типу или по определенным папкам.
- Реализуйте журналирование удалений для аудита и контроля.
Для примера, добавим фильтр исключения изображений определенного типа:
function wpcommunity_exclude_certain_mime_types($attachment_id) {
$mime = get_post_mime_type($attachment_id);
$exclude = array('image/svg+xml'); // Исключаем SVG
return in_array($mime, $exclude);
}
// Вставьте проверку в основную функцию перед удалением:
if (wpcommunity_exclude_certain_mime_types($attachment_id)) {
continue; // Пропускаем файл
}Итоги
Автоматизация удаления старых и неиспользуемых медиа файлов в WordPress позволяет поддерживать чистоту и оптимальный размер сайта без лишних усилий. Использование WP-Cron и собственных функций дает гибкость и контроль. Комбинируйте программные решения с проверенными плагинами, такими как Clearfy Pro, чтобы сделать процесс максимально удобным и безопасным.