Ситуация типичная: сайт давно живёт, в /wp-content/uploads/ накопились старые картинки, а в медиабиблиотеке они продолжают мешать — поиск тормозит, редакторы видят мусор, а удалить файлы нельзя, потому что часть из них всё ещё используется в записях, виджетах или кастомных полях. В WordPress нет штатной кнопки «скрыть из медиабиблиотеки, но оставить на сервере», поэтому решение обычно строится вокруг фильтрации списка в админке или переноса части логики в отдельный статус/метку.
Когда это действительно нужно
Не путайте эту задачу с удалением неиспользуемых файлов. Здесь цель другая: оставить файл физически доступным для сайта, но убрать его из повседневной работы редакторов. Это полезно, если:
- в медиабиблиотеке много старых изображений после редизайна;
- часть файлов используется только в старых записях и трогать их рискованно;
- нужно скрыть служебные изображения, которые не должны попадать в выборку при вставке медиа;
- у сайта есть импорт из внешней системы, и в библиотеке смешаны рабочие и архивные файлы.
Диагностика проблемы: что именно мешает
Сначала проверьте, где именно возникает шум. Обычно проблема проявляется в одном из трёх мест: экран «Медиафайлы», выбор изображения в редакторе блоков и поиск по библиотеке. Если изображения не нужны только редакторам, но должны оставаться доступны по URL, удалять их нельзя. Если же они не используются нигде, это уже другая задача — чистка неиспользуемых файлов.
Что проверить перед изменениями
- Есть ли прямые ссылки на файл в контенте, шаблонах или ACF-полях.
- Используется ли изображение как миниатюра записи, фон секции или логотип.
- Есть ли у файла привязка к записи через
post_parent. - Нужно ли скрыть файл для всех ролей или только для редакторов.
Если вы не проверите эти точки, легко получить «чистую» медиабиблиотеку с битым контентом на фронтенде.
Рабочий подход: скрываем файлы по метке, а не удаляем их
Самый предсказуемый вариант — пометить изображения как архивные и фильтровать их в админке. Для этого можно использовать метаполе вложения и исключать такие файлы из запросов медиабиблиотеки.
Ниже пример: добавляем метку _hidden_from_library и скрываем такие вложения в админке. Файлы остаются на сервере и доступны по прямой ссылке.
<?php
add_action('add_attachment', function ($attachment_id) {
// Метку можно ставить вручную или через отдельный скрипт миграции.
// Здесь только пример структуры.
});
add_action('pre_get_posts', function (WP_Query $query) {
if (!is_admin() || !$query->is_main_query()) {
return;
}
global $pagenow;
if ($pagenow !== 'upload.php') {
return;
}
$meta_query = (array) $query->get('meta_query');
$meta_query[] = array(
'key' => '_hidden_from_library',
'compare' => 'NOT EXISTS',
);
$query->set('meta_query', $meta_query);
});
Этот вариант хорош тем, что не ломает фронтенд и не требует вмешательства в файлы. Но у него есть ограничение: в блоковом редакторе и в некоторых плагинах выбор медиа может использовать свои запросы, поэтому фильтр нужно тестировать именно в тех местах, где у вас реально выбирают изображения.
Если нужен более точный контроль: фильтрация по роли или типу файла
Иногда скрывать нужно не все архивные изображения, а только служебные: например, файлы, загруженные импортом, или картинки, которые не должны быть доступны авторам. Тогда удобнее фильтровать список по роли пользователя или по пользовательскому признаку.
<?php
add_filter('ajax_query_attachments_args', function ($query) {
if (!current_user_can('manage_options')) {
$query['meta_query'] = array(
array(
'key' => '_hidden_from_library',
'compare' => 'NOT EXISTS',
),
);
}
return $query;
});
Здесь администратор видит всё, а остальные пользователи — только обычные файлы. Это удобно, если редакторам не нужно работать с архивом, но техподдержке доступ нужен.
Сравнение вариантов
| Подход | Что делает | Плюсы | Минусы |
|---|---|---|---|
| Плагин для очистки медиабиблиотеки | Ищет и удаляет неиспользуемые файлы | Быстро, без кода | Риск удалить нужное, если контент хранится нестандартно |
| Скрытие по метке | Прячет выбранные вложения из списка | Безопасно, обратимо | Нужно один раз настроить метку и фильтр |
| Удаление файлов с сервера | Физически убирает изображения | Освобождает место | Легко сломать старые записи и шаблоны |
Пошаговое решение без потери файлов
Шаг 1. Отметьте изображения, которые нужно скрыть
Проще всего сделать это через отдельный скрипт миграции или вручную для небольшого числа файлов. Если у вас много вложений, можно пройтись по ним через WP-CLI или временный административный инструмент, который проставит метку нужным ID.
Шаг 2. Добавьте фильтр в админке
Используйте pre_get_posts для экрана upload.php и ajax_query_attachments_args для медиапикера. Так вы закроете оба сценария: список в библиотеке и выбор изображения в редакторе.
Шаг 3. Проверьте, что файлы не исчезли с фронтенда
После внедрения откройте несколько старых записей, где эти изображения уже используются. Если картинка отображается по прямой ссылке и в контенте, значит вы скрыли её только в админке, а не удалили физически.
Как проверить, что решение сработало
- Откройте
/wp-admin/upload.phpи убедитесь, что архивные файлы не показываются в списке. - В редакторе записи откройте медиабиблиотеку и проверьте, что скрытые изображения не попадают в выборку.
- Откройте старую запись на сайте и убедитесь, что картинка продолжает загружаться.
- Проверьте прямой URL файла в браузере: он должен открываться, если файл не удалён.
- Если используете кэш админки или плагин оптимизации, очистите его и повторите тест.
Частые ошибки и как их исправить
Файлы удалили вместо того, чтобы скрыть
Это самая дорогая ошибка. Если изображение использовалось в контенте, после удаления получите битые ссылки. Исправление только одно: восстановить файл из бэкапа и уже потом настроить скрытие.
Фильтр работает в библиотеке, но не работает в редакторе
Так бывает, если вы повесили логику только на pre_get_posts. Для медиапикера нужен отдельный фильтр ajax_query_attachments_args.
Скрыли слишком много файлов
Если в метаусловии ошиблись и исключили вложения без нужной проверки, в библиотеке пропадут и обычные изображения. Проверьте, что условие действительно ищет только метку архивности, а не любой метапараметр.
Не учли роли пользователей
Редакторам часто нужен урезанный список, а администраторам — полный. Если не разделить доступ, техподдержка начнёт искать «пропавшие» файлы там, где они просто скрыты фильтром.
Безопасность и производительность
Не храните логику скрытия в случайном сниппете без контроля версий. Лучше вынести её в mu-plugin или отдельный мини-плагин, чтобы не потерять при смене темы. Если файлов много, не делайте тяжёлые запросы по post_content на каждом открытии медиабиблиотеки — это быстро ударит по админке.
Если задача шире и вам нужно не только скрыть, но и навести порядок в дублях, служебных файлах и мусоре, имеет смысл посмотреть в сторону инструментов для технической чистки сайта. Например, у Clearfy Pro есть набор функций для удаления дублей и оптимизации служебных элементов: https://wpshop.ru/plugins/clearfy. Но даже с плагином важно сначала понять, что именно вы скрываете и почему.
Когда лучше не прятать, а удалять
Если изображение нигде не используется, не имеет прямых ссылок и не участвует в шаблонах, его можно удалять. Но перед этим стоит проверить не только записи, но и кастомные поля, ACF-группы, блоки в шаблонах и старые страницы, которые могли сохраниться в кэше. Скрытие — это управляемый промежуточный шаг. Удаление — уже финальная операция, и её лучше делать отдельно.
Если вам нужно, я могу сразу подготовить второй вариант статьи — про поиск и удаление неиспользуемых изображений в WordPress без риска сломать контент.