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_plugins
filtro 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.php
con 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-plugins
directory (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.
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)