web-dev-qa-db-fra.com

Supprimer la fonctionnalité upload_files d'un rôle mais autoriser le rôle à gérer une image d'avatar

J'ai un site avec 1 administrateur, 11 éditeurs et plus de 4000 auteurs. Je dois empêcher les auteurs d'ajouter des médias au serveur et d'utiliser tout le stockage.

Au départ j'ai essayé

function removemediabuttons()
{
    if($user->wp_user_level >= 1) {
        remove_action( 'media_buttons', 'media_buttons' );
        global $menu;
        unset($menu[10]);
    }
}
add_action('admin_head','removemediabuttons');

Cela supprime le bouton Add Media pour les non-administrateurs, mais l'approche unset (()) du menu de la barre latérale d'administration n'a aucun effet et je suppose que tout auteur connaissant WordPress peut simplement entrer l'URL de la médiathèque et l'utiliser.

J'ai donc efficacement éliminé ce problème avec

$wp_roles->remove_cap( 'author', 'upload_files' );

MAIS ceci (correctement) a supprimé l’accès du rôle d’auteur pour utiliser WP User Avatar et il est très important pour les utilisateurs de ne pas être obligés d’utiliser Gravatar et de pouvoir modifier base locale.

Est-il possible d'ajouter add_cap () uniquement pour le module?

UPDATE 2015-12-21 Suggestion de Peruel Je change de code pour vérifier le profil dans get_current_screen(). Cela active définitivement l'interface utilisateur dans le profil, mais lorsque l'interface utilisateur uploads.php apparaît pour le téléchargement, elle vérifie à nouveau et est refusée. La vérification dans ce cas provient de /wp-admin/includes/ajax-actions.php, ce n’est donc pas le plugin lui-même qui effectue le téléchargement (et correctement).

global $wp_roles; 
$wp_roles->remove_cap( 'author', 'upload_files' );
add_action( 'current_screen', 'allowAvatarUploads' );

function allowAvatarUploads() {
    $currentScreen = get_current_screen();
    global $wp_roles; 
    if( $currentScreen->id === "profile" ) {
        $wp_roles->add_cap( 'author', 'upload_files' );
        // keep their menu consistent 
        remove_menu_page('upload.php'); 
    } else {

    }
}
3
jerrygarciuh

Différentes allusions à votre idée pour créer une solution à votre sujet.

  1. Depuis plus longtemps, WP utilise toujours des noms de rôles, pas de niveau. Utilisez toujours le nom du rôle pour le contrôle dans la rubrique d'accès. La fonction current_user_can() devrait vous aider.

  2. Pour supprimer un élément de menu, utilisez la fonction principale wp remove_menu_page( $menu_slug ); et non la valeur non définie. Est plus stable et pris en charge.

  3. Le hook admin_head n'est pas le meilleur hook pour initier les changements dans le menu ou enlever le capuchon. Pour enlever le capuchon, utilisez le crochet init ou similaire, au début de la pile de chargement. Pour l'élément de menu, utilisez admin_menu.

À votre question

Est-il possible d'ajouter add_cap () seulement pour un module?

Non, la capacité est globale. Mais vous pouvez consulter le site, l’écran à l’arrière et le supprimer uniquement sur cet écran, si cela est utile et possible. Si vous voulez vérifier la page du paquet, utilisez la fonction https://codex.wordpress.org/Function_Reference/get_current_screen . Vous obtenez un tableau contenant de nombreuses informations sur la page et vous l'utilisez pour une instruction permettant de définir la capacité.

Dans votre sujet, je pense que vous devriez supprimer la capacité upload_files avec votre idée - $wp_roles->remove_cap( 'author', 'upload_files' );. Vérifiez l'avatar ou la page de profil et ajoutez cette fonctionnalité à vos utilisateurs.

1
bueltge