В процессе эксплуатации WordPress-сайта медиафайлы (изображения, видео, документы) накапливаются, часто оставаясь неиспользуемыми. Это приводит к росту размера хранилища, замедлению резервного копирования и усложнению управления контентом. В этой статье мы подробно рассмотрим, как автоматизировать удаление старых и неиспользуемых медиафайлов с помощью собственного кода на PHP.
Почему важно удалять неиспользуемые медиафайлы
Накопление неактивных медиафайлов — типичная проблема, особенно для крупных проектов с частым обновлением контента. Основные причины, почему стоит удалять такие файлы:
- Экономия дискового пространства и оптимизация хостинга.
- Ускорение процессов резервного копирования и восстановления.
- Улучшение производительности при загрузке страниц, если не используются плагины, работающие с медиа.
- Упрощение администрирования и поддержания порядка в библиотеке.
Несмотря на то, что существуют плагины для этой задачи, например, Media Cleaner, автоматизация с помощью собственного кода даёт гибкость и возможность интеграции с другими процессами сайта.
Как определить, что медиафайл не используется
Ключевой момент — корректно выявить, какие файлы не используются на сайте. В WordPress медиафайлы хранятся в таблице wp_posts с типом attachment. Однако некоторые из них могут быть привязаны к записям, страницам, или вставлены в произвольный HTML-контент.
Основные подходы для определения «неиспользуемых» файлов:
- Проверка, связана ли запись attachment с родительским постом (
post_parent). - Поиск URL файла в содержимом записей, страниц, виджетов и метаданных.
- Игнорирование недавно загруженных файлов и файлов, использованных в последних публикациях.
Для автоматизации можно реализовать скрипт, который по расписанию будет искать такие файлы и удалять их, либо помещать в корзину.
Пример кода для поиска и удаления неиспользуемых медиафайлов
Ниже представлен пример функции wpguest_check_and_delete_unused_attachments(), которая:
- Получает все медиафайлы с типом
attachment. - Проверяет наличие связи с родительским постом.
- Ищет в базе упоминание файла в контенте.
- Удаляет файл, если он не используется.
function wpguest_check_and_delete_unused_attachments() {
global $wpdb;
// Получаем все вложения
$attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment'" );
foreach ( $attachments as $attachment ) {
// Проверяем наличие родителя
$parent_id = get_post_field( 'post_parent', $attachment->ID );
if ( $parent_id ) {
continue; // Используется
}
// Ищем в контенте упоминание файла
$file_url = esc_sql( $attachment->guid );
$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE '%" . $file_url . "%'" );
if ( $count == 0 ) {
// Удаляем вложение без корзины
wp_delete_attachment( $attachment->ID, true );
}
}
}
// Добавим вызов функции через WP-Cron, например, раз в неделю
add_action( 'wpguest_weekly_cleanup', 'wpguest_check_and_delete_unused_attachments' );
if ( ! wp_next_scheduled( 'wpguest_weekly_cleanup' ) ) {
wp_schedule_event( time(), 'weekly', 'wpguest_weekly_cleanup' );
}Этот код можно добавить в файл functions.php вашей темы или создать отдельный плагин. Он будет каждую неделю автоматически удалять неиспользуемые вложения.
Важные замечания по безопасности
Перед автоматическим удалением рекомендуется:
- Создать резервную копию сайта и базы данных.
- Внедрить логи удаления для возможности анализа.
- Добавить фильтр по дате — не удалять медиафайлы, загруженные недавно (например, за последние 30 дней), чтобы избежать случайного удаления.
Расширение функционала: интеграция с плагином WPRemark
Если на вашем сайте используется плагин WPRemark для управления отзывами и пользовательским контентом, можно дополнительно учитывать вложения, используемые в отзывах, чтобы не удалять их по ошибке.
Для этого в функцию удаления можно добавить проверку ссылок в метаполях, которые WPRemark может использовать для хранения вложенных файлов.
Практические советы для масштабирования и поддержки
Автоматическое удаление медиа — полезная практика, но требует контроля:
- Регулярно проверяйте отчёты о удалённых файлах.
- Тестируйте на тестовой среде перед запуском на бойовом сайте.
- При больших объёмах данных разбивайте процесс удаления на части, чтобы не перегружать сервер.
- Используйте WP-CLI для выполнения скрипта вручную при необходимости.
Например, для частичного удаления можно добавить ограничение выборки в SQL-запросе:
$attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_type = 'attachment' LIMIT 100" );Это позволит выполнять удаление по 100 файлов за раз.
Заключение
Автоматизация удаления старых медиафайлов в WordPress при помощи собственного кода позволяет держать сайт в чистоте и оптимизировать ресурсы. Важно тщательно реализовать проверку использования файлов и предусмотреть меры безопасности. В сочетании с плагинами, такими как WPRemark, этот подход становится ещё эффективнее для комплексного управления контентом.