Intereting Posts
Как использовать тот же шаблон страницы, если статус публикации отличается от публикации? Вставьте все почтовые идентификаторы в новую таблицу базы данных $ wp_query, когда новый WP_Query Стандартная галерея WordPress – Можно открыть изображение на странице? Установить отображаемое имя из псевдонима с процессом регистрации Включение страницы настраиваемых параметров приводит к тому, что «Страницы» исчезают из меню панели инструментов Как разделить ссылки, сгенерированные в карту сайта xml, чтобы избежать превышения максимального времени выполнения на 30 секунд? Изображение по умолчанию для главной страницы при совместном использовании в социальных сетях Почему WP разрешает просмотр и элемент мультимедиа в качестве страницы Как разрешить пользователю вводить текст, запускать код python и возвращать результат? Установить ссылку $ options Как настроить условные обозначения в шаблонах страниц? Запрещенная локальная ошибка и создание ошибок базы данных WordPress 4.22 не создает миниатюры Использование условного оператора в functions.php

Пользовательские метабокс и поля для WordPress: изменение загрузки каталога на странице редактирования пользователя

Я уже опубликовал это в StackOverflow, но понял, что лучше разместить его здесь.

Я использую CMB-скрипт (Custom Meta Boxes and Fields для WordPress) для загрузки файлов для разных пользователей, у которых есть пользовательская роль cliente .

Я могу показать поля и заставить их работать (хотя они появляются только при редактировании пользователя, а не при его создании, но это для другого вопроса). Сейчас я пытаюсь загрузить файлы в разные папки для разных пользователей.

Вот код:

 // Here we add a new user role, "cliente" add_role( 'cliente', 'Cliente' ); add_filter('wp_handle_upload_prefilter', 'my_upload_prefilter'); add_filter('wp_handle_upload', 'my_upload_postfilter'); function my_upload_prefilter( $file ) { add_filter('upload_dir', 'custom_upload_dir'); return $file; } function my_upload_postfilter( $fileinfo ) { remove_filter('upload_dir', 'custom_upload_dir'); return $fileinfo; } function custom_upload_dir( $path ) { global $pagenow; // Check if we are on the user-edit.php page if ( $pagenow == 'user-edit.php' && isset($_GET['user_id']) ) { // Set the role we want to change the path for $role_to_check = 'cliente'; // Get a bunch of user info for later use $user_id = filter_var( $_GET['user_id'], FILTER_SANITIZE_NUMBER_INT ); $meta = get_user_meta($user_id); $roles = unserialize($meta['wp_capabilities'][0]); // If we are on the chosen role page, set the $customdir to first_name + last_name if ( !empty($roles[$role_to_check]) ) { $customdir = '/' . $meta['first_name'][0] . $meta['last_name'][0]; } } else { // Here we are not on the user-edit.php page. This is just a check to prove that WP is not recognizing the correct page, maybe because we are doing an Ajax call when this function is called. Confusing. $customdir = '/did-not-work'; } // If there is any error, just return the $path and abort the rest. if ( !empty( $path['error'] ) ) { return $path; } // Here we set the new $path with the $customdir set above $path['path'] = str_replace($path['subdir'], '', $path['path']); //remove default subdir (year/month) $path['url'] = str_replace($path['subdir'], '', $path['url']); $path['subdir'] = $customdir; $path['path'] .= $customdir; $path['url'] .= $customdir; return $path; } 

Из нескольких проверок, которые я выполнил, кажется, что мой код действительно извлекает идентификатор пользователя и данные, хранящиеся в db, но он не обнаруживает его при загрузке изображений. Возможно, это связано с тем, что мы загружаем изображения через Ajax или что-то в этом роде?

Чтобы быть ясным, я не хочу, чтобы загрузка основывалась на текущем зарегистрированном пользователе, но на пользователе я, как супер-администратор, редактирую с помощью страницы edit-user.php.

Любая помощь приветствуется.

Solutions Collecting From Web of "Пользовательские метабокс и поля для WordPress: изменение загрузки каталога на странице редактирования пользователя"

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

Сначала правильный код, затем объяснение:

 // Here we add a new user role, "cliente". add_role( 'cliente', 'Cliente' ); // These are the filters we need to add in order to modify the default upload path. add_filter('wp_handle_upload_prefilter', 'my_upload_prefilter'); add_filter('wp_handle_upload', 'my_upload_postfilter'); function my_upload_prefilter( $file ) { add_filter('upload_dir', 'custom_upload_dir'); return $file; } function my_upload_postfilter( $fileinfo ) { remove_filter('upload_dir', 'custom_upload_dir'); return $fileinfo; } function custom_upload_dir( $path ) { // When uploading, the file gets sent to upload_async.php, so we need to take the referral page in order to be able to get the user_id we need. We then take the query string, pass it through parse_str and store it in a $query_array. Took me a while to figure it out, but now it works like a charm. $actual_page = $_SERVER['HTTP_REFERER']; parse_str( parse_url($actual_page, PHP_URL_QUERY), $query_array ); // Check if we are uploading from the user-edit.php page. if ( strpos($actual_page, 'user-edit.php') ) { // Set the role we want to change the path for. $role_to_check = 'cliente'; // Get a bunch of user info for later use $user_id = filter_var( $query_array['user_id'], FILTER_SANITIZE_NUMBER_INT ); $meta = get_user_meta( $user_id ); $roles = unserialize( $meta['wp_capabilities'][0] ); // If we are on the chosen role page, set the $customdir to first_name + last_name if ( !empty($roles[$role_to_check]) ) { $customdir = '/docs/' . $meta['first_name'][0] . $meta['last_name'][0]; // If there is any error, just return the $path and abort the rest. if ( !empty( $path['error'] ) ) { return $path; } // Here we set the new $path with the $customdir set above $new_subdir = $customdir . $path['subdir']; $path['path'] = str_replace( $path['subdir'], $new_subdir, $path['path'] ); $path['url'] = str_replace( $path['subdir'], $new_subdir, $path['url'] ); $path['subdir'] = $new_subdir; return $path; } } else { // We are not uploading from user-edit.php, so go ahead as per default. return $path; } } 

Проблема заключалась в том, что при загрузке через Ajax $pagenow правильно хранит страницу async-upload.php , а не URL-адрес, в котором мы находимся. Мне просто нужно было получить реферальную страницу через php $_SERVER['HTTP_REFERER'] (пожалуйста, обратите внимание, что опечатка- referer существует из-за устаревшей опечатки в спецификации http, смешного материала).

Также обратите внимание, что спецификации PHP препятствуют использованию HTTP_REFERER потому что это может привести к неожиданным результатам на основе конфигураций сервера, но в этом случае я должен иметь полный контроль над сервером, поэтому это не должно быть проблемой. Если у вас возникнут какие-либо проблемы, я бы предложил проверить это.

Как только у меня есть правильный URL-адрес, я могу его разобрать и проверить, есть ли у user-edit.php , если мы хотим, получить user_id из строки запроса и перейти оттуда.

Мне потребовалось некоторое время, чтобы понять это, но в ретроспективе это было довольно легко.

Надеюсь, это поможет кому-то еще в будущем.