Диагностика проблемы со старыми изображениями в WordPress
Со временем в медиа-библиотеке WordPress накапливается большое количество неиспользуемых изображений — те, которые не привязаны к постам, страницам или продуктам WooCommerce. Это приводит к:
- Увеличению размера резервных копий и базы данных.
- Перегрузке сервера и снижению производительности.
- Занятию дискового пространства хостинга.
Чтобы выявить такие изображения, можно использовать SQL-запрос или плагины, но лучше делать это программно, чтобы избежать ошибок.
Как проверить, что изображение не используется
Основной подход — проверить, связано ли изображение с какими-либо записями в базе данных:
- Проверить, есть ли у медиафайла метаданные, указывающие на использование.
- Проверить контент постов и продуктов на наличие ссылок на файл.
Пошаговое решение: автоматическое удаление неиспользуемых изображений
Реализуем скрипт, который автоматически удаляет изображения, неиспользуемые дольше определённого времени (например, 30 дней).
Шаг 1. Создаём WP-CLI команду для поиска неиспользуемых изображений
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('media clean-unused', function() {
global $wpdb;
$threshold = strtotime('-30 days');
$query = $wpdb->prepare(
"SELECT ID, post_date FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%'",
[]
);
$attachments = $wpdb->get_results($query);
$deleted = 0;
foreach ($attachments as $attachment) {
$usage_count = 0;
// Проверяем наличие в контенте постов
$file_url = wp_get_attachment_url($attachment->ID);
$search_query = $wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
'%' . $wpdb->esc_like($file_url) . '%'
);
$usage_count = $wpdb->get_var($search_query);
// Если не используется и старше порога, удаляем
if ($usage_count == 0 && strtotime($attachment->post_date) < $threshold) {
wp_delete_attachment($attachment->ID, true);
$deleted++;
}
}
WP_CLI::success("Удалено неиспользуемых изображений: $deleted");
});
}
Этот код регистрирует WP-CLI команду wp media clean-unused, которая удалит все изображения старше 30 дней, не использующиеся в контенте.
Шаг 2. Запуск команды и настройка автоматизации
Для запуска вручную используйте в терминале:
wp media clean-unused
Чтобы запускать автоматически, добавьте cron задание на сервере:
0 3 * * * /usr/bin/wp media clean-unused --path=/path/to/wordpress --allow-root >> /var/log/wp-media-clean.log 2>&1
Проверка результата после внедрения
- Запустите команду вручную и проверьте вывод — должна быть статистика удалённых файлов.
- Проверьте папку
wp-content/uploads— число файлов должно уменьшиться. - В админке WordPress в медиа-библиотеке не должно быть старых неиспользуемых изображений.
- Проверьте журнал ошибок сервера на предмет сбоев.
Частые ошибки и как их исправить
- Удаление нужных изображений: если изображения используются в сторонних плагинах или как фон темы — скрипт их не найдёт. Добавьте исключения вручную или используйте плагины с поддержкой таких сценариев.
- Проблемы с правами: команда может не удалить файлы, если у пользователя нет прав. Убедитесь, что WP-CLI запускается под правильным пользователем.
- Высокая нагрузка: при большом количестве медиафайлов скрипт может долго работать — оптимизируйте выборки и добавьте лимиты.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед удалением файлов.
- Используйте
wp_delete_attachmentс параметром$force_delete = true, чтобы удалять файлы физически, а не только из базы. - Для больших сайтов разбейте процесс на партии, чтобы избежать таймаутов.
- Комбинируйте с плагинами очистки, например Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpsetup.ru&utm_medium=article&utm_campaign=kak-avtomaticheski-udalit-starye-izobrazheniya-v-wordpress) для комплексной оптимизации.
Сравнение методов удаления неиспользуемых изображений
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-CLI скрипт | Автоматизация, гибкость, полный контроль | Требует навыков, доступ к серверу | Для опытных разработчиков и больших сайтов |
| Плагины очистки (например Media Cleaner) | Простота, визуальный интерфейс | Могут удалить важные файлы, нагрузка | Для администраторов без навыков программирования |
| Ручная проверка и удаление | Максимальная точность | Очень трудозатратно | Маленькие сайты с ограниченным количеством медиа |