web-dev-qa-db-fra.com

Désactiver le plugin pour un groupe d'utilisateurs spécifique

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?

7
Simon

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.

5
aifrim

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".

0
Mark Kaplun