Как удалить все НЕИСПОЛЬЗУЕМЫЕ изображения из директории uploads?
Я пытаюсь очистить мои папки uploads, так как они начинают занимать слишком много места на сервере.
Я пробовал использовать плагины для достижения этой цели, такие как DNUI и Cleanup Images, но эти плагины либо неработоспособны, либо в случае с DNUI (который недавно обновился и работает) не дают именно тех результатов, которые мне нужны. Это связано с тем, что мой сайт использует WooCommerce и тему, которые используют изображения в других местах, а не только в записях или на страницах, например, в шапке, подвале и галереях. Похоже, что WooCommerce использует свой встроенный плагин Lightbox под названием Pretty Photo, откуда и загружаются изображения, которые DNUI помечает как "неиспользуемые".
Я понимаю, что это непростая задача, но я хотел бы узнать, может ли кто-нибудь указать мне правильное направление? Я не разработчик, поэтому, вероятно, мне даже не стоит писать здесь, но я могу разобраться со временем и при должном усердии. Я видел скрипты на этом сайте, которые дают те же результаты, что и плагин DNUI, но ничего, что учитывало бы другие способы использования изображений (если это вообще возможно?). Буду благодарен за любую помощь.

Удаление изображений с помощью плагина:
Вы можете использовать этот плагин, который просканирует вашу базу данных и проверит, используется ли изображение в каких-либо записях (в контенте, как миниатюра, в любых произвольных полях и т.д.) или в качестве фона...
Если изображение нигде не используется, плагин предложит его удалить. Вы получите список всех неиспользуемых изображений на сайте, которые можно безопасно удалить.
https://wordpress.org/plugins/dnui-delete-not-used-image-wordpress/
А также этот плагин, который всё ещё работает, несмотря на то, что устарел:
https://wordpress.org/plugins/wordpress-uploaded-files-cleaner/
Ручное удаление изображений:
Вы также можете вручную найти в медиатеке изображения, которые не прикреплены к записям и страницам.
Перейдите в медиатеку и нажмите на вкладку "Не прикрепленные" — это отобразит все изображения, которые могут использоваться в других разделах сайта или не использоваться вовсе.

Проблема с изображениями, которые не прикреплены ни к одному посту, заключается в том, что они могут использоваться в другом месте — например, если у вас есть произвольное поле, использующее загрузчик изображений на основе стандартного медиазагрузчика WordPress. В зависимости от того, как была закодирована тема, загруженное изображение не прикрепляется ни к одному посту (в вашей базе данных). Тем не менее, это валидная идея.

Cron/Планировщик задач и обход базы данных — ваши друзья
Для этого потребуется плагин, которому можно даже назначить интервал выполнения через wp_cron, что-то похожее на предложенное выше, но с дополнительной проверкой полей типа 'post_content' (вам нужно будет определить их в зависимости от вашей среды WordPress) на наличие URI/URL изображений. Это может быть крайне ресурсоемким и нагружать систему — на практике такой процесс достаточно запускать раз в день или неделю, если нет юридических или бизнес-причин делать это чаще.
Использование мастер-слейв конфигурации базы данных может значительно снизить нагрузку, но это уже выходит за рамки данного вопроса.

Я попробовал плагин Image Cleanup, и он действительно лучший, но всё же лучше сначала сделать резервную копию.

Вам потребуется просканировать папку wp-content/uploads
на наличие загруженных файлов, затем проверить базу данных на ссылки на эти файлы и, наконец, сопоставить их. То, что не удалось сопоставить, можно безопасно удалить.
Сканирование базы данных — это самая сложная часть. Большинство ссылок на файлы хранятся в Медиатеке, доступ к которой можно получить с помощью стандартных функций/API WordPress. Но что делать с файлами, которые были удалены из Медиатеки, но всё ещё упоминаются в записях? Или с файлами, на которые ссылаются другие плагины разными способами?
Я провел значительное количество тестов и выяснил, что все ссылки на файлы хранятся либо в формате обычного текста (т.е. просто ячейка таблицы, содержащая путь или URL файла), HTML-формате (т.е. в содержимом записи), в сериализованных данных или, наконец, в виде JSON-объектов. Вам придется просканировать всю базу данных и попытаться определить, какой формат используется в каждой ячейке. Конечно, могут быть и другие экзотические способы, которые некоторые плагины используют для хранения ссылок на свои файлы, но их можно обработать только в индивидуальном порядке.
В итоге я написал плагин, который автоматически выполняет все эти действия, так как он понадобился мне для некоторых сайтов клиентов, и назвал его Theia Upload Cleaner. Он хорошо зарекомендовал себя, но, конечно, перед использованием подобных инструментов всегда стоит делать резервную копию.

Хороший подход... Интересно, сталкивались ли вы с какими-либо проблемами при добавлении большего количества контента, плагинов и записей со временем...

Да, тут и там возникают проблемы. Например, для некоторых плагинов необходимо исключить определенные таблицы, которые могут значительно замедлить процесс. Мы стараемся автоматически исключать таблицы по определенным ключевым словам, таким как таблицы с "log" (журналами), но, конечно, это не охватывает все случаи.

Плагин Media Cleaner для WordPress достаточно хорош — https://wordpress.org/plugins/media-cleaner/
Мне нравится, что он поддерживает другие плагины, такие как Advanced Custom Fields (ACF), Divi Builder, Visual Composer и Elementor. (Только в платной версии)
