Wie verhindere ich das Laden eines Plugins beim Ausführen von WP-CLI?

12

Ich verwende diesen Code derzeit in der Haupt-Plugins-Datei selbst. Da dieses Plugin jedoch nicht mein eigenes ist, würde ich es vorziehen, es normal aktualisieren zu können, ohne jedes Mal diesen Code hinzuzufügen.

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    exit;
}

Ich muss dies tun, da dieses Plugin Fehler erzeugt und die korrekte Ausführung von wp-cli stoppt, sodass ich das Plugin nicht einfach mit wp-cli deaktivieren, meine Aufgaben ausführen und es wieder aktivieren kann.

Gibt es eine Möglichkeit, wie ich etwas if x then do not load plugin file xaus einem Mu-Plugin heraus tun kann ?

NextGenThemes
quelle

Antworten:

12

Eines der ersten Dinge, die WordPress zum Laden von Plugins tut, ist das Abrufen der aktiven Plugins, wie sie in der Datenbank gespeichert sind:

$active_plugins = (array) get_option( 'active_plugins', array() );

Da es verwendet wird get_option(), können wir den option_active_pluginsFilter verwenden, um die Liste der aktiven Plugins im laufenden Betrieb zu ändern.

function wpse_301282_disable_plugin( $active_plugins ) {
    if ( defined( 'WP_CLI' ) && WP_CLI ) {
        $key = array_search( 'gravityforms/gravityforms.php', $active_plugins );

        if ( $key ) {
            unset( $active_plugins[$key] );
        }
    }

    return $active_plugins;
}
add_filter( 'option_active_plugins', 'wpse_301282_disable_plugin' );

Ersetzen Sie einfach durch gravityforms/gravityforms.phpdas Verzeichnis und den Dateinamen des Plugins, das Sie deaktivieren möchten.

Das Problem hierbei ist, dass wir versuchen, das Laden von Plugins zu beeinflussen, sodass wir dies nicht innerhalb eines Plugins tun können , da es zu spät ist. Im Thema wäre es auch zu spät.

Zum Glück hat WordPress "Plugins müssen verwendet werden". Dies sind Plugins, die Sie hinzufügen können und die vor und separat zu regulären Plugins geladen wurden und nicht in der Liste der regulären Plugins angezeigt werden.

Alles, was Sie tun müssen, um diesen Code zu einem Must Use Plugin hinzuzufügen, ist ein wp-content/mu-pluginsVerzeichnis zu erstellen (falls es noch nicht vorhanden ist) und eine PHP-Datei (es kann beliebig genannt werden) mit diesem Code zu erstellen. Sie benötigen keinen Plugin-Header oder etwas anderes.

Jetzt wird dieser Code vor allen anderen Plugins geladen, wenn WordPress geladen wird. Da unser Filter vorhanden ist, wird WordPress, wenn die Liste der aktiven Plugins zum Laden des zu deaktivierenden Plugins abgerufen wird, aus dieser Liste herausgefiltert, wenn WP-CLI aktiv ist.

Jacob Peattie
quelle
Hatte die gleiche Idee, aber das funktioniert nicht. Zumindest nicht in meiner Umgebung. Kehrt möglicherweise get_option()früh zurück, wenn der Wert in Transienten / Ähnlichem gespeichert wird und dieser Filter übersprungen wird? (Funktioniert in den meisten Fällen nicht, nur im Admin-Plugin-Bildschirm wurde es tatsächlich ausgeführt)
kero
Hm. Wenn Sie sich die Quelle ansehen und soweit ich das beurteilen kann, wird der option_Filter nur angewendet, wenn er keinen Wert hat und den Standardwert zurückgibt.
Jacob Peattie
Das war eigentlich der Fall (keine Plugins aktiv). Ich sollte meine Testumgebungen nicht zu sauber halten.
Kero
1
Ich habe das akzeptiert, weil es in meinem Fall das ist, was ich brauchte. Auch wenn im Allgemeinen die --skip-plugin=xOption wp-cli ein besserer Weg ist, dies zu tun.
NextGenThemes
15

Sie können die skip-pluginsOption in WP-CLI verwenden, um bei Verwendung von WP-CLI keine einzelnen Plugins zu laden.

Sie können es entweder in einem Befehl wie dem folgenden verwenden:

wp user list --skip-plugins=my-plugin

Oder Sie können dies zu Ihrer wp-cli.ymlDatei hinzufügen :

skip-plugins:
- my-plugin
swissspidy
quelle
-1

Durch einfaches Umbenennen des Plugin-Verzeichnisnamens wird dieser deaktiviert. Ich mache es manchmal, um ein Plugin [Linux] vorübergehend zu deaktivieren:

mv my-plugin-dir renamed-my-plugin-dir
John Dee
quelle
Das OP möchte das Plugin nur bei Verwendung von WP-CLI überspringen, nicht für andere Aktivitäten, die zur gleichen Zeit stattfinden könnten
Mark Kaplun