В процессе эксплуатации сайта на WordPress медиа библиотека со временем разрастается, часто остаются неиспользуемые или устаревшие файлы — изображения, видео, документы. Они занимают место на сервере и могут замедлять работу сайта. В этой статье мы рассмотрим, как автоматизировать удаление старых медиа файлов, которые не используются в записях и страницах, с помощью PHP скрипта. Это решение поможет сэкономить место и поддерживать порядок в медиа библиотеке.
Почему важно удалять неиспользуемые медиа файлы
Многие пользователи WordPress просто загружают изображения и другие файлы, а после удаления постов или страниц забывают очистить медиа. Это приводит к следующим проблемам:
- Перенасыщение файловой системы и базы данных лишними объектами.
- Увеличение размера резервных копий и времени их создания.
- Потенциальное замедление работы сайта при больших объемах медиа.
- Риск хранения устаревшей, неактуальной информации.
Ручное удаление — долгий и утомительный процесс, особенно при большом количестве файлов. Автоматизация с помощью PHP решает эту проблему.
Как определить, какие медиа файлы не используются
Для начала нужно понять, что означает «неиспользуемый» файл. Обычно это файлы, которые загружены в библиотеку, но не вставлены в содержимое страниц, записей, или не назначены как миниатюры (featured images).
Основные способы проверки использования медиа файлов:
- Проверка на наличие ID вложения в контенте постов и страниц.
- Проверка поля
_thumbnail_idв метаданных постов. - Проверка связей с другими постами (например, вложения к странице).
В нашем скрипте мы реализуем поиск по содержимому и метаданным, чтобы надежно определить неиспользуемые объекты.
PHP скрипт для удаления неиспользуемых медиа файлов
Ниже пример функции wpfinder_delete_unused_media_files(), которую можно запустить один раз через wp-cli, cron или временно в шаблоне. Скрипт проверяет все вложения, ищет их использование и удаляет неиспользуемые.
function wpfinder_delete_unused_media_files() {
global $wpdb;
// Получаем все вложения (медиа)
$attachments = get_posts([
'post_type' => 'attachment',
'posts_per_page' => -1,
'post_status' => 'any',
'fields' => 'ids',
]);
$deleted_count = 0;
foreach ($attachments as $attachment_id) {
$used = false;
// Проверяем, используется ли как миниатюра
$thumbnail_query = $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND meta_value = %d LIMIT 1",
$attachment_id
));
if ($thumbnail_query) {
$used = true;
}
// Проверяем, связан ли вложение с постом (parent)
$parent_id = wp_get_post_parent_id($attachment_id);
if ($parent_id) {
$used = true;
}
// Проверяем вхождение ID вложения в контент всех постов.
if (!$used) {
$attachment_url = wp_get_attachment_url($attachment_id);
if ($attachment_url) {
$posts_with_attachment = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_content LIKE %s LIMIT 1",
'%' . $wpdb->esc_like($attachment_url) . '%'
));
if ($posts_with_attachment) {
$used = true;
}
}
}
// Если не найдено использование — удаляем вложение
if (!$used) {
wp_delete_attachment($attachment_id, true);
$deleted_count++;
}
}
return $deleted_count;
}Этот код:
- Выбирает все вложения.
- Проверяет, используется ли вложение как миниатюра, есть ли связь с родительским постом.
- Ищет вхождение URL вложения в контент постов.
- Если не используется, удаляет вложение без возможности восстановления (параметр
trueвwp_delete_attachment).
Как безопасно запустить скрипт удаления
Рекомендуется перед запуском сделать резервную копию сайта и базы данных. Для запуска можно:
- Запустить функцию через wp-cli: создать отдельный PHP-файл в корне сайта, подключить wp-load.php и вызвать функцию.
- Добавить вызов функции в шаблон (например, в
functions.php) с условием, чтобы запуск был однократным. - Использовать cron-задачу для периодического удаления.
Пример wp-cli команды:
php wp-cli.php --require=delete-unused-media.php eval "echo wpfinder_delete_unused_media_files();"Плагины для автоматического удаления неиспользуемых медиа
Если не хочется писать код, можно использовать готовые плагины. Однако внимательно проверяйте отзывы и делайте бэкапы.
- Media Cleaner — анализирует библиотеку и помогает удалять неиспользуемые файлы.
- Clearfy Pro — среди множества функций есть оптимизация и очистка медиа.
Использование плагинов удобно, если нужно больше автоматизации и визуального контроля.
Заключение
Регулярная очистка медиа библиотеки от неиспользуемых файлов — важный этап в сопровождении WordPress сайта. С помощью предложенного PHP скрипта можно быстро найти и удалить старые медиа, освобождая место и повышая производительность. Для более удобного управления можно подключить проверенные плагины, например, Clearfy Pro. Не забывайте делать резервные копии перед очисткой!