Зачем
При удалении записи WordPress оставляет её картинки и файлы в медиатеке. Со временем папка uploads разрастается файлами, которые никто не показывает. SmartDelete удаляет вложения вместе с записью — но только те, что больше нигде не используются.
Возможности
- Удаление медиафайлов вместе с записью.
- Проверка использования перед удалением: файл, на который ссылается другая запись, остаётся.
- Поиск осиротевших файлов в медиатеке.
- Предпросмотр: видно, что именно будет удалено.
- Журнал удалений и настройки по типам записей.
Как работает плагин
WordPress при удалении записи оставляет её картинки и файлы в медиатеке. SmartDelete удаляет эти файлы вместе с записью. Перед удалением плагин проверяет каждый файл. Если файл нужен где-то ещё, плагин его оставляет.
Плагин работает только с типами записей, которые вы отметили в настройках. Пока ни один тип не отмечен, плагин ничего не удаляет.
Когда срабатывает удаление
Плагин подключается к хуку before_delete_post. WordPress вызывает его при окончательном удалении записи. Поэтому:
- перемещение записи в корзину файлы не трогает;
- удаление из корзины кнопкой «Удалить навсегда» или «Очистить корзину» запускает плагин;
- автоматическая очистка корзины по сроку
EMPTY_TRASH_DAYSтоже запускает плагин; - любой вызов
wp_delete_post()с окончательным удалением запускает плагин: из кода темы, другого плагина, WP-CLI или REST API.
Плагин пропускает:
- удаление самих вложений (тип
attachment); - записи тех типов, которые не отмечены в настройках;
- удаление через REST-маршруты, которые начинаются с
1c/. Так плагин не мешает обмену с учётной системой, который пересоздаёт товары; - записи, для которых фильтр
smart_delete_enabledвернулfalse(см. раздел «Для разработчиков»).
Какие файлы плагин считает файлами записи
Плагин собирает вложения из трёх источников:
- Прикреплённые файлы. Вложения, у которых родителем указана удаляемая запись. Такие файлы WordPress прикрепляет сам, когда вы загружаете их прямо в редакторе записи.
- Миниатюра записи. Файл из поля «Изображение записи» (мета-поле
_thumbnail_id). - Числовые мета-поля записи. Плагин берёт все мета-поля записи, где значение состоит только из цифр, и оставляет те числа, которые совпадают с номером (ID) существующего вложения. Так находятся поля ACF типа «Изображение» и «Файл», если они хранят ID, в том числе подполя повторителей и гибкого содержимого. Служебные поля
_edit_lockи_edit_lastплагин не смотрит.
Плагин не собирает:
- картинки, вставленные в текст записи ссылкой, если они не прикреплены к этой записи;
- файлы из галерей ACF и других полей, которые хранят несколько ID одним списком (сериализованным массивом);
- файлы из шорткода
, если они не прикреплены к записи; - поля, которые хранят адрес файла вместо его ID.
Как плагин решает, удалять файл или нет
Каждый найденный файл проходит три проверки по порядку. Первая сработавшая проверка оставляет файл на месте.
- Исключение по типу файла. Если тип файла отмечен в разделе «Исключения по типу файла», файл остаётся. Причина в журнале: «исключён по типу файла».
- Защита популярных файлов. Если порог больше нуля и файл встречается в стольких местах или больше, файл остаётся. Причина: «популярный файл (защита по порогу)».
- Использование в других местах. Если файл нужен другой записи, он остаётся. Причина: «используется в других местах».
Файл, который прошёл все проверки, плагин удаляет функцией wp_delete_attachment() окончательно: вместе с записью в медиатеке, файлом на диске и всеми нарезанными размерами. В корзину медиатеки файл не попадает.
Где плагин ищет использование файла
Две проверки работают всегда:
- Миниатюра другой записи. Файл указан в поле
_thumbnail_idу любой другой записи, включая записи в корзине. - Прикреплён к другой записи. Родителем вложения указана другая запись.
Три проверки включаются в настройках:
| Настройка | Что проверяет | Как ищет |
|---|---|---|
Содержимое записей post_content |
Текст всех записей, кроме удаляемой, вложений и записей в корзине. Ревизии и черновики тоже учитываются. | Ищет в тексте путь к исходному файлу, например /wp-content/uploads/2025/03/photo.jpg. |
Мета-поля postmeta (ACF и др.) |
Мета-поля всех записей, кроме удаляемой. | Ищет поле, значение которого точно равно ID вложения. |
Опции сайта wp_options (виджеты, Customizer) |
Все опции сайта, кроме настроек и журнала самого плагина. | Ищет в значении путь к файлу или ID вложения в двойных кавычках, как его хранят сериализованные массивы. Проверка медленнее остальных. |
Плагин не проверяет мета-поля рубрик и меток (termmeta), мета-поля пользователей (usermeta) и сторонние таблицы плагинов.
Как считается порог популярности
Порог задаётся в разделе «Защита популярных файлов». Плагин складывает:
- 1, если файл прикреплён к какой-либо записи;
- число записей, у которых файл стоит миниатюрой;
- число записей вне корзины, в тексте которых встречается путь к файлу;
- число мета-полей, значение которых равно ID файла (кроме миниатюр).
Удаляемая запись входит в этот счёт. Опции сайта в счёт не входят. Счёт не зависит от переключателей «Где проверять использование файла».
Пример: при пороге 3 файл, который прикреплён к записи и стоит миниатюрой у двух других записей, получит счёт 3 и останется на месте. При пороге 1 почти любой файл записи окажется «популярным», и плагин перестанет удалять файлы.
Настройки
Страница плагина находится в меню Настройки → SmartDelete. Открыть её может пользователь с правом manage_options (обычно администратор). На странице три вкладки: «Настройки», «Медиасироты» и «Журнал».
Вкладка «Настройки» состоит из пяти блоков. Изменения применяются после нажатия кнопки «Сохранить настройки».
Отслеживаемые типы записей
Список всех публичных типов записей сайта, кроме вложений. Рядом с названием типа стоит его системное имя, например post или page. Плагин удаляет файлы только у записей отмеченных типов.
По умолчанию ничего не отмечено, и плагин ничего не удаляет.
Исключения по типу файла
Файлы отмеченных типов плагин никогда не удаляет автоматически. Доступны десять типов:
| Название в настройках | MIME-тип |
|---|---|
| JPEG-изображения | image/jpeg |
| PNG-изображения | image/png |
| GIF-изображения | image/gif |
| WebP-изображения | image/webp |
| SVG-изображения | image/svg+xml |
| PDF-документы | application/pdf |
| Видео MP4 | video/mp4 |
| Видео WebM | video/webm |
| Аудио MP3 | audio/mpeg |
| ZIP-архивы | application/zip |
По умолчанию исключений нет. Другие типы файлов (например, документы Word) исключить нельзя.
Где проверять использование файла
Три переключателя из таблицы выше:
- «Содержимое записей
post_content»; - «Мета-поля
postmeta(ACF и др.)»; - «Опции сайта
wp_options(виджеты, Customizer)».
По умолчанию проверка содержимого записей и проверка мета-полей включены, проверка опций сайта выключена. Форма показывает эти значения ещё до первого сохранения. Мы советуем держать включёнными первые две проверки.
Защита популярных файлов
Поле «Порог использований» принимает число от 0 до 999. Если файл встречается в стольких местах или больше, плагин его не удаляет, даже когда удаляется запись-владелец. Значение 0 выключает защиту. По умолчанию стоит 0.
Когда порог больше нуля, под полем появляется подсказка с текущим значением.
Режим работы
- Dry Run (тестовый режим). Автоматическое удаление файлов не происходит. Плагин проходит все проверки и пишет в журнал, какие файлы он удалил бы. Записи в журнале получают пометку «dry run». Режим действует и при удалении через окно предпросмотра. Сами записи в тестовом режиме удаляются как обычно, плагин оставляет только их файлы. По умолчанию выключен.
- Вести журнал удалений (последние 200 записей). Включает журнал. По умолчанию включён.
Предпросмотр перед удалением
Плагин показывает, какие файлы он удалит, до того как вы удалите запись. Предпросмотр работает в списке записей (экран edit.php) для отслеживаемых типов.
Когда открывается окно
- Вы нажимаете ссылку «Удалить навсегда» у одной записи в списке.
- Вы выбираете в списке несколько записей и применяете массовое действие «Удалить навсегда».
Перемещение в корзину и кнопка «Очистить корзину» окно не открывают. В этих случаях плагин работает в обычном автоматическом режиме.
Что показывает окно
Окно называется «Файлы которые будут удалены». Для каждой записи в нём есть:
- заголовок записи;
- раздел «Будет удалено» с числом файлов, миниатюрами картинок и именами файлов;
- раздел «Будет пропущено» с именами файлов и причиной пропуска;
- сообщение «Медиафайлов для удаления нет.», если у записи нет подходящих вложений;
- предупреждение «⚠ Dry Run активен — файлы реально удалены не будут», если включён тестовый режим.
Плагин проверяет вложения порциями по 15 штук и показывает счётчик «N / M вложений проверено». При массовом удалении наверху окна виден общий счётчик «Анализ N / M». Кнопка «Подтвердить удаление» становится активной, когда проверка всех записей закончена.
Что происходит после подтверждения
Кнопка «Подтвердить удаление» запускает удаление с полосой прогресса. Плагин обрабатывает файлы из раздела «Будет удалено» порциями по 10 штук. С каждым файлом он делает следующее:
- проверяет, что у пользователя есть право удалить этот файл (
delete_post). Файлы без права плагин не трогает; - проверяет файл ещё раз по тем же правилам, что и при предпросмотре. Если файл начал использоваться где-то ещё, пока окно было открыто, плагин его оставляет и отмечает как пропущенный;
- удаляет файл окончательно. В режиме Dry Run файл остаётся на месте, плагин только отмечает его как удалённый для журнала.
Затем плагин пишет одну строку в журнал и окончательно удаляет саму запись. Запись удаляется и в режиме Dry Run, так же как при обычном удалении. После завершения появляется сообщение «Удалено N записей. Обновление страницы…», и страница перезагружается.
Кнопка «Отмена», крестик, клавиша Esc или щелчок по фону закрывают окно. Запись и файлы при этом остаются на месте.
Особенности окна предпросмотра
- Окно учитывает фильтр
smart_delete_enabled. Если фильтр выключил плагин для записи, окно не предлагает удалять её файлы. - Для работы окна пользователю нужно право
delete_posts.
Медиасироты
Сироты это файлы в медиатеке, которые не прикреплены ни к одной записи и нигде не используются. Их можно найти и удалить на вкладке «Медиасироты». Вкладка доступна пользователям с правом manage_options.
Как запустить поиск
Нажмите кнопку «Сканировать». На большой медиатеке поиск занимает несколько секунд.
Что плагин считает сиротой
Плагин берёт 500 самых новых вложений без родительской записи. Каждое из них он проверяет теми же правилами, что и при удалении записи:
- файл не стоит миниатюрой ни у одной записи;
- файл не встречается в тексте записей, если включена проверка содержимого;
- ID файла не записан ни в одном мета-поле, если включена проверка мета-полей;
- файл не встречается в опциях сайта, если включена проверка опций.
Исключения по типу файла и порог популярности при поиске сирот не действуют. Файлы на диске, у которых нет записи в медиатеке, плагин не ищет.
Что можно сделать с найденными файлами
Плагин показывает найденные файлы сеткой. У каждого файла видны миниатюра или значок типа, имя файла, MIME-тип, размер и дата загрузки. Кнопка со стрелкой «↗» открывает файл в медиатеке в новой вкладке.
- Отметьте нужные файлы флажками или отметьте «Выбрать все». Рядом с этим флажком плагин показывает число файлов и их общий размер.
- Нажмите «Удалить выбранные (N)» и подтвердите действие в диалоге.
Перед удалением плагин ещё раз проверяет каждый файл. Если файл успел начать использоваться, плагин его не удаляет. Удалённые файлы исчезают из сетки. Удаление окончательное, файлы не попадают в корзину. Удаление сирот в журнал не пишется.
Поиск проверяет только 500 самых новых неприкреплённых файлов. Если медиатека больше, удалите найденные сироты и запустите поиск снова.
Журнал
Журнал находится на вкладке «Журнал» страницы Настройки → SmartDelete. Число записей в журнале видно на ярлыке вкладки.
Плагин добавляет запись в журнал при каждом удалении записи отслеживаемого типа: автоматическом и через окно предпросмотра. Одной удалённой записи соответствует одна строка журнала. Для окна в строку попадает итог повторной проверки при подтверждении. Каждая строка содержит:
- заголовок и ID удалённой записи;
- дату и время удаления;
- пометку «dry run», если работал тестовый режим;
- раздел «Удалено (N)» со списком имён файлов и их ID;
- раздел «Пропущено (N)» со списком файлов и причиной пропуска;
- сообщение «Вложений не найдено.», если у записи не было вложений.
Журнал хранит последние 200 записей, новые сверху. Кнопка «Очистить журнал» удаляет все записи после подтверждения.
Удаление сирот в журнал не пишется.
Для разработчиков
Фильтр smart_delete_enabled
Фильтр отключает плагин для отдельной записи. Плагин вызывает его перед обработкой каждой удаляемой записи. Если фильтр вернул false, плагин не трогает файлы этой записи и не пишет её в журнал.
Параметры:
$enabled(bool): по умолчаниюtrue;$post_id(int): ID удаляемой записи;$post(WP_Post): объект записи.
Пример: не удалять файлы у записей с мета-полем keep_media.
add_filter('smart_delete_enabled', function ($enabled, $post_id, $post) {
if (get_post_meta($post_id, 'keep_media', true)) {
return false;
}
return $enabled;
}, 10, 3);
Фильтр действует и при автоматическом удалении, и в окне предпросмотра.
Других хуков и фильтров у плагина нет.
Где плагин хранит данные
smart_delete_settings: опция с настройками;smart_delete_log: опция с журналом, без автозагрузки.
При удалении плагина эти опции остаются в базе.
Ограничения
- Плагин не удаляет файлы при перемещении записи в корзину. Он ждёт окончательного удаления.
- Удалённые файлы нельзя восстановить средствами WordPress.
- Проверка текста записей ищет путь к исходному файлу. Если в тексте другой записи стоит только уменьшенная копия, например
photo-300x200.jpg, плагин не увидит эту связь. - Проверка мета-полей ищет точное совпадение с ID. Галереи ACF и другие поля со списком ID файл не защищают.
- Ревизии участвуют в проверке текста. Ревизии удаляемой записи на момент проверки ещё существуют. Поэтому картинка, вставленная в текст удаляемой записи, может попасть в пропущенные с причиной «используется в других местах».
- Плагин считает файлом записи любое числовое мета-значение, которое совпало с ID вложения. Такой файл всё равно проходит все проверки перед удалением.
- Плагин не проверяет мета-поля рубрик и пользователей, а также таблицы сторонних плагинов. Файл, который используется только там, плагин считает свободным.
- Поиск сирот за один раз проверяет только 500 самых новых неприкреплённых файлов.
- Исключать можно только десять типов файлов из списка в настройках.
Советы по безопасному использованию
- Сделайте резервную копию базы данных и папки
uploadsперед первым использованием. Плагин удаляет файлы окончательно. - Начните с режима Dry Run. Удалите несколько тестовых записей. Проверьте в журнале, какие файлы плагин удалил бы и какие пропустил. Учтите, что сами записи в этом режиме удаляются.
- Включите проверку опций сайта, если картинки стоят в виджетах, настройках темы или на страницах опций.
- Если на сайте есть общие файлы (логотипы, баннеры, значки), задайте порог популярности или исключите их тип.
- Перед удалением сирот откройте несколько файлов кнопкой «↗» и убедитесь, что они действительно не нужны. Плагин не видит использование в таблицах сторонних плагинов и в файлах темы.
Требования
- WordPress 6.0 или новее. Плагин проверен на версии 6.8.
- PHP 8.1 или новее.
- Права администратора (
manage_options) для настройки плагина.
Установка
- Скачайте архив плагина
smart-delete.zip. - В админке откройте Плагины → Добавить новый.
- Нажмите Загрузить плагин, выберите архив и нажмите Установить.
- После установки нажмите Активировать плагин.
Можно установить плагин и вручную. Распакуйте архив и скопируйте папку smart-delete в wp-content/plugins/. Затем активируйте плагин на странице Плагины.
Первые шаги после активации
Сразу после активации плагин ничего не удаляет. Сначала его нужно настроить.
- Сделайте резервную копию базы данных и папки
wp-content/uploads. Плагин удаляет файлы окончательно. - Откройте Настройки → SmartDelete.
- В блоке «Отслеживаемые типы записей» отметьте типы, у которых плагин будет удалять файлы.
- В блоке «Где проверять использование файла» проверьте флажки. По умолчанию отмечены «Содержимое записей» и «Мета-поля». Если картинки стоят в виджетах или настройках темы, отметьте и «Опции сайта».
- В блоке «Режим работы» отметьте «Dry Run (тестовый режим)». Флажок «Вести журнал удалений» отмечен по умолчанию, оставьте его.
- При необходимости отметьте типы файлов в блоке «Исключения по типу файла» и задайте «Порог использований».
- Нажмите «Сохранить настройки».
- Удалите несколько тестовых записей навсегда: из корзины или через окно предпросмотра. Записи удалятся, а их файлы останутся. Откройте вкладку «Журнал» и проверьте, какие файлы плагин удалил бы.
- Если результат вас устраивает, снимите флажок «Dry Run (тестовый режим)» и сохраните настройки.
Обновления
Новые версии плагина приходят в админку сайта сами. Когда выходит обновление, оно появляется на странице Плагины рядом с SmartDelete. Нажмите кнопку обновления, и WordPress установит новую версию. Настройки и журнал при обновлении сохраняются.
-
v1.3.1 последняя
Новое 2
- Удаление через окно предпросмотра записывается в журнал.
- Перед удалением из окна файл проверяется ещё раз: если он начал использоваться где-то ещё, он остаётся.
Исправлено 4
- Окно предпросмотра соблюдает Dry Run: раньше кнопка «Подтвердить удаление» удаляла файлы, хотя окно обещало обратное.
- Окно удаляет только те файлы, на удаление которых у пользователя есть права.
- Фильтр
smart_delete_enabledдействует и в окне предпросмотра. - Значения по умолчанию одинаковы в форме и в работе: до первого сохранения проверки содержимого и мета-полей и журнал включены, и форма это показывает.
-
v1.3.0
Новое 1
- Обновления приходят в админку сайта с alekseychikun.ru: новая версия появляется в списке плагинов и ставится одной кнопкой.