Désactiver l'action plugin / plugin via le thème

19

J'ai installé le plugin Google Analyticator sur mon site. J'utilise également le plug-in MobilePress pour proposer un thème conçu pour les navigateurs mobiles autres que les smartphones. J'ai configuré Google Analytics pour mobile pour l'utiliser dans ce thème et je souhaite désactiver le plug-in Analyticator car il inclut un appel à un fichier js plus volumineux.

Est-ce que quelqu'un sait s'il est possible de désactiver un plugin en utilisant functions.php ou une autre méthode?

Je crois avoir localisé le code qui ajoute les fonctions à la page, donc s'il n'est pas possible de désactiver l'intégralité du plugin, est-il possible d'arrêter les actions pour l'exécution? J'ai essayé de les désactiver directement sans succès. Voici le code du fichier du plugin:

add_action('wp_head', 'add_google_analytics', 999999);
add_action('init', 'ga_outgoing_links');

J'ai essayé de supprimer ces actions avec:

remove_action('wp_head','add_google_analytics',9999999);
remove_action('init', 'ga_outgoing_links');

Toute aide est grandement appréciée.

PNMG
la source
Quant à moi, cela devrait fonctionner techniquement, donc il y a quelque chose dans votre timing d'exécution de ce code qui va mal (trop tôt ou trop tard). Veuillez fournir plus d'informations.
Rarst
Ouais, je pensais que ça marcherait aussi. Je n'ai pas trop d'expérience avec les actions d'ajout / suppression, donc je ne savais pas comment le déboguer davantage. Même si la réponse d'EAMann a fonctionné, quel genre d'informations supplémentaires recherchiez-vous?
PNMG
Je suis un peu confus - n'est-il pas plus facile de simplement désactiver le plugin via des moyens normaux s'il doit être définitivement supprimé? Quelle réponse d'EAMann ne fait que par code. Je supposais que vous vouliez qu'il soit désactivé dynamiquement à certaines conditions ...
Rarst
J'ai un thème régulier qui est défini dans wordpress pour n'importe quel navigateur de bureau normal. Pour ce thème, je souhaite utiliser le plugin GA. Le plugin mobilepress utilise php pour obtenir la chaîne d'agent utilisateur et sert un thème différent à un smartphone ou à un non-smartphone. Je voulais utiliser le fichier functions.php pour le thème non-smartphone pour désactiver le plug-in GA de mettre le JS dans le <head> pour ce thème uniquement. Il doit encore être activé pour les deux autres thèmes (ordinateur de bureau et téléphone intelligent). Est-ce que cela aide à clarifier?
PNMG
Oui, c'est ce que je pensais. Mais la désactivation désactivera simplement le plugin de manière persistante et restera désactivée jusqu'à ce qu'elle soit activée explicitement. Je ne le vois pas convenir à votre cas d'utilisation.
Rarst

Réponses:

25

Lorsque WordPress active un plugin, il appelle la activate_plugin()fonction. Cette fonction active le plugin dans un bac à sable et redirige ailleurs en cas de succès. Il a été utilisé par quelques auteurs pour activer par programme les dépendances des plugins.

Il y a une autre fonction, deactivate_plugin()qui fait la même chose à l'envers ... c'est en fait la façon dont WordPress désactive les plug-ins lorsque vous cliquez sur "désactiver" ou "désactiver".

Pour désactiver un plugin installé, il suffit d'appeler:

deactivate_plugins( '/plugin-folder/plugin-name.php' );

Ou, pour désactiver plusieurs plugins à la fois:

deactivate_plugins( array( '/first-plugin/first.php', '/second-plugin/second.php' ) );

Il y a un deuxième paramètre (le premier est soit une chaîne ou un tableau des plugins à désactiver) qui vous permet de désactiver les plugins sans appeler de hooks de désactivation. Par défaut, il est défini sur false et je vous recommande de le laisser de cette façon. Sauf si pour une raison quelconque vous souhaitez contourner la désactivation, vous feriez alors:

deactivate_plugins( '/plugin-folder/plugin-name.php', true );

Cela désactiverait simplement le plugin, mais cela ne déclencherait rien que le plugin aurait enregistré lors de la désactivation. Donc, si le plugin supprime les options ou les tables de base de données lorsqu'il est désactivé, vous voudriez faire cette désactivation "silencieuse" pour conserver ces informations et les utiliser ailleurs.

EAMann
la source
Excellente réponse - et pas seulement par rapport à une autre, disons, une réponse terne "voici un site Web" qui pourrait être quelque part à proximité.
éditeur
Ce code, placé dans le fichier functions.php désactivera le plugin dans l'admin, le désactivant ainsi des deux autres thèmes. Merci Rarst de l'avoir souligné. Je voulais juste le désactiver pour le seul thème où se trouvait le fichier functions.php.
PNMG
Vous n'utilisez qu'un seul thème à la fois sur un site donné ... mais si vous souhaitez réactiver le plugin après avoir désactivé le thème, c'est également possible.
EAMann
11

C'est grâce à la brillante réponse d'EAMann ci-dessus, et j'ai pensé que cela pourrait aussi être utile pour l'affiche originale ...

J'avais besoin d'une solution pour m'assurer que les utilisateurs désactivaient mon plugin s'ils téléchargeaient la version premium (pour éviter les conflits potentiels). Auparavant, j'ai détecté son état avec is_plugin_active et affiché un message d'erreur administrateur pour inviter les utilisateurs à le désactiver. C'est BEAUCOUP plus fluide ...

function deactivate_plugin_conditional() {
    if ( is_plugin_active('plugin-folder/plugin-name.php') ) {
    deactivate_plugins('plugin-folder/plugin-name.php');    
    }
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );

Remarque: ne semble pas fonctionner sur register_activation_hook, mais admin_init fonctionne comme un charme.

Mark Jeldi
la source
1
Juste pour noter que je suis presque sûr que is_plugin_active est déjà vérifié dans le crochet deactivate_plugins donc il ne devrait pas avoir besoin de le refaire
Bryan Willis
1

Voici ma solution, créer un plugin qui peut désactiver d'autres plugins comme ceci:

/*
 * Plugin Name: Disable/Configure Plugins
 * Description: Lets you disable/configure plugins based on environment variables
 * Author:      Chris Sewell
 */

/**
 * Disable specified plugins in development environment.
 * 
 * This is a "Must-Use" plugin. Code here is loaded automatically before regular plugins load.
 * This is the only place from which regular plugins can be disabled programatically.
 * 
 * Place this code in a file in WP_CONTENT_DIR/mu-plugins or specify a custom location 

 * to "development" or "production" in each particular server/environment.
 */

/* Disable specified plugins in development environment */
if (((getenv('environment') == 'production') || (getenv('environment') == 'alpha')) == false) {
    $plugins = array(
        'w3-total-cache/w3-total-cache.php'
    );
    require_once(ABSPATH . 'wp-admin/includes/plugin.php');
    deactivate_plugins($plugins);
}

Poussez-le en production, activez-le, puis descendez la base de données sur votre machine de développement locale.

La source

user128526
la source