Jak zapobiec ładowaniu wtyczki podczas wykonywania WP-CLI?

13

Obecnie używam tego kodu w głównym pliku wtyczek. Ale ta wtyczka nie jest moja, więc wolałbym móc ją normalnie aktualizować bez każdorazowego dodawania tego kodu.

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

Muszę to zrobić, ponieważ ta wtyczka powoduje błędy i zatrzymuje wp-cli do prawidłowego wykonania, więc nie mogę po prostu wyłączyć wtyczki za pomocą wp-cli, wykonywać moich zadań i ponownie ją włączać.

Czy istnieje sposób na zrobienie czegoś takiego if x then do not load plugin file xz wtyczki mu?

NextGenThemes
źródło

Odpowiedzi:

13

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_pluginsfiltru 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.phpkatalogiem 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-pluginskatalog (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.

Jacob Peattie
źródło
Miałem ten sam pomysł, ale to nie działa. Przynajmniej nie w moim lokalnym środowisku. Może 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)
kero 19.04.18
Hm Patrząc na źródło i o ile mogę powiedzieć, jedynym powodem, dla którego option_filtr nie zostałby zastosowany jest to, że nie ma on wartości i zwraca wartość domyślną.
Jacob Peattie
Tak właśnie było (brak aktywnych wtyczek). Nie powinienem utrzymywać środowiska testowego w czystości.
Kero
1
Zaakceptowałem to, ponieważ w moim przypadku jest to, czego potrzebowałem. Mimo że ogólnie rzecz biorąc, --skip-plugin=xopcja wp-cli może być lepszym sposobem na zrobienie tego.
NextGenThemes,
15

Możesz użyć skip-pluginsopcji w WP-CLI, aby nie ładować poszczególnych wtyczek podczas korzystania z WP-CLI.

Możesz użyć go w poleceniu w następujący sposób:

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

Lub możesz dodać to do swojego wp-cli.ymlpliku:

skip-plugins:
- my-plugin
szwajcarski
źródło
-1

Zmiana nazwy katalogu wtyczki spowoduje jej wyłączenie. Robię to czasami, aby tymczasowo wyłączyć wtyczkę [linux]:

mv my-plugin-dir renamed-my-plugin-dir
John Dee
źródło
PO chce pominąć wtyczki tylko przy użyciu WP-CLI, a nie dla innych działań, które mogą się zdarzyć w tym samym czasie
Mark Kaplun