Ограничить загрузку файлов 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;
}

Есть идеи?

Author: Ctyldsley, 2017-04-18

2 answers

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

current_user_can(‘administrator’)

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

if(!current_user_can(‘administrator’))

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

if( !current_user_can('administrator') ) { 
    //CODE HERE
}
 1
Author: Jack Johansson, 2019-04-30 13:30:14

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

Но на самом деле это не то, что не так с вашим кодом. Что действительно неправильно, так это то, что вы используете функцию, которая проверяет возможности пользователя и пытается проверить роль пользователя. Это работает из-за того, как 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 в роль администратора и проверить это.

 1
Author: Nathan Johnson, 2017-04-18 19:33:09