web-dev-qa-db-fra.com

Restreindre les téléchargements de type de fichier Wordpress par type d'utilisateur

Je cherche à restreindre tous les utilisateurs (autres que les administrateurs) pour pouvoir uniquement télécharger des images, par exemple, les JPG et les PNG autorisés pour tous les utilisateurs, tout en autorisant les administrateurs à télécharger des PDF, etc. autre chose que JPG et PNG!)

J'ai essayé le code functions.php suivant, mais il semble toujours empêcher les administrateurs de télécharger des fichiers 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;
}

Des idées?

2
Ctyldsley

Il y a une erreur de syntaxe dans votre conditionnel:

current_user_can(‘administrator’)

La valeur d'entrée est encapsulée dans ‘ ’, qui devrait plutôt être encapsulée dans ' '. À l'heure actuelle, étant donné que ‘administrator’ n'est ni un rôle ni une capacité, l'élément ci-dessus renvoie toujours une valeur fausse. Par conséquent,

if(!current_user_can(‘administrator’))

retournera toujours true, ce qui restreindra le type mime pour tout le monde, administrateurs compris. La forme correcte sera:

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

La raison pour laquelle votre code ne fonctionnait pas, c'est parce que vous avez une erreur typographique dans votre code. Ce code déclenche en réalité une erreur. Vous pouvez activer le mode debug pour voir l'erreur.

Mais ce n'est pas vraiment ce qui ne va pas avec votre code. Ce qui ne va vraiment pas, c'est que vous utilisez une fonction qui vérifie une capacité user et essayez de vérifier le rôle d'un utilisateur. Cela fonctionne à cause de la manière dont WordPress gère les rôles et les fonctionnalités, mais ce n'est pas la bonne façon de vérifier le rôle d'un utilisateur.

En fait, l'utilisation d'un rôle d'utilisateur dans current_user_can() déclenchera probablement une _doing_it_wrong() dans un avenir proche. Voir # 38653 Déclenchez un comportement incorrect lors de la vérification du nom d'un rôle en tant que fonctionnalité . L'utilisation de current_user_can() pour vérifier qu'un rôle d'utilisateur est erroné depuis très longtemps. Voir cet article de 2006, Comment vérifier si un utilisateur de WordPress est un "administrateur" , par le développeur en chef de WordPress, Mark Jaquith

Au lieu d'un rôle, vous devriez utiliser une capacité avec cette fonction.

Si vous souhaitez vérifier le rôle d'un utilisateur, vous devez procéder comme suit. Il n’ya vraiment aucun moyen de vérifier le rôle d’un utilisateur, car il peut avoir plusieurs rôles et il n’est pas garanti que les capacités de l’utilisateur soient identiques à celles des rôles auxquels il appartient.

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;
}

Si vous souhaitez continuer à utiliser current_user_can(), vous devez vérifier une fonctionnalité telle que promote_users ou manage_options qui, par défaut, ne s'applique qu'au rôle d'administrateur.

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;
}

Ou vous pouvez même définir la constante ALLOW_UNFILTERED_UPLOADS dans votre wp-config.php et ajouter la capacité unfiltered_upload au rôle d'administrateur et le vérifier.

1
Nathan Johnson