web-dev-qa-db-de.com

Plugin für eine bestimmte Benutzergruppe deaktivieren

Ich möchte ein Plugin für einen bestimmten Benutzer deaktivieren. Ich verwende den folgenden Code in einer wp-content/plugin-mu-Plugin-Datei:

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

Natürlich funktioniert es nicht. Ich verstehe den Weg option_active_plugins nicht. Durch das Ausgeben von Daten stelle ich fest, dass der Code sieben Mal ausgeführt wird.

In der ersten Schleife ist der Benutzer nicht bekannt, sodass die Bedingung nicht erfüllt ist. Das Plugin ist noch aktiviert.

Ich habe einen komplizierteren Code mit drei Bedingungen hinzugefügt: Deaktiviere das Plugin, wenn der Benutzer nicht festgelegt ist, sodass das Plugin jedes Mal in der ersten Schleife inaktiviert wird. WENN der Benutzer eingestellt ist (nächste Schleifen), aktivieren/deaktivieren Sie das Plugin entsprechend. Funktionierte auch nicht.

Ich habe es nicht geschafft, die richtige Formel zu finden, also irre ich mich vielleicht irgendwo und es geht nicht. Jedes Mal wird das Plugin für alle Benutzer entweder aktiviert oder deaktiviert. Es sieht so aus, als ob die erste Iteration diejenige ist, die zählt.

Gibt es eine Möglichkeit, ein Plugin für bestimmte Benutzer/Gruppen zu deaktivieren?

7
Simon

Ich denke, die Antwort auf diese Plugin deaktivieren/Plugin-Aktion über Thema ist gut für Grundkenntnisse darüber, wie Plugins aus Code deaktiviert werden.

Wenn Sie dieses Wissen an Ihre Bedürfnisse anpassen, erhalten Sie Folgendes:

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

Grundsätzlich passiert folgendes:

Für die Benutzergruppe media_manager deaktiviert der my_filter_the_plugins das advanced-page-manager-Plugin ( im Hintergrund ). Wir müssen dann das Plugin ( still , wieder) für diejenigen reaktivieren, die nicht zur Benutzergruppe media_manager gehören.

5
aifrim

Grundsätzlich können Sie das gesamte Plugin nur auf der Grundlage der Informationen deaktivieren, die Sie zum Zeitpunkt des Startens von WordPress haben. Dies sind im Grunde die URL und die Cookies. Jede komplexere Prüfung, die wahrscheinlich warten muss, bis der Start abgeschlossen ist, um ausgeführt werden zu können. Zu diesem Zeitpunkt ist das Plugin bereits geladen und es ist zu spät, es zu "deaktivieren".

0
Mark Kaplun