Управление медиафайлами — важная часть поддержки производительности и чистоты сайта на WordPress. Со временем на сервере накапливается множество неиспользуемых или устаревших изображений и других файлов, которые занимают место и могут замедлять работу сайта. В этой статье разберём, как автоматически удалять старые медиафайлы в WordPress, чтобы поддерживать порядок и экономить ресурсы.
Почему важно удалять старые медиафайлы в WordPress
Медиафайлы, которые не используются в публикациях, страницах или других элементах сайта, называются «битым мусором» или «мёртвыми» файлами. Они занимают место на хостинге, увеличивают размер бэкапов и могут привести к снижению скорости загрузки сайта. Особенно это актуально для проектов с большим количеством изображений — магазинов, блогов с фото и портфолио.
Удаление таких файлов вручную — трудоёмкий и рискованный процесс. Можно случайно удалить нужные изображения или пропустить ненужные. Поэтому автоматизация — оптимальное решение.
Автоматизация удаления старых медиафайлов: задачи и критерии
Перед тем как писать код или использовать плагины, важно определить критерии удаления:
- Старые по дате загрузки (например, старше 1 года)
- Не прикреплённые к постам (attachment без parent post)
- Неиспользуемые в контенте (в редакторе, виджетах, настройках)
- Может быть, с определёнными типами файлов (например, только изображения)
Также желательно предусмотреть создание резервной копии и логи действий для контроля.
Плагины для автоматического удаления медиафайлов
Несколько полезных плагинов, которые помогут в решении задачи:
- Media Cleaner — анализирует базу данных и файловую систему, находит неиспользуемые файлы и предлагает их удалить. Есть платная версия с расширенными функциями.
- DNUI (Delete Not Used Image) — простой плагин для поиска и удаления неиспользуемых изображений.
- WPOptimize — комплексный плагин для оптимизации базы данных и медиафайлов, умеет удалять неиспользуемые медиа.
Для автоматизации по расписанию можно сочетать эти плагины с WP-Cron или серверными задачами.
Как написать свой код для автоматического удаления старых медиафайлов
Если хочется более гибкого и лёгкого решения, можно написать собственный плагин или добавить код в functions.php темы. Рассмотрим пример функции, которая удаляет все медиафайлы, которые не прикреплены к постам и старше 180 дней.
function wpaddons_delete_old_unattached_media() {
$args = array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'inherit',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '180 days ago',
),
),
'meta_query' => array(
array(
'key' => '_wp_attachment_context',
'compare' => 'NOT EXISTS',
),
),
'post_parent' => 0,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$attachment_id = get_the_ID();
wp_delete_attachment($attachment_id, true); // true — удалить физический файл
}
wp_reset_postdata();
}
}
// Запускаем функцию раз в неделю через WP-Cron
if (!wp_next_scheduled('wpaddons_weekly_media_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpaddons_weekly_media_cleanup');
}
add_action('wpaddons_weekly_media_cleanup', 'wpaddons_delete_old_unattached_media');В этом примере мы используем WP_Query для поиска вложений (attachments) с post_parent = 0 — то есть не прикреплённых к постам, и дату создания старше 180 дней. Затем функция удаляет такие вложения вместе с физическими файлами.
Важно! Перед использованием подобного кода обязательно делайте резервную копию сайта и базы данных.
Как проверить, что удаляется нужное
Для безопасности можно сначала выводить список ID и имен файлов, которые будут удалены, вместо реального удаления. Например, заменить вызов wp_delete_attachment на error_log('Удаляется файл ID: ' . $attachment_id); чтобы проверить работу кода.
Расширение функционала: удаление неиспользуемых медиа по содержимому
Иногда медиафайл прикреплён к посту, но не используется в тексте. Для полного удаления таких файлов можно парсить содержимое постов и искать ссылки на медиа.
Это более сложная задача, которая требует обхода всех постов и проверки вхождений URL файлов. Ниже базовый пример, как получить список всех вложений и проверить ссылки:
function wpaddons_find_unused_media() {
global $wpdb;
$attachments = get_posts(array(
'post_type' => 'attachment',
'numberposts' => -1,
));
$unused = array();
foreach ($attachments as $attachment) {
$url = wp_get_attachment_url($attachment->ID);
// Поиск URL в содержимом сайта
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
'%' . $wpdb->esc_like($url) . '%'
));
if ($count == 0) {
$unused[] = $attachment->ID;
}
}
return $unused;
}Дальше можно удалить полученные ID, но будьте осторожны с производительностью и сделайте проверку.
Рекомендации по работе с медиафайлами в WordPress
Чтобы минимизировать появление «мусорных» файлов, придерживайтесь следующих правил:
- Регулярно используйте плагины типа Media Cleaner для поиска неиспользуемых файлов.
- Не загружайте лишние файлы без необходимости.
- Перед удалением медиа создавайте резервные копии.
- Автоматизируйте очистку с помощью WP-Cron или серверных cron задач.
- Оптимизируйте изображения — используйте плагины сжатия и lazy loading.
Для комплексной оптимизации можно рассмотреть плагин Clearfy Pro, который включает в себя инструменты для очистки и ускорения сайта.
Итог
Автоматическое удаление старых и неиспользуемых медиафайлов помогает поддерживать чистоту и производительность WordPress-сайта. Используйте готовые плагины или пишите собственные решения с WP-Cron для регулярной очистки. Обязательно тестируйте и делайте резервные копии, чтобы избежать потери важных данных.