Una de las primeras cosas que WordPress hace para cargar complementos es obtener los complementos activos tal como se guardan en la base de datos:
$active_plugins = (array) get_option( 'active_plugins', array() );
Como usa get_option()
, podemos usar el option_active_plugins
filtro para modificar la lista de complementos activos sobre la marcha.
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' );
Simplemente reemplácelo gravityforms/gravityforms.php
con el directorio y el nombre de archivo del complemento que desea deshabilitar.
El problema aquí es que estamos tratando de afectar a la carga de plugins, por lo que no podemos hacerlo desde dentro de un plug-in, ya que es demasiado tarde. En el tema también sería demasiado tarde.
Afortunadamente, WordPress tiene "Debe usar complementos", estos son complementos que puede agregar que se cargan antes y por separado a los complementos regulares, y no aparecen en la lista de complementos regulares.
Todo lo que necesita hacer para agregar este código a un complemento que debe usar es crear un wp-content/mu-plugins
directorio (si aún no existe) y crear un archivo PHP (se puede llamar de cualquier forma) con ese código. No necesita un encabezado de complemento ni nada más.
Ahora ese código se cargará antes que todos los demás complementos cuando se cargue WordPress. Dado que nuestro filtro está en su lugar, cuando WordPress obtenga la lista de complementos activos para cargar el complemento que desea deshabilitar, se filtrará de esa lista si WP-CLI está activo.
get_option()
regresa temprano cuando el valor se guarda en transitorios / similares y se omite este filtro? (No funciona para la mayoría de los casos, solo en la pantalla del complemento de administrador que realmente se ejecutó)