Изменить каталог загрузки на странице пользовательского плагина

Я пытаюсь изменить путь к моему каталогу uploads, когда на этой конкретной странице в моем настраиваемом плагине. Страница представляет собой стандартную страницу php, а не какую-либо конкретную страницу типа сообщения.

Я нашел множество статей, объясняющих этот процесс, и я вижу, как это будет работать, если это будет особый тип сообщений, но, видя, что примеры не работают должным образом.

URL-адрес моей пользовательской страницы выглядит следующим образом: http://localhost/custom-plugin/wp-admin/admin.php?page=custom-plugin-page&id=1 .

переменная $ _POST является динамической на основе элемента, который пользователь редактирует.

Я столкнулся со следующим и скорректировал его по моим потребностям:

 function edd_load_upload_filter() { global $pagenow; if ( ! empty( $_POST['page'] ) && $_POST['page'] == 'custom-plugin-page' && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) { add_filter( 'upload_dir', 'edd_set_upload_dir' ); } } add_action('admin_init', 'edd_load_upload_filter'); function edd_set_upload_dir($upload) { $upload['subdir'] = '/edd' . $upload['subdir']; $upload['path'] = $upload['basedir'] . $upload['subdir']; $upload['url'] = $upload['baseurl'] . $upload['subdir']; return $upload; } 

Но, как вы можете видеть, функция проверяет, является ли тип сообщения типом «загрузка».

Из того, что я могу сказать, переменная $ _POST не пуста при начальной загрузке страницы, но когда мода носителя открыта, она пуста. Поскольку он возвращается как пустой внутри медиа-мода, путь к каталогу загрузки не устанавливается должным образом. Если я удалю !empty( $_POST[ page'] ); проверьте, правильно ли настроен путь, но затем он настраивается по всему сайту, а не только на моей пользовательской странице.

Не уверен, почему в примерах в сети все используют переменную $ _POST или $ _REQUEST, но когда я использую ее, она пуста, поэтому моя функция никогда не срабатывает. Есть идеи?

Немного поработав над этим и проверив переменную GLOBALS для чего-нибудь полезного, похоже, что ссылочный URL-адрес внутри медиа-мода – это тот же URL-адрес, что и моя пользовательская страница плагина.

Используя это и немного разбив его, я смог подтвердить, что я нахожусь на соответствующей странице. Я уверен, что есть другие, более элегантные решения, но это то, что я смог придумать. Я тестировал и, похоже, работает нормально.

Вот мое окончательное решение:

  add_filter( 'admin_init' , 'check_if_we_should_change_upload_dir', 999 ); function check_if_we_should_change_upload_dir() { global $pagenow; $referrer = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : ''; if( $referrer != '' ) { $explode_1 = explode( 'page=' , $referrer ); if( isset( $explode_1[1] ) ) { $referring_page = explode( '&id=' , $explode_1[1] ); if( isset( $referring_page[0] ) && $referring_page[0] == 'custom-plugin-page' && ( 'async-upload.php' == $pagenow || 'media-upload.php' == $pagenow ) ) { add_filter( 'upload_dir', 'alter_the_upload_dir' ); } } } } function alter_the_upload_dir( $upload ) { $upload['subdir'] = '/custom-directory' . $upload['subdir']; $upload['path'] = $upload['basedir'] . $upload['subdir']; $upload['url'] = $upload['baseurl'] . $upload['subdir']; return $upload; } 

Если у кого-то есть лучшие решения для проверки, я все уши!

Evan

Спасибо EHerman за ваше решение. Моя упрощенная версия вашего скрипта будет напрямую использовать HTTP_REFERER в фильтрах загрузки:

 function my_custom_upload_dir($path) { if(isset( $_SERVER['HTTP_REFERER'] )) { //parse url into array $referrer = parse_url($_SERVER['HTTP_REFERER']); $queries; // take the query part and parse it into array parse_str($referrer['query'], $queries); // check for anything that was in the query string of the current screen // you can use what ever you see in the wp-admin url before the upload frame opens if( isset($queries['taxonomy']) ) { $mydir = '/taxonomy-files'; $path['subdir'] = $mydir; $path['path'] = $path['basedir'].$mydir; $path['url'] = $path['baseurl'].$mydir; } } return $path; //altered or not } 

И правильно использовать фильтр

 add_filter('wp_handle_upload_prefilter', 'my_upload_prefilter'); add_filter('wp_handle_upload', 'my_handle_upload'); function my_upload_prefilter( $file ) { add_filter('upload_dir', 'my_custom_upload_dir'); return $file; } function my_handle_upload( $fileinfo ) { remove_filter('upload_dir', 'my_custom_upload_dir'); return $fileinfo; }