Jedną z pierwszych rzeczy, które WordPress robi, aby załadować wtyczki, jest uzyskanie aktywnych wtyczek zapisanych w bazie danych:
$active_plugins = (array) get_option( 'active_plugins', array() );
Ponieważ używa get_option()
, możemy użyć option_active_plugins
filtru do modyfikacji listy aktywnych wtyczek w locie.
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' );
Wystarczy zastąpić gravityforms/gravityforms.php
katalogiem i nazwą wtyczki, którą chcesz wyłączyć.
Problem polega na tym, że próbujemy wpływać na ładowanie wtyczek, więc nie możemy tego zrobić z poziomu wtyczki, ponieważ jest za późno. W temacie też byłoby za późno.
Na szczęście WordPress ma „Must Use Plugins”. Są to wtyczki, które możesz dodać, które są ładowane przed i osobno do zwykłych wtyczek i nie pojawiają się na liście zwykłych wtyczek.
Wszystko, co musisz zrobić, aby dodać ten kod do wtyczki Must Use, to utworzyć wp-content/mu-plugins
katalog (jeśli jeszcze nie istnieje) i plik PHP (można go nazwać dowolnym) z tym kodem. Nie potrzebujesz nagłówka wtyczki ani niczego innego.
Teraz ten kod zostanie załadowany przed wszystkimi innymi wtyczkami podczas ładowania WordPress. Ponieważ nasz filtr jest na miejscu, gdy WordPress pobierze listę aktywnych wtyczek do załadowania wtyczki, którą chcesz wyłączyć, zostanie odfiltrowana z tej listy, jeśli WP-CLI jest aktywny.
get_option()
powraca wcześniej, gdy wartość jest zapisywana w stanach przejściowych / podobnych i ten filtr jest pomijany? (Nie działa w większości przypadków, tylko na ekranie wtyczki administratora zostało faktycznie wykonane)