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_plugins
Filter 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.php
das 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-plugins
Verzeichnis 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.
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)