Если ваш сайт на WordPress работает уже длительное время, со временем в библиотеке медиа накапливаются множество файлов, которые больше не используются в записях, страницах или виджетах. Такие неиспользуемые медиа-файлы занимают место на сервере и могут замедлять работу сайта, особенно если хостинг ограничен по дисковому пространству. В этой статье разберём, как автоматически находить и удалять неиспользуемые медиа-файлы, используя плагины и собственные решения с примерами кода.
Почему важно удалять неиспользуемые медиа файлы в WordPress
С течением времени медиа-библиотека WordPress может разрастаться до тысячи и более изображений, видео и других файлов. При этом часть из них может быть удалена из контента, но физически оставаться на сервере. Это приводит к:
- Занятию лишнего места на диске, что особенно критично на ограниченном хостинге.
- Увеличению времени резервного копирования из-за большого объёма данных.
- Снижению скорости работы сайта при загрузке медиа-библиотеки в админке.
Поэтому регулярная очистка неиспользуемых файлов — важная задача для поддержания производительности и удобства работы с сайтом.
Варианты решения: плагины для удаления неиспользуемых медиа файлов
1. Media Cleaner
Один из самых популярных и мощных плагинов для поиска и удаления неиспользуемых медиа-файлов. Он сканирует базу данных и контент, сравнивает с файлами в uploads и показывает, какие файлы не используются.
Преимущества:
- Поиск неиспользуемых и дублирующихся файлов.
- Поддержка работы с плагинами, которые хранят данные вне стандартных записей.
- Возможность архивировать файлы перед удалением.
Установка:
Перейдите в админку WordPress → Плагины → Добавить новый, найдите "Media Cleaner" и установите.
Подробнее и скачать: Media Cleaner на WPSHOP
2. WP-Optimize
Хотя WP-Optimize в первую очередь известен как плагин для оптимизации базы данных и кеширования, в нём есть функция очистки медиа-библиотеки от неиспользуемых файлов.
Это удобный вариант, если вы уже используете WP-Optimize для других задач.
Как написать собственный скрипт для удаления неиспользуемых медиа-файлов в WordPress
Если вы хотите полностью контролировать процесс и не зависеть от сторонних плагинов, можно реализовать свою функцию для поиска и удаления медиа, которые не используются в контенте.
Основная идея: получить все вложения (attachment), проверить, используется ли ссылка на них в записях, страницах, мета-полях и удалить, если нет.
Пример кода для wpbloger.ru: функция поиска и удаления неиспользуемых вложений
function wpbloger_find_and_delete_unused_attachments() {
global $wpdb;
// Получаем все ID вложений
$attachments = get_posts(array(
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'inherit',
'fields' => 'ids',
));
$deleted = 0;
foreach ($attachments as $attachment_id) {
$url = wp_get_attachment_url($attachment_id);
// Ищем упоминание URL вложения в базе данных в постах
$like_url = '%' . $wpdb->esc_like($url) . '%';
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_content LIKE %s",
$like_url
));
// Проверяем наличие в мета-полях
$meta_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_value LIKE %s",
$like_url
));
if (!$count && !$meta_count) {
// Удаляем вложение без возможности восстановления
wp_delete_attachment($attachment_id, true);
$deleted++;
}
}
return $deleted;
}
Эту функцию можно запускать вручную из админки или через WP-CLI, а также через Cron для автоматизации.
Как добавить кнопку запуска функции в админ-панели
Для удобства можно создать страницу в админке с кнопкой, которая запускает очистку:
function wpbloger_register_media_cleanup_page() {
add_management_page(
'Очистка медиа',
'Очистка медиа',
'manage_options',
'wpbloger-media-cleanup',
'wpbloger_media_cleanup_page_html'
);
}
add_action('admin_menu', 'wpbloger_register_media_cleanup_page');
function wpbloger_media_cleanup_page_html() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_POST['wpbloger_cleanup'])) {
$deleted = wpbloger_find_and_delete_unused_attachments();
echo '<div class="updated notice">Удалено неиспользуемых файлов: ' . intval($deleted) . '</div>';
}
echo '<h1>Очистка неиспользуемых медиа файлов</h1>';
echo '<form method="post">';
echo '<p><input type="submit" name="wpbloger_cleanup" class="button button-primary" value="Запустить очистку" /></p>';
echo '</form>';
}
Рекомендации и меры предосторожности при удалении медиа
Удаление файлов — операция необратимая, особенно при использовании wp_delete_attachment($id, true), которая удаляет файл без помещения в корзину.
- Перед запуском очистки обязательно сделайте резервную копию сайта и базы данных.
- Сначала протестируйте поиск неиспользуемых файлов — выводите список найденных файлов, вместо удаления, чтобы проверить корректность работы.
- Если используете плагин Media Cleaner, используйте его функцию архивирования перед удалением.
- Обратите внимание, что некоторые плагины могут хранить ссылки на медиа вне стандартных полей — учтите это при автоматизации.
Дополнительно: автоматизация очистки через Cron
Для регулярного удаления неиспользуемых файлов можно настроить WP-Cron:
function wpbloger_schedule_media_cleanup() {
if (!wp_next_scheduled('wpbloger_daily_media_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpbloger_daily_media_cleanup');
}
}
add_action('wp', 'wpbloger_schedule_media_cleanup');
add_action('wpbloger_daily_media_cleanup', 'wpbloger_find_and_delete_unused_attachments');
Этот код запустит функцию очистки каждый день. Можно менять периодичность на 'weekly' или 'hourly' при необходимости.
Заключение по теме
Удаление неиспользуемых медиа-файлов — важная задача для оптимизации сайта на WordPress. Вы можете использовать готовые плагины, например Media Cleaner, либо реализовать собственные решения, что даст полный контроль над процессом. Главное — тщательно тестировать и всегда иметь резервные копии.