В WordPress с течением времени накапливается множество attachment файлов — изображений, документов и других медиа, которые уже не используются на сайте. Они занимают место на сервере и могут замедлять работу сайта, особенно при большом объёме медиа. В этой статье разберём, как автоматизировать процесс выявления и удаления таких неиспользуемых attachment файлов с помощью кода и практических инструментов.
Почему важно удалять неиспользуемые attachment файлы
Медиафайлы в WordPress хранятся в библиотеке, и при удалении постов или замене контента некоторые файлы остаются без привязки к записям. Они:
- Занимают дисковое пространство на сервере.
- Могут создавать избыточные бэкапы.
- Влияют на производительность, особенно при индексировании и сканировании файлов.
Регулярное удаление таких файлов помогает поддерживать чистоту сайта и экономить ресурсы.
Как определить неиспользуемые attachment файлы в WordPress
Attachment файл считается неиспользуемым, если он:
- Не привязан к каким-либо постам или страницам.
- Не вставлен в контент записей, виджетов, шорткодов или пользовательских полей.
Для точного определения нужно искать файлы, которые не имеют родительского поста и не упоминаются в базе данных.
Проверка привязки к родительскому посту
В таблице базы данных wp_posts записи attachment имеют тип attachment и поле post_parent, указывающее на ID связанного поста. Если post_parent равен нулю, файл не привязан к записи.
Поиск упоминаний в контенте
Даже если файл не привязан напрямую, он может использоваться в тексте. Нужно проверить таблицы wp_posts и wp_postmeta на упоминания URL или ID файла.
Пример функции для поиска неиспользуемых attachment файлов
Ниже пример функции с префиксом wpdetect_, которая собирает ID неиспользуемых attachment файлов по критериям:
function wpdetect_get_unused_attachments() {
global $wpdb;
// Получаем все attachment с post_parent = 0
$attachments = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_parent = 0");
$unused_attachments = [];
foreach ($attachments as $attachment_id) {
$file_url = wp_get_attachment_url($attachment_id);
if (!$file_url) {
continue; // файл не существует или ошибка
}
// Ищем упоминания в контенте
$count_in_posts = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
'%' . $wpdb->esc_like($file_url) . '%'
));
// Ищем в мета полях
$count_in_meta = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE meta_value LIKE %s",
'%' . $wpdb->esc_like($file_url) . '%'
));
if (intval($count_in_posts) === 0 && intval($count_in_meta) === 0) {
$unused_attachments[] = $attachment_id;
}
}
return $unused_attachments;
}
Эта функция возвращает массив ID attachment файлов, которые не привязаны к постам и не упоминаются в контенте и метаполях.
Автоматическое удаление неиспользуемых attachment файлов
Чтобы не только находить, но и удалять ненужные файлы, можно использовать функцию, которая удаляет attachment по ID и очищает базу:
function wpdetect_delete_unused_attachments() {
$unused_attachments = wpdetect_get_unused_attachments();
foreach ($unused_attachments as $attachment_id) {
wp_delete_attachment($attachment_id, true); // true – удалить физический файл
}
return count($unused_attachments);
}
Эту функцию можно запускать вручную или через WP-Cron для регулярной очистки.
Пример задания WP-Cron для еженедельной очистки
add_action('wpdetect_weekly_cleanup', 'wpdetect_delete_unused_attachments');
if (!wp_next_scheduled('wpdetect_weekly_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpdetect_weekly_cleanup');
}
Так вы настроите автоматический запуск удаления неиспользуемых attachment файлов каждую неделю.
Использование плагинов для упрощения задачи
Если вы не хотите писать код, существуют плагины, которые помогают найти и удалить неиспользуемые медиафайлы:
- Media Cleaner – анализирует библиотеку и находит неиспользуемые файлы.
- DNUI (Delete Not Used Image) – удаляет изображения, не используемые на сайте.
Однако при использовании плагинов будьте осторожны и делайте резервные копии, чтобы избежать случайной потери нужных файлов.
На сайте Clearfy есть инструменты для оптимизации и очистки WordPress, которые также помогут в решении похожих задач.
Рекомендации при автоматизации удаления attachment файлов
При автоматизации очистки важно соблюдать осторожность:
- Всегда делайте бэкап сайта и базы данных перед массовым удалением.
- Проверяйте результаты вручную, особенно при первом запуске.
- Настраивайте периодичность очистки в зависимости от активности сайта.
- Учитывайте, что некоторые файлы могут использоваться в нестандартных местах, например, в кастомных полях или сторонних плагинах.
Заключение
Автоматизация удаления неиспользуемых attachment файлов в WordPress — эффективный способ поддерживать чистоту и производительность сайта. С помощью приведённых функций и настроек WP-Cron вы можете настроить регулярную очистку без лишних усилий. Если вы предпочитаете готовые решения, обратите внимание на специализированные плагины и инструменты оптимизации, такие как Clearfy с wpshop.ru.