В стандартной установке WordPress все загруженные файлы помещаются в папку wp-content/uploads. Однако бывают ситуации, когда требуется изменить этот путь — например, для лучшей организации структуры, разделения контента по различным типам или для работы с нестандартными требованиями хостинга. В этой статье разберём, как изменить пути загрузки без использования плагинов, напрямую через код.
Почему может понадобиться изменить пути загрузки файлов в WordPress
Чаще всего причины следующие:
- Упорядочивание медиафайлов: если на сайте много медиа, удобно разделить их по папкам, например, по типу содержимого (изображения, документы, видео).
- Безопасность: расположение файлов вне стандартных путей может затруднить прямой доступ к ним.
- Интеграция со сторонними сервисами: иногда нужно, чтобы файлы хранились в другой директории, например, для синхронизации с CDN или облачными хранилищами.
- Оптимизация резервного копирования: разделение папок позволяет точнее настраивать бэкапы.
Как WordPress определяет путь загрузки файлов
Путь к директории загрузки хранится в глобальной переменной $upload_dir, которую возвращает функция wp_upload_dir(). Она возвращает массив с ключами:
path— абсолютный путь к папке загрузки;url— URL для доступа к папке загрузки;subdir— подкаталог с датой (если включена организация по датам);basedir— основной путь без подкаталога;baseurl— базовый URL без подкаталога.
Для изменения путей нужно переопределить эти параметры, используя фильтр upload_dir.
Изменение пути и URL загрузки с помощью фильтра upload_dir
Добавим в файл functions.php вашей темы или в отдельный плагин следующий код:
add_filter('upload_dir', 'wpupload_custom_upload_dir');
function wpupload_custom_upload_dir($dirs) {
// Новая базовая директория для загрузок
$custom_dir = WP_CONTENT_DIR . '/custom_uploads';
// Новая базовая URL для загрузок
$custom_url = content_url('/custom_uploads');
// Пример: отключаем разбивку по датам
$dirs['path'] = $custom_dir;
$dirs['url'] = $custom_url;
$dirs['basedir'] = $custom_dir;
$dirs['baseurl'] = $custom_url;
$dirs['subdir'] = '';
return $dirs;
}В этом примере все файлы будут загружаться в папку wp-content/custom_uploads. Если папка не существует, её нужно создать с правами на запись.
Как добавить разбивку по месяцам в новом пути
Если хотите сохранить привычную структуру с папками по дате, можно так:
add_filter('upload_dir', 'wpupload_custom_upload_dir_with_subdir');
function wpupload_custom_upload_dir_with_subdir($dirs) {
$custom_dir = WP_CONTENT_DIR . '/custom_uploads';
$custom_url = content_url('/custom_uploads');
// Сохраняем подкаталог с датой
$dirs['path'] = $custom_dir . $dirs['subdir'];
$dirs['url'] = $custom_url . $dirs['subdir'];
$dirs['basedir'] = $custom_dir;
$dirs['baseurl'] = $custom_url;
return $dirs;
}Так файлы будут сохраняться в wp-content/custom_uploads/2024/06 и аналогично по URL.
Примеры более сложных сценариев изменения путей загрузки
Разделение по типам файлов
Можно направлять разные типы контента в отдельные папки. Например, изображения в images, документы в docs:
add_filter('upload_dir', 'wpupload_split_by_filetype');
function wpupload_split_by_filetype($dirs) {
if (!empty($_FILES['async-upload']['name'])) {
$filename = $_FILES['async-upload']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
switch (strtolower($ext)) {
case 'jpg':
case 'jpeg':
case 'png':
case 'gif':
$subdir = '/images';
break;
case 'pdf':
case 'doc':
case 'docx':
$subdir = '/docs';
break;
default:
$subdir = '/others';
}
$dirs['path'] = $dirs['basedir'] . $subdir . $dirs['subdir'];
$dirs['url'] = $dirs['baseurl'] . $subdir . $dirs['subdir'];
$dirs['subdir'] = $subdir . $dirs['subdir'];
}
return $dirs;
}В этом случае, если загружаемая картинка, она попадёт в /uploads/images/, а PDF — в /uploads/docs/.
Динамическое изменение пути в зависимости от пользователя
Если на сайте много пользователей и нужен раздельный доступ к файлам, можно сохранять загрузки в папки по ID пользователя:
add_filter('upload_dir', 'wpupload_user_based_dir');
function wpupload_user_based_dir($dirs) {
$user_id = get_current_user_id();
if ($user_id) {
$subdir = '/user_' . $user_id;
$dirs['path'] = $dirs['basedir'] . $subdir . $dirs['subdir'];
$dirs['url'] = $dirs['baseurl'] . $subdir . $dirs['subdir'];
$dirs['subdir'] = $subdir . $dirs['subdir'];
}
return $dirs;
}Это позволит каждому пользователю иметь собственную папку с загруженными файлами, упрощая управление правами доступа и организацию.
Советы по работе с изменёнными путями загрузки
Чтобы изменения прошли гладко, важно учитывать:
- Права доступа. Убедитесь, что сервер имеет права на запись в новые папки.
- Создание директорий. WordPress не всегда сам создаёт вложенные папки, может потребоваться создать их вручную или расширить функцию для автосоздания.
- Резервное копирование. Не забудьте включить новые папки в план резервного копирования.
- URL и доступ. Проверьте, что URL новых папок корректны и доступны для загрузки и отображения файлов.
- Совместимость с плагинами. Некоторые плагины могут жёстко работать с путями по умолчанию. Тестируйте функционал после внесения изменений.
Заключение
Изменение путей загрузки в WordPress даёт гибкость в организации хранения медиафайлов и может повысить безопасность и удобство работы с контентом. Использование фильтра upload_dir — самый простой и надежный способ сделать это без плагинов. Применяйте приведённые примеры, адаптируя их под свои задачи.
Для расширенных возможностей по управлению загрузками и оптимизации советуем ознакомиться с плагинами от WPSHOP, которые помогут автоматизировать многие процессы, связанные с загрузкой и хранением файлов.