Ограничить загрузку файлов типа WordPress по типу пользователя

Я хочу ограничить всех пользователей (кроме админов) только возможностью загружать изображения, например, JPG и PNG, разрешенные для всех пользователей, но по-прежнему разрешать администраторам загружать pdf-файлы и т. Д. (Или даже лучше было бы запрещать загрузку незарегистрированных пользователей ничего, кроме JPG и PNG!)

Я пробовал следующий код functions.php, но он все еще, кажется, запрещает администраторам загружать PDF-файлы:

add_filter('upload_mimes','restict_mime'); function restict_mime($mimes) { if(!current_user_can('administrator')){ $mimes = array( 'jpg|jpeg|jpe' => 'image/jpeg', 'png' => 'image/png', ); } return $mimes; } 

Есть идеи?

Solutions Collecting From Web of "Ограничить загрузку файлов типа WordPress по типу пользователя"

В вашем условном выражении есть синтаксическая ошибка:

current_user_can('administrator')

Входное значение обернуто в ' ' , которое должно быть обернуто в ' ' вместо этого. Прямо сейчас, поскольку 'administrator' является ни ролью, ни возможностями, вышесказанное всегда возвращает ложное значение, поэтому

if(!current_user_can('administrator'))

всегда будет возвращать true , что ограничивает тип mime для всех, включая администраторов. Правильная форма:

if(!current_user_can('administrator')) { //CODE HERE }

Причина, по которой ваш код не работал, заключается в том, что в вашем коде есть опечатка. Этот код действительно вызывает ошибку. Вы можете включить режим отладки, чтобы увидеть ошибку.

Но на самом деле это не так, как с кодом. Что действительно неправильно, так это то, что вы используете функцию, которая проверяет возможности пользователя и пытается проверить роль пользователя. Это работает из-за того, как WordPress обрабатывает роли и возможности, но это не правильный способ проверить роль пользователя.

Фактически, использование роли пользователя в current_user_can() скорее всего вызовет _doing_it_wrong() в ближайшем будущем. См. # 38653. Триггер делает это неправильно при проверке имени роли в качестве возможности . Использование current_user_can() для проверки роли пользователя было неправильным в течение очень долгого времени. См. Эту статью за 2006 год. Как проверить, является ли пользователь WordPress «администратором» , ведущим разработчиком WordPress Марком Жакитом

Вместо роли вы должны использовать возможность этой функции.

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

 add_filter( 'upload_mimes', 'wpse_263936_upload_mimes' ); function wpse_263936_upload_mimes( $mimes ) { if( ! in_array( 'administrator', wp_get_current_user()->roles ) ) { $mimes = array( 'jpg|jpeg|jpe' => 'image/jpeg', 'png' => 'image/png', ); } return $mimes; } 

Если вы хотите продолжить использование current_user_can() , вы должны проверить такие возможности, как promote_users или manage_options который по умолчанию применяется только к роли администратора.

 add_filter( 'upload_mimes', 'wpse_263936_upload_mimes' ); function wpse_263936_upload_mimes( $mimes ) { if( ! current_user_can( 'promote_users' ) ) { $mimes = array( 'jpg|jpeg|jpe' => 'image/jpeg', 'png' => 'image/png', ); } return $mimes; } 

Или вы даже можете определить константу ALLOW_UNFILTERED_UPLOADS в своем wp-config.php и добавить ALLOW_UNFILTERED_UPLOADS к роли администратора и проверить это.