¿Cómo evito que se cargue un complemento al hacer WP-CLI?

12

Actualmente uso este código en el archivo principal de complementos. Pero ese complemento no es mío, por lo que preferiría poder actualizarlo normalmente sin agregar cada vez este código.

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

Necesito hacer esto porque este complemento produce errores y detiene que wp-cli se ejecute correctamente, por lo que no puedo deshabilitar el complemento con wp-cli, realizar mis tareas y volver a habilitarlo.

¿Hay alguna manera de hacer algo como if x then do not load plugin file xdesde un plugin mu?

NextGenThemes
fuente

Respuestas:

12

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_pluginsfiltro 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.phpcon 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-pluginsdirectorio (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.

Jacob Peattie
fuente
Tenía la misma idea pero esto no funciona. Al menos no en mi entorno local. ¿Tal vez 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ó)
kero
Hm. Mirando la fuente y hasta donde puedo decir, la única razón por la que el option_filtro no se aplicaría es si no tiene un valor y está devolviendo el valor predeterminado.
Jacob Peattie
Ese fue realmente el caso (no hay complementos activos). No debería mantener mis entornos de prueba demasiado limpios ..
kero
1
Acepté esto porque en mi caso es lo que necesitaba. Aunque, en general, la --skip-plugin=xopción de wp-cli puede ser una mejor manera de hacerlo.
NextGenThemes
15

Puede usar la skip-pluginsopción en WP-CLI para no cargar complementos individuales cuando use WP-CLI.

Puede usarlo en un comando como este:

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

O puede agregar esto a su wp-cli.ymlarchivo:

skip-plugins:
- my-plugin
swissspidy
fuente
-1

Simplemente renombrar el nombre del directorio del complemento lo deshabilitará. A veces lo hago para deshabilitar temporalmente un complemento [linux]:

mv my-plugin-dir renamed-my-plugin-dir
John Dee
fuente
El OP quiere omitir el complemento solo cuando usa WP-CLI, no para cualquier otra actividad que pueda ocurrir al mismo tiempo
Mark Kaplun