Deaktivieren Sie das Plugin für eine bestimmte Benutzergruppe

7

Ich möchte ein Plugin für einen bestimmten Benutzer deaktivieren. Ich verwende den folgenden Code in einer wp-content/plugin-muPlugin-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 nicht option_active_plugins. Durch das Speichern von Daten finde ich heraus, dass der Code siebenmal 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: Deaktivieren Sie das Plugin, wenn der Benutzer nicht festgelegt ist, sodass das Plugin jedes Mal in der ersten Schleife inaktiviert wird. Wenn der Benutzer gesetzt ist (nächste Schleife), überprüfen Sie ihn, um das Plugin entsprechend zu setzen / zu deaktivieren. Funktionierte auch nicht.

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

Gibt es eine Möglichkeit, ein Plugin für einen bestimmten Benutzer / eine bestimmte Gruppe zu inaktivieren?

Simon
quelle
require_onceWenn die Option zum ersten Mal als aktive Plugins bezeichnet wird, werden sie geladen (nur a ). Selbst wenn das Plugin in späteren Aufrufen aus den Optionen herausgefiltert wird, ist die Plugin-Datei bereits erforderlich und es gibt keine Möglichkeit, sie zu entfernen. Also ja, das erste Mal zählt nur. Das Problem ist, dass die Benutzeranmeldung in WordPress erst nach dem Laden der Plugins erfolgt. Dies ist der Grund, warum Ihr Code fehlschlägt. Sie haben zwei Möglichkeiten: Benutzeranmeldung früher erzwingen; oder entfernen Sie die Funktionen, die das Plugin hinzufügt, dh ich denke, das Plugin fügt einige Hooks hinzu, warten Sie bis wp_loadedund entfernen Sie dann alle. Plugin ist aktiv, aber "stumm".
gmazzap
Danke für Ihre Antwort. Ich hatte gehofft, nicht alle Funktionen des Plugins aushängen zu müssen (falls sie in einem Update mehr hinzufügen), aber ... Sie schlagen eine Möglichkeit vor, die Anmeldung früher zu erzwingen? Ist das überhaupt möglich ?
Simon
Vielleicht solltest du deinen Kommentar als Antwort platzieren, du hast ihn beantwortet (negativ, aber noch).
Simon
1
Wenn ich heute Zeit habe, antworte ich richtig und zeige einen Weg, um das Problem zu lösen.
gmazzap
Würde gerne deine Einsichten haben.
Simon

Antworten:

5

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

Wenn Sie dieses Wissen an Ihre Bedürfnisse anpassen, haben wir 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 dies:

Für die media_managerBenutzergruppe my_filter_the_pluginsdeaktiviert das Plugin ( stillschweigend ) advanced-page-manager. Wir müssen dann das Plugin (wieder still ) für diejenigen reaktivieren , die nicht zur media_managerBenutzergruppe gehören.

Aifrim
quelle
Vielen Dank. Ich wusste nichts über die Funktion zum Deaktivieren eines Plugins. Lassen Sie mich das bald testen und hierher zurückkehren, um die Frage zu beantworten und die Ergebnisse zu melden.
Simon
@ Simon Ich habe den Code auf einer Website getestet, an der ich arbeite. Hat für mich gearbeitet.
Aifrim
1
Wie bist du mit diesem @Simon umgegangen? Vergessen Sie nicht, zurückzukommen und uns mitzuteilen, wie es Ihnen ergangen ist - und akzeptieren Sie diese Antwort (mit dem Häkchen links), wenn sie Ihnen geholfen hat. Im Moment taucht es in unserer Liste der unbeantworteten Fragen auf :)
Tim Malone
@ AndyMacaulay-Brook hast du die Kommentare gelesen? Es aktiviert und deaktiviert sie lautlos und löst keine Aktivierungs- und Deaktivierungshaken aus.
Aifrim
Doh - mein schlechter - gelöschter Kommentar im Interesse nicht irreführender Leute
Andy Macaulay-Brook
0

Sie können das gesamte Plugin grundsätzlich nur basierend auf den Informationen deaktivieren, die Sie zum Zeitpunkt des "Bootens" von WordPress haben. Dies ist im Grunde die URL und die Cookies. Jede Prüfung, die komplexer ist als diese, muss wahrscheinlich warten, 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, um es zu "deaktivieren".

Mark Kaplun
quelle