Ограничить загрузку файлов 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;
}
Есть идеи?
2 answers
В вашем условном выражении есть синтаксическая ошибка:
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
и добавить возможность unfiltered_upload
в роль администратора и проверить это.