Если посмотреть, как в WordPress организовано хранение всех изображений, которые загружаются для постов и страниц, то вы увидите, что все изображения собраны в папки по годам и месяцам. Это стандартная настройка.
Да, конечно, Вы можете изменить порядок загрузки таких изображений в разделе Параметры — Медиафайлы сняв галочку у параметра «Помещать загруженные мной файлы в папки по месяцу и году».
Но что, если Вам необходимо реализовать сохранение определенных типов файлов загружаемых на сайт в какой-то особой папке!? Стандартными средствами решить этот вопрос, увы, Вам не удастся. Вам нужно будет прибегать либо к помощи плагинов, либо внедрять специальный код.
В этой статье мы рассмотрим вариант использования хука (специального предопределяющего программного кода) для сохранения недобрых фалов в заранее указанной папке.
Итак, чтобы система определяла тип файла и помещала его в определенную папку Вам необходимо добавить следующий код в файл `functions.php` вашей активной темы WordPress.
function handle_upload_prefilter($file)
{
add_filter('upload_dir', function ($path) use ($file) {
$use_default_dir = (isset($_REQUEST['post_id']) && $_REQUEST['post_id'] == 0) ? true : false;
if(!empty( $path['error']) || $use_default_dir)
return $path;
$extension = substr(strrchr($file["name"], '.'), 1);
switch(strtolower($extension))
{
case 'pdf':
case 'doc':
case 'docx':
case 'xls':
case 'xlsx':
case 'csv':
case 'txt':
$customdir = '/documents';
break;
case 'mp3':
case 'm4v':
case 'oga':
$customdir = '/music';
break;
case 'mp4':
case 'ogv':
case 'webm':
case 'mov':
case 'avi':
case 'mkv':
$customdir = '/video';
break;
default:
return $path;
break;
}
$path['path'] = str_replace($path['subdir'], '', $path['path']);
$path['url'] = str_replace($path['subdir'], '', $path['url']);
$path['subdir'] = $customdir;
$path['path'] .= $customdir;
$path['url'] .= $customdir;
return $path;
});
return $file;
}
add_filter('wp_handle_upload_prefilter', 'handle_upload_prefilter');
function handle_upload($fileinfo)
{
remove_filter('upload_dir', 'custom_upload_dir');
return $fileinfo;
}
add_filter('wp_handle_upload', 'handle_upload');
Где, в блоке `switch` мы разбираем, какое окончание после точки (расширение) было у файла при его загрузке и в зависимости от совпадений с параметром секции `case` - помещаем его в конкретную папку, название которой и определяем в `$customdir`.
В случае, если расширение загружаемого файла не совпало ни с одним из приведённых в коде, будет отработана секция `default`, которая вернет стандартный путь для сохранения файла настроенный в WordPress.
Важно отметить, что WordPress по-умолчанию запрещает загрузку некоторых типов файлов. Поэтому приводим код, который добавляет исключения на примере PDF-файлов:
function allow_mime_types($mime_types){
$mime_types['pdf'] = 'application/pdf';
return $mime_types;
}
add_filter('upload_mimes', 'allow_mime_types', 1, 1);
Таблицу популярных типов файлов Вы можете найти здесь.