Comment empêcher le chargement d'un plugin lors de l'exécution de WP-CLI?

13

J'utilise actuellement ce code dans le fichier principal des plugins lui-même. Mais ce plugin n'est pas le mien, donc je préférerais pouvoir le mettre à jour normalement sans à chaque fois ajouter ce code.

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

Je dois le faire parce que ce plugin produit des erreurs et empêche wp-cli de s'exécuter correctement, donc je ne peux pas simplement désactiver le plugin avec wp-cli, faire mes tâches et le réactiver.

Existe-t-il un moyen de faire quelque chose comme à if x then do not load plugin file xpartir d'un plugin mu?

NextGenThemes
la source

Réponses:

13

L'une des premières choses que WordPress fait pour charger les plugins est d'obtenir les plugins actifs tels qu'ils sont enregistrés dans la base de données:

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

Puisqu'il utilise, get_option()nous pouvons utiliser le option_active_pluginsfiltre pour modifier la liste des plugins actifs à la volée.

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

Remplacez simplement gravityforms/gravityforms.phppar le répertoire et le nom de fichier du plugin que vous souhaitez désactiver.

Le problème ici est que nous essayons d'affecter le chargement des plug - ins, donc nous ne pouvons pas le faire à partir de l' intérieur d' un plug - in, car il est trop tard. Dans le thème serait également trop tard.

Heureusement, WordPress a des " plug-ins indispensables". Ce sont des plug-ins que vous pouvez ajouter qui sont chargés avant et séparément dans les plug-ins standard et n'apparaissent pas dans la liste des plug-ins standard.

Tout ce que vous devez faire pour ajouter ce code à un plugin à utiliser est de créer un wp-content/mu-pluginsrépertoire (s'il n'existe pas déjà) et de créer un fichier PHP (il peut s'appeler n'importe quoi) avec ce code. Vous n'avez pas besoin d'un en-tête de plugin ou d'autre chose.

Maintenant, ce code sera chargé avant tous les autres plugins lors du chargement de WordPress. Puisque notre filtre est en place, lorsque WordPress obtient la liste des plugins actifs pour charger le plugin que vous souhaitez désactiver, il sera filtré de cette liste si WP-CLI est actif.

Jacob Peattie
la source
J'ai eu la même idée mais cela ne fonctionne pas. Du moins pas dans mon environnement local. Peut get_option()- être revient-il tôt lorsque la valeur est enregistrée dans des transitoires / similaires et que ce filtre est ignoré? (Ne fonctionne pas dans la plupart des cas, uniquement dans l'écran du plugin d'administration, il a été exécuté)
kero
Hm. En regardant la source et pour autant que je sache, la seule raison pour laquelle le option_filtre ne serait pas appliqué est s'il n'a pas de valeur et renvoie la valeur par défaut.
Jacob Peattie
C'était en fait le cas (aucun plugin actif). Je ne devrais pas garder mes environnements de test trop propres ..
kero
1
J'ai accepté cela parce que dans mon cas, c'est ce dont j'avais besoin. Même si en général l' --skip-plugin=xoption wp-cli peut être une meilleure façon de le faire.
NextGenThemes
15

Vous pouvez utiliser l' skip-pluginsoption dans WP-CLI pour ne pas charger de plug-ins individuels lors de l'utilisation de WP-CLI.

Vous pouvez soit l'utiliser dans une commande comme celle-ci:

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

Ou vous pouvez l'ajouter à votre wp-cli.ymlfichier:

skip-plugins:
- my-plugin
swissspidy
la source
-1

Le simple fait de renommer le nom du répertoire du plugin le désactivera. Je le fais parfois pour désactiver temporairement un plugin [linux]:

mv my-plugin-dir renamed-my-plugin-dir
John Dee
la source
L'OP veut ignorer le plug-in juste lors de l'utilisation de WP-CLI, pas pour toute autre activité qui pourrait se produire en même temps
Mark Kaplun