Je voudrais désactiver un plugin pour un utilisateur spécifique. J'utilise le code suivant dans un fichier du plugin wp-content/plugin-mu
:
add_filter( 'option_active_plugins', 'bo_disable_apm_plugin' );
function bo_disable_apm_plugin( $plugins ) {
global $current_user;
// Not use advanced page manager for media manager
if ( is_admin() && in_array( 'media_manager', $current_user->roles ) ) {
$key = array_search( 'advanced-page-manager/advanced_page_manager.php' , $plugins );
if ( false !== $key ) {
unset( $plugins[$key] );
}
}
return $plugins;
}
Bien sûr, ça ne marche pas. Je ne comprends pas le chemin option_active_plugins
. En vidant les données, je découvre que le code est exécuté 7 fois.
Sur la première boucle, l'utilisateur n'est pas connu, la condition n'est donc pas remplie. Le plugin est toujours activé.
J'ai ajouté un code plus compliqué avec trois conditions: désactiver le plug-in si l'utilisateur n'est pas défini, de sorte que le plug-in soit inactivé à la première boucle. SI l'utilisateur est configuré (prochaines boucles), cochez-le pour définir/désélectionner le plug-in en conséquence. Ne fonctionnait pas non plus.
Je n'ai pas réussi à trouver la bonne formule, alors peut-être que je me trompe quelque part et que cela ne peut pas être fait. A chaque fois, le plugin est activé ou désactivé pour tous les utilisateurs. On dirait que la première itération est celle qui compte.
Est-il possible d'inactiver un plugin pour un utilisateur/groupe spécifique?
Je pense que la réponse à cette action Désactiver le plugin/plugin via le thème } est bonne pour la connaissance de base sur la façon de désactiver les plugins à partir du code.
Adapter ces connaissances à vos besoins nous laissera avec ceci:
add_action('admin_init', 'my_filter_the_plugins');
function my_filter_the_plugins()
{
global $current_user;
if (in_array('media_manager', $current_user->roles)) {
deactivate_plugins( // deactivate for media_manager
array(
'/advanced-page-manager/advanced_page_manager.php'
),
true, // silent mode (no deactivation hooks fired)
false // network wide
);
} else { // activate for those than can use it
activate_plugins(
array(
'/advanced-page-manager/advanced_page_manager.php'
),
'', // redirect url, does not matter (default is '')
false, // network wise
true // silent mode (no activation hooks fired)
);
}
}
Fondamentalement, cela se produit:
Pour le groupe d'utilisateurs media_manager
, le my_filter_the_plugins
désactive ( silencieusement ) le plug-in advanced-page-manager
. Nous devons ensuite réactiver le plugin ( silencieusement , encore) pour ceux qui ne font pas partie du groupe d'utilisateurs media_manager
.
En gros, vous pouvez désactiver le plug-in entier uniquement en fonction des informations dont vous disposez au moment du "démarrage" de wordpress, qui correspond en gros à l'URL et aux cookies. Toute vérification plus complexe que celle qui devra probablement attendre la fin du démarrage pour pouvoir être exécutée est à ce moment le plugin est chargé et il est trop tard pour le "désactiver".