Come impedire il caricamento di un plug-in quando si esegue WP-CLI?


12

Attualmente uso questo codice nel file plug-in principale stesso. Ma quel plugin non è il mio, quindi preferirei poterlo aggiornare normalmente senza aggiungere ogni volta questo codice.

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

Devo farlo perché questo plugin produce errori e interrompe l'esecuzione corretta di wp-cli, quindi non posso semplicemente disabilitare il plugin con wp-cli, svolgere i miei compiti e riattivarlo.

C'è un modo in cui posso fare qualcosa come if x then do not load plugin file xall'interno di un mu-plugin?

Risposte:


12

Una delle prime cose che WordPress fa per caricare i plugin è ottenere i plugin attivi salvati nel database:

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

Dal momento che utilizza get_option()possiamo usare il option_active_pluginsfiltro per modificare al volo l'elenco dei plugin attivi.

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' );

Sostituisci semplicemente gravityforms/gravityforms.phpcon la directory e il nome file del plug-in che desideri disabilitare.

Il problema qui è che stiamo cercando di influenzare il caricamento dei plugin, quindi non possiamo farlo all'interno di un plugin, perché è troppo tardi. Nel tema sarebbe anche troppo tardi.

Per fortuna WordPress ha "Must Use Plugin", questi sono plug-in che è possibile aggiungere che vengono caricati prima e separatamente nei plug-in normali e non vengono visualizzati nell'elenco dei plug-in normali.

Tutto quello che devi fare per aggiungere questo codice a un Plugin Must Use è creare una wp-content/mu-pluginsdirectory (se non esiste già) e creare un file PHP (può essere chiamato qualunque cosa) con quel codice. Non hai bisogno di un'intestazione del plugin o altro.

Ora quel codice verrà caricato prima di tutti gli altri plugin quando viene caricato WordPress. Poiché il nostro filtro è attivo, quando WordPress ottiene l'elenco dei plug-in attivi per caricare il plug-in che si desidera disabilitare, questo verrà filtrato dall'elenco se WP-CLI è attivo.


Ha avuto la stessa idea ma questo non funziona. Almeno non nel mio ambiente locale. Forse get_option()sta tornando presto quando il valore viene salvato in transitori / simili e questo filtro viene ignorato? (Non funziona per la maggior parte dei casi, solo nella schermata del plugin di amministrazione è stata effettivamente eseguita)
kero

Hm. Guardando la fonte e per quanto ne so, l'unica ragione per cui il option_filtro non verrebbe applicato è se non ha un valore e restituisce il valore predefinito.
Jacob Peattie,

Questo è stato effettivamente il caso (nessun plugin attivo). Non dovrei mantenere i miei ambienti di prova troppo puliti ..
Kero,

1
Ho accettato questo perché nel mio caso è quello di cui avevo bisogno. Anche se in generale l' --skip-plugin=xopzione di wp-cli può essere un modo migliore per farlo.
NextGenThemes,

15

È possibile utilizzare l' skip-pluginsopzione in WP-CLI per non caricare singoli plug-in quando si utilizza WP-CLI.

Puoi usarlo nel comando in questo modo:

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

Oppure puoi aggiungere questo al tuo wp-cli.ymlfile:

skip-plugins:
- my-plugin

-1

Basta rinominare il nome della directory del plugin per disabilitarlo. Lo faccio a volte per disabilitare temporaneamente un plugin [linux]:

mv my-plugin-dir renamed-my-plugin-dir

L'OP vuole saltare il plug-in proprio quando si utilizza WP-CLI, non per qualsiasi altra attività che possa avvenire contemporaneamente
Mark Kaplun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.