В процессе эксплуатации сайта на WordPress накапливается большое количество изображений, которые со временем перестают использоваться — старые версии, неиспользуемые медиафайлы, временные загрузки. Это приводит к увеличению размера медиа-библиотеки, замедлению работы сайта и необоснованному расходу дискового пространства. В этой статье мы разберём, как автоматически находить и удалять такие изображения с помощью кода и плагинов.
Почему важно удалять старые изображения в WordPress
Медиафайлы занимают значительную часть дискового пространства сайта. Со временем, при обновлении контента, многие изображения становятся ненужными, но остаются в библиотеке. Их хранение приводит к:
- Замедлению резервного копирования и восстановления;
- Увеличению размера базы данных из-за метаданных;
- Росту затрат на хостинг;
- Снижению удобства работы с медиа-библиотекой.
Автоматизация удаления старых и неиспользуемых изображений помогает поддерживать сайт в чистоте и оптимизации.
Как определить, какие изображения считаются старыми и неиспользуемыми
Под «старыми» можно понимать изображения, которые не используются в постах, страницах, виджетах и настройках темы. Для этого нужно проверить, есть ли ссылки на эти изображения в базе данных. Также можно учитывать дату загрузки — например, удалить все изображения старше 1 года, которые не используются.
Плагин Media Cleaner помогает сканировать библиотеку и выявлять неиспользуемые файлы. Но у него есть ограничения — он не всегда точно находит все ссылки, особенно если изображения вставлены нестандартными способами.
Автоматическое удаление неиспользуемых изображений с помощью кода
Напишем пример функции для WPlearn, которая будет искать неиспользуемые изображения и удалять их. В этом примере мы ориентируемся на медиафайлы, которые не связаны с записями и страницами:
function wplearn_delete_unused_images() {
global $wpdb;
// Получаем все ID вложений (изображений)
$attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");
foreach ($attachments as $attachment_id) {
// Проверяем, есть ли ссылка на вложение в постах
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
'%'.wp_get_attachment_url($attachment_id).'%'
));
// Проверяем, прикреплено ли к посту
$parent_id = wp_get_post_parent_id($attachment_id);
if ($count == 0 && $parent_id == 0) {
// Удаляем вложение без возможности восстановления
wp_delete_attachment($attachment_id, true);
}
}
}
// Запускаем удаление через WP Cron раз в неделю
if (!wp_next_scheduled('wplearn_weekly_image_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wplearn_weekly_image_cleanup');
}
add_action('wplearn_weekly_image_cleanup', 'wplearn_delete_unused_images');Данный код проверяет, есть ли ссылки на изображения в содержимом постов, и удаляет те, что не используются и не прикреплены к другим записям. Чтобы избежать случайного удаления, рекомендуется сначала запускать проверку с выводом списка на удаление.
Как вывести список неиспользуемых изображений для проверки
function wplearn_get_unused_images() {
global $wpdb;
$unused = [];
$attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");
foreach ($attachments as $attachment_id) {
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
'%'.wp_get_attachment_url($attachment_id).'%'
));
$parent_id = wp_get_post_parent_id($attachment_id);
if ($count == 0 && $parent_id == 0) {
$unused[] = $attachment_id;
}
}
return $unused;
}Вы можете вывести результат вызова этой функции на админ-странице для проверки перед удалением.
Плагины для автоматизации очистки медиа-библиотеки
Помимо Media Cleaner, рассмотрим ещё несколько полезных плагинов:
- WP-Optimize — помимо очистки базы данных, умеет удалять неиспользуемые медиафайлы;
- Image Cleanup — простой инструмент для поиска и удаления неиспользуемых изображений;
- Clearfy Pro — в числе функций есть оптимизация медиа и управление ненужными файлами.
Использовать плагины удобно, но не забывайте делать полные бэкапы перед очисткой.
Как настроить автоматическую очистку с помощью WP Cron
В приведённом выше коде мы использовали планировщик задач WordPress — WP Cron, чтобы запускать очистку еженедельно. Это удобно, чтобы не выполнять тяжелые операции вручную.
Если хотите, можно изменить частоту или отключить автоматический запуск и запускать функцию вручную из админки или через WP-CLI.
Пример запуска очистки вручную через WP-CLI:
wp eval 'wplearn_delete_unused_images();'Рекомендации по безопасности и резервному копированию
Удаление медиафайлов — необратимая операция при использовании wp_delete_attachment с параметром true. Поэтому:
- Всегда делайте резервные копии сайта и базы данных перед автоматической очисткой;
- Рекомендуется сначала получать список неиспользуемых файлов и проверять их;
- Если боитесь ошибок, используйте плагин Media Cleaner в режиме сканирования без удаления;
- Тестируйте скрипты на копии сайта перед запуском на боевом ресурсе.
Заключение
Автоматизация удаления старых и неиспользуемых изображений в WordPress поможет поддерживать сайт в оптимальном состоянии, экономить место на диске и уменьшать нагрузку на бэкапы. В статье мы рассмотрели, как сделать это с помощью собственного кода и популярных плагинов. Внедряйте эти методы аккуратно, всегда делайте резервные копии и проверяйте результаты. Если хотите расширить функционал, обратите внимание на плагины из WPShop, например Clearfy Pro для более удобного управления медиа.