WordPress v 1.3.5

KDA Custom Upload Structure

Позволяет вынести медиафайлы за пределы wp-content/uploads и раскладывает их по типам записей, годам и месяцам. Гибкая структура, транслитерация имён, мультисайт и безопасный мигратор с сухим прогоном и откатом.

Скачать плагин

Версия 1.3.5. Обновлён 18.08.2026

Ссылки
Проверен на
WP 7.0.8
Требует
WP 5.8+
Требует
PHP 7.4+
Создан
3 месяца назад
Версии
1.3.5 1.3.4 1.3.3 ····

WordPress по умолчанию складывает все медиафайлы в wp-content/uploads с разбивкой по годам и месяцам. На небольших сайтах этого хватает, но по мере роста папка превращается в хаос: тысячи файлов разных типов свалены в одну корневую директорию. KDA Custom Upload Structure даёт администраторам контроль над тем, где и как хранятся медиафайлы.

Возможности

1. Пользовательская папка загрузки

Укажите относительный путь к любому каталогу вне wp-content/uploads — например, /assets/public/ или /media/. Папка создаётся автоматически при сохранении; в неё помещается index.php-заглушка (защита от просмотра каталога), права нормализуются до 0644. Запрещены пути внутри системных папок (wp-admin, wp-includes, wp-content/plugins, wp-content/themes) — в таких случаях используется безопасный путь по умолчанию.

2. Организация по типу записи

Файлы раскладываются по подпапкам с именами типов записей: assets/public/films/, assets/public/products/, а неприкреплённые — в настраиваемую папку «Другие».

3. Папки Год/месяц

Сохраняется привычная разбивка 2024/08/ внутри кастомной папки. Год и месяц берутся из post_date, поэтому точны даже при переносе записей между датами. Вместе с организацией по типу записи даёт структуру вида assets/public/films/2024/08/.

4. Транслитерация имён

Кириллические и другие нелатинские имена (например, Мой-Отчет-2024.pdf) превращаются в Moj-Otchet-2024.pdf: замена символов на латиницу, удаление небезопасных знаков, схлопывание повторных дефисов. Важно для совместимости с Linux-серверами и CDN, а также для публикации открытых ссылок на файлы.

5. Префикс ID записи

К имени файла можно добавлять ID записи: photo.jpg → 42-photo.jpg. Префикс ставится только при наличии у пользователя права edit_post — это блокирует злоупотребление через поддельный параметр post_id. По умолчанию выключено.

6. Инструмент миграции

Переход на новую структуру не требует ручной перезагрузки. Мигратор (отдельная вкладка) умеет: сухой прогон (показывает объём без фактического перемещения), пакетную миграцию с индикатором прогресса и автовозобновлением (без AJAX-таймаутов), обратную миграцию в wp-content/uploads с обновлением URL в контенте и postmeta, замену URL в сериализованных данных, повторный прогон для неудач, проверку свободного места и откат текущего пакета при ошибке. Перед запуском — обязательный бэкап сайта и БД.

7. Мультисайт

В сетях WordPress опция «Подпапка для каждого сайта» добавляет суффикс вида /blog-2, изолируя загрузки разных сайтов сети.

8. Отключение генерации размеров

Если нужны только оригиналы, плагин отключает создание миниатюр (thumbnail, medium, large) при загрузке — экономия места и ускорение.

Настройка

Все опции — на странице Настройки → Структура загрузки: путь к папке, организация по типу записи, папки год/месяц, транслитерация, префикс ID, отключение миниатюр, мультисайт и название папки «Другие». Там же — превью итоговой иерархии для тестовой записи. Перехват путей работает через фильтр upload_dir и активен только при включённом плагине, что гарантирует безопасный откат.

Безопасность

  • Каждая папка загрузки защищена index.php-заглушкой от просмотра через веб-сервер.
  • Права на загруженные файлы нормализуются до 0644 (исключает ошибки 403 Forbidden).
  • Все AJAX-запросы и действия миграции защищены nonce-проверками.
  • Префикс ID записи добавляется только при наличии у пользователя capability edit_post.
  • При деинсталляции (uninstall.php) полностью очищаются все сохранённые опции и транзиенты.

Технические детали

В основе — стандартный WordPress-фильтр:

add_filter( 'upload_dir', [ __CLASS__, 'filter_upload_dir' ], 10, 1 );

Функция filter_upload_dir() модифицирует массив $uploads (basedir, baseurl, path, url, subdir), поэтому wp_upload_dir() и wp_get_attachment_url() работают с новыми путями прозрачно. Мигратор использует WP_Filesystem API (с fallback на нативный rename()), обновляет записи в wp_posts (поля guid и _wp_attachment_metadata) и опционально заменяет URL в содержимом записей с учётом формата сериализации PHP.

Структура плагина:

Файл Назначение
kda-custom-upload-structure.php Главный класс: регистрация хуков, вычисление путей, трансформация имён, фильтр upload_dir.
includes/class-kda-cus-admin.php Страница настроек, регистрация опций, разметка полей, JS-интерфейс.
includes/class-kda-cus-migrator.php Мигратор: сканирование, пакетное перемещение, обновление БД, сухой прогон, откат.
uninstall.php Очистка данных при удалении плагина.

Компоненты строятся вокруг общего класса KDA_Upload_Structure, который инкапсулирует вычисление базового пути (compute_base) и используется и админкой, и мигратором — без дублирования кода.

Установка и первый запуск

  1. Установите плагин из репозитория WordPress или напрямую через админ-панель.
  2. Активируйте плагин.
  3. Откройте Настройки → Структура загрузки, задайте нужные опции и сохраните.
  4. При необходимости запустите миграцию существующих файлов на вкладке Миграция.

Заключение

KDA Custom Upload Structure — продуманный инструмент для администраторов и разработчиков, которым нужна гибкая организация медиафайлов. Он не навязывает конкретную структуру, а даёт набор связанных опций, из которых собирается конфигурация под проект. Безопасный мигратор с сухим прогоном и откатом снимает главный риск — повредить медиатеку при смене структуры. Поддержка мультисайта, транслитерация, отключение миниатюр и нормализация прав делают плагин универсальным решением для проектов любого масштаба.

Вопросы и ответы

Оставить комментарий

Имя видно всем. Сообщения проходят модерацию. Правила обсуждения.

Обычно отвечаю до 18:00 МСК

Нужна доработка или кастомный плагин?

Опишите задачу — обсудим реализацию.

Написать в Telegram Без автоответчика · пн–пт

Обсудить задачуОтвет в рабочий день

Написать