В WordPress 3.8 появилась новая система загрузки медиа-файлов, состоящая из загрузчика и библиотеки. Эта система очень удобная и современная. Однако не все разработчики плагинов умеют правильно её использовать и потому игнорируют оную в своих плагинах. Такая ситуация сложилась, главным образом, потому, что нигде явным образом толком не описано как с нею обращаться. В этой короткой статье я попробую исправить сей вопиющий недочёт.
Основной и, пожалуй, главный вопрос – как изменить папку загрузки файлов для своего плагина? Существует два способа для выполнения этой задачи.
- Ручной
- Программный
Ручной способ – изменение (переопределение) переменной UPLOADS
define('UPLOADS', 'wp-content/myimages');
в файле конфигурации WordPress, нам не подходит априори, так как, во-первых, требует ручного вмешательства пользователя, а во-вторых, меняет путь к файлам загрузки на всё время существования заданной переменной.
Программный способ – действительно то, что нужно. Существует несколько вариантов использования этого способа, но все они базируются на использовании фильтра upload_dir и, фактически, являются различными интерпретациями одного способа. Я покажу наиболее простой из них.
Основным условием данного примера является то, что мы должны загружать файлы для нашего плагина в папку определённую нашим плагином, остальные файлы должны загружаться в папки заданные правилами WordPress.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$expected_url = admin_url('admin.php') . '?page=my-plugin-page'; $mu = strpos($_SERVER['HTTP_REFERER'], $expected_url); if($mu !== false) { add_filter( 'upload_dir', 'myUploadDir', 9999 ); } function myUploadDir( $param ) { $myDir = 'my-plugin-images'; $param['path'] = trailingslashit( $param['basedir'] ) . $myDir; $param['url'] = trailingslashit( $param['baseurl'] ) . $myDir; $param['subdir'] = '/' . $samProDir; return $param; } |
Для ООП:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function __construct() { ... $expected_url = admin_url('admin.php') . '?page=my-plugin-page'; $mu = strpos($_SERVER['HTTP_REFERER'], $expected_url); if($mu !== false) { add_filter( 'upload_dir', array( &$this, 'uploadDir' ), 9999 ); } ... } public function uploadDir( $param ) { $myDir = 'my-plugin-images'; $param['path'] = trailingslashit( $param['basedir'] ) . $myDir; $param['url'] = trailingslashit( $param['baseurl'] ) . $myDir; $param['subdir'] = '/' . $samProDir; return $param; } |
Разберём пример:
$expected_url – линк страницы нашего плагина.
$mu – проверяем является ли REFERER (страница с которой зашли) страницей нашего плагина. На первый взгляд это странно – ведь мы загружаем файл со страницы нашего плагина. Да это так. Но загрузка происходит с помощью AJAX-запроса и, следовательно, во второй копии WordPress на которую загрузчик зашёл со страницы нашего плагина. Если мы будем проверять текущую страницу, ничего не выйдет – загрузка пойдёт по правилам WordPress.
Далее сама проверка. Если ничего не проверять, все файлы будут загружаться в папку нашего плагина.
В фильтре мы определяем функцию перенаправления. В самой функции определяется папка нашего плагина и производится перенаправление.
Вот собственно и всё. Ничего сложного.
© 2015 – 2018, minimus. Все права защищены. При копировании и републикации статьи, ссылка на первоисточник обязательна.
Нет комментариев.