Изображения занимают значительную часть дискового пространства на любом сайте WordPress. Особенно остро эта проблема становится при длительной работе сайта с большим количеством медиафайлов, когда многие из них уже не используются — например, картинки, загруженные для старых постов, которые были удалены, или временные изображения, созданные плагинами. В результате база медиафайлов разрастается, что приводит к замедлению бэкапов, увеличению затрат на хостинг и усложнению управления сайтом.
Проблема неиспользуемых изображений в WordPress
WordPress не предоставляет встроенных инструментов для поиска и удаления неиспользуемых изображений. Все файлы, загруженные в медиабиблиотеку, остаются на сервере, даже если они не привязаны ни к каким постам или страницам. Это приводит к накоплению «мусора», который занимает место и может негативно влиять на производительность сайта.
Ручной поиск таких изображений — трудоемкий и рискованный процесс, который может привести к случайному удалению нужных файлов. Поэтому оптимальное решение — использование автоматических инструментов и скриптов.
Плагины для автоматического удаления неиспользуемых изображений
Существует несколько популярных плагинов, которые помогают находить и удалять неиспользуемые изображения в WordPress:
- Media Cleaner — сканирует медиабиблиотеку и контент на предмет использования файлов, позволяет безопасно удалять неиспользуемые изображения с возможностью восстановления.
- WP-Optimize — многофункциональный плагин для оптимизации базы данных, включая очистку неиспользуемых медиафайлов.
- DNUI (Delete Not Used Image) — простой и эффективный инструмент для удаления файлов, не привязанных к контенту.
Пример использования Media Cleaner с параметрами сканирования:
// Настройка Media Cleaner для глубокого сканирования
add_filter('media_cleaner_scan_mode', function() {
return 'deep'; // глубокий режим сканирования
});
Плагин можно настроить на автоматическое сканирование по расписанию через WP Cron и удаление найденных неиспользуемых изображений.
Автоматизация удаления неиспользуемых изображений через код
Если вы хотите создать собственное решение без использования плагинов или дополнить их функционал, можно написать кастомный скрипт для поиска и удаления неиспользуемых изображений. Пример простой функции для поиска изображений, не привязанных к постам:
function wpsystem_find_unused_images() {
global $wpdb;
// Получаем все ID вложений (изображений)
$attachments = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'");
$unused = [];
foreach ($attachments as $attachment_id) {
$parent_id = get_post_field('post_parent', $attachment_id);
if (empty($parent_id)) {
// Проверяем, используется ли изображение в контенте
$url = wp_get_attachment_url($attachment_id);
$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;
}
function wpsystem_delete_unused_images() {
$unused_images = wpsystem_find_unused_images();
foreach ($unused_images as $id) {
wp_delete_attachment($id, true); // Удаляем навсегда
}
return count($unused_images);
}
Данный код проверяет все изображения, у которых нет родительского поста и которые не вставлены напрямую в содержимое других постов. Это базовый пример, который можно улучшить, учитывая дополнительные места использования изображений, например, виджеты, пользовательские поля, кэш и т. д.
Расширение функционала: проверка пользовательских полей и метаданных
В реальных проектах изображения могут использоваться не только в контенте, но и в произвольных полях, настройках темы или плагинов. Чтобы не удалить такие файлы, скрипт нужно расширить для поиска ссылок на изображения в пользовательских полях:
function wpsystem_is_image_used_elsewhere($url) {
global $wpdb;
// Поиск в мета-данных постов
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_value LIKE %s",
'%' . $wpdb->esc_like($url) . '%'
));
if ($count > 0) return true;
// Можно добавить проверку опций, пользовательских таблиц и т.д.
return false;
}
Интеграция этой проверки в основной цикл позволит более надежно выявлять неиспользуемые изображения.
Рекомендации по безопасности и резервному копированию
Перед удалением любых файлов с сервера крайне важно сделать полное резервное копирование сайта и базы данных. Ошибки в логике поиска неиспользуемых изображений могут привести к удалению важных файлов, что негативно скажется на отображении сайта.
Также рекомендуем сначала собирать список подозрительных файлов и вручную проверять его, а не сразу удалять. Многие плагины, например Media Cleaner, поддерживают режим «безопасного удаления» с возможностью восстановления.
Заключение: почему важно регулярно чистить медиабиблиотеку
Оптимизация медиабиблиотеки — важный технический шаг для поддержки скорости и надежности WordPress-сайта. Автоматическое удаление неиспользуемых изображений помогает:
- Сократить объем дискового пространства;
- Ускорить создание резервных копий;
- Снизить время индексации и обработки медиафайлов;
- Облегчить администрирование и поддержку сайта.
Используйте готовые плагины или создавайте собственные решения с учетом специфики вашего проекта. Регулярный аудит медиабиблиотеки — залог чистоты и эффективности WordPress-сайта.