web-dev-qa-db-fra.com

Comment puis-je modifier la capacité nécessaire pour accéder aux options d'un plugin?

J'ai le suivant 3 rôles différents : Admin, Editor et SEO. J'ai installé WordPress SEO by Yoast, et je souhaite obtenir ceci:

  • Je ne veux pas que les éditeurs voient les options de référencement , car ils n'écrivent que des articles et ne connaissent pas le référencement. Il y a une personne avec le rôle SEO qui fera l'optimisation.
  • Je ne veux pas que la personne SEO voie les autres options de plugins . Je veux juste avoir les mêmes capacités que les éditeurs, mais avec les fonctions de référencement activées.

J'ai essayé avec des extraits de ce site, et je suis en mesure de cacher la méta-boîte à la Editors, mais pas la petite 'zone de classement' sur le bouton Publier .

De plus, je ne sais pas comment traiter le deuxième point, car tous les plug-ins utilisent la même capacité manage_options; je ne peux donc pas affecter cette capacité au rôle SEO. Et Je ne sais pas comment changer la capacité requise sans modifier les fichiers du plugin (ce qui sera perdu lors de la mise à jour du plugin).

Merci d'avance.

5
EliasNS

Peut-être que ce n'est pas la meilleure méthode car cela donne à un éditeur l'accès aux Paramètres et aux Options, mais cela donne à un éditeur spécifique (basé sur l'ID utilisateur) les autorisations pour modifier les options. Nous testons ensuite si nous chargeons l'un des modèles d'options, si nous sommes ET si l'ID utilisateur est identique à celui pour lequel nous avons donné des autorisations, supprimons le processus et crachons un message.

1) La première chose à faire est de créer votre utilisateur de référencement et de lui attribuer un rôle d'éditeur.

2) Ensuite, nous devons donner à cet utilisateur la possibilité de manage_options. Vous pouvez le trouver en modifiant l'utilisateur et en regardant l'URL, ce devrait être l'un des derniers paramètres de l'URL.

/** Give our SEO Guy Permissions **/
function give_seo_yoastToast() {
    $user = new WP_User( $seo_user_id );
    $user->add_cap( 'manage_options');
}
add_action( 'admin_init', 'give_seo_yoastToast');

3) Nous devons maintenant nous assurer que tous nos moteurs de référencement ne peuvent accéder à aucune des options critiques. À ma connaissance, les pages ci-dessous sont le seul moyen pour cet utilisateur de modifier des informations cruciales. S'ils voient ces pages, nous les supprimons et crions un message, n'hésitez pas à le modifier.

/** Remove Access to Certain Pages **/
add_action( 'load-options-general.php', 'prevent_seoguy_access' );
add_action( 'load-options-writing.php', 'prevent_seoguy_access' );
add_action( 'load-options-reading.php', 'prevent_seoguy_access' );
add_action( 'load-options-discussion.php', 'prevent_seoguy_access' );
add_action( 'load-options-media.php', 'prevent_seoguy_access' );
add_action( 'load-options-permalink.php', 'prevent_seoguy_access' );
add_action( 'load-options.php', 'prevent_seoguy_access' );
function prevent_seoguy_access(){
    $currID = is_user_logged_in() ? get_current_user_id() : 0;

    if($currID == $seo_user_id ){
        wp_die("There was a hole here once, it's gone now.");
        exit();
    }
}

4) Pour l'instant, il peut voir les pages du menu mais lorsqu'il y accède, il voit le message ci-dessus. Juste comme une étape supplémentaire, supprimons cette page de notre menu. Veuillez noter que si vous supprimez la page de menu sans la fonction ci-dessus, un utilisateur averti peut accéder à n’importe quelle page d’option directement via une URL.

/** Remove Settings Menu Page from SEO Guy **/
function seo_guy_menu() {
    if(!current_user_can('administrator')){
        remove_menu_page('options-general.php');
    }
}
add_action('admin_menu', 'seo_guy_menu');

5) Et vous avez terminé!

Malheureusement, comme vous l'avez souligné dans votre question, Yoast ne semble pas avoir la capacité d'accorder à un utilisateur des autorisations spécifiques sur tous les éléments de référencement sans lui attribuer d'autorisations supplémentaires inutiles. Et sur une autre note, vous pouvez au lieu d’utiliser un $seo_user_id statique pour créer un rôle de référencement, donnez les autorisations à cet éditeur de rôle en plus de ce qui précède. C'est un peu plus de travail (pas trop cependant), mais si vous n'avez qu'un gars qui fait votre référencement pour toujours, alors la méthode ci-dessus est très bien, je suppose.

4
Howdy_McGee

Le meilleur moyen de modifier les fonctionnalités dont les utilisateurs ont besoin pour afficher les pages de paramètres Yoast SEO consiste à utiliser le filtre wpseo_manage_options_capability.

Voici un exemple d'utilisation (placé dans votre fichier functions.php):

/**
 * Return the capability that users need to view the Yoast SEO settings pages.
 *
 * @return mixed|void
 */
function my_custom_wpseo_manage_options_capability() {

    $manage_options_cap = 'edit_others_posts';

    return $manage_options_cap;
}
add_filter( 'wpseo_manage_options_capability', 'my_custom_wpseo_manage_options_capability' );

Dans l'exemple ci-dessus, la fonctionnalité edit_others_posts est utilisée pour que (lors d'une installation par défaut de WordPress) les éditeurs et les administrateurs puissent accéder aux paramètres de Yoast SEO.

Si vous ne souhaitez pas que les éditeurs "normaux" aient accès, vous devez créer un nouveau rôle ("SEO") doté des mêmes fonctionnalités qu'un éditeur, ainsi qu'une fonctionnalité personnalisée supplémentaire (par exemple, manage_wpseo_options) qui peut être utilisé dans la fonction ci-dessus à la place de edit_others_posts.

Le plugin Members de Justin Tadlock vous permet de créer facilement de nouveaux rôles et fonctionnalités à cette fin.

Note: Cela peut ne pas fonctionner sur Multisite à cause de ce problème .


Mise à jour: Dans Yoast SEO v5.5 +, le filtre wpseo_manage_options_capability a été renommé en wpseo_manage_options.

4
Matt Sims

Je viens de trouver une solution très simple. Si vous ne l'avez pas déjà fait, installez une sorte de plugin de gestionnaire de capacités. Créez ensuite une nouvelle fonctionnalité à partir du gestionnaire de capacités - appelez-la "CUSTOM_CAPABILITY_NAME" ou ce que vous voulez. Puis attribuez-le à un rôle ou à un utilisateur spécifique.

Important : copiez et sauvegardez le fichier que vous souhaitez modifier au cas où vous feriez monter, vous pouvez toujours restaurer l'original.

Ensuite, sur le serveur actuel, vous devez modifier les répertoires en wp-content/plugins /, puis grep et rechercher tous les fichiers contenant "manage_options".

Exemple: grep 'manage_options' */*

Partie difficile, vous devrez trouver la fonction principale qui ajoute le menu ou le sous-menu au tableau de bord. Voici mes deux exemples d'accès spécifique à Yoast SEO.

$manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'CUSTOM_CAPABILITY_NAME' );


add_submenu_page( 'wpseo_dashboard', __( 'WooCommerce SEO Settings', 'yoast-woo-seo' ), __( 'WooCommerce SEO', 'yoast-woo-seo' ), 'CUSTOM_CAPABILITY_NAME', $this->short_name, array(

PS - ne changez rien qui commence par un '$' - c'est une variable. :)

1
Fabian