web-dev-qa-db-fra.com

Comment vérifier si un plugin (WooCommerce) est actif?

J'essaie de modifier la tête et le pied de mes pages WooCommerce. J'ai une déclaration if qui est supposée cibler le magasin et le panier de WooCommerce, mais ce n'est pas le cas. Si je modifie le PHP après l'instruction if, rien ne change. Mais si je modifie le PHP dans l'instruction else, cela fonctionne:

Cela ne marche pas:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/CHANGE'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/page-header'); ?>
<?php endif ?>

Cela fonctionne:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/CHANGE'); ?>
<?php endif ?>

Je pense que la fonction WooCommerce pourrait ne pas être correctement définie, car cela fonctionne aussi:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
8
Heather

Note: Pour un nouveau, plus complet, meilleur et plus ou moins officiel, veuillez regarder la réponse de kontur . Comme il a commenté , cela pourrait également être fait avec la vérification de classe.


Votre édition m’a amené à cette idée, il n’existe aucune fonction appelée "woocommerce", il existe une classe "WooCommerce" cependant. Une chose à prendre en compte est que la vérification doit être assez tardive pour que les plug-ins soient réellement initialisés, sinon - évidemment - la classe n'existera pas et la vérification retournera false. Donc, votre chèque devrait ressembler à ceci:

if ( class_exists( 'WooCommerce' ) ) {
  // some code
} else {
  / more code
}

Sur la page de documentation de WooCommerce " Création d’un plugin pour WooCommerce " j’ai trouvé ceci:

/**
 * Check if WooCommerce is active
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Put your plugin code here
}

Personnellement, je pense que ce n'est pas aussi fiable que de vérifier pour la classe. Pour des raisons évidentes, que se passe-t-il si le nom du dossier/fichier est différent, mais devrait également fonctionner correctement? En plus, si vous le faites comme ceci, alors vous pouvez utiliser une fonction API, nommée de manière appropriée - is_plugin_active() . Mais comme il n’est normalement disponible que sur les pages d’administrateur, vous devez le rendre disponible en incluant wp-admin/includes/plugin.php, où réside la fonction. En l'utilisant, le chèque ressemblerait à ceci:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}
13
Nicolai

La plupart des plugins officiels de WooCommerce résolvent ce problème en recherchant la constante WC_VERSION, définie par WooCommerce, une fois que tous les plugins ont été chargés. Code simplifié:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // no woocommerce :(
    } else {
        var_dump("WooCommerce installed in version", WC_VERSION);
    }
}

L'avantage supplémentaire est que vous pouvez utiliser la fonction version_compare() de PHP pour vérifier si une nouvelle version de WooCommerce suffisamment installée est installée (si votre code nécessite des fonctionnalités spécifiques), car la constante WC_VERSION convient à cela.

5
kontur

Pour améliorer les réponses données, nous utilisons ceci:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Put your plugin code here
}

Cela évite deux problèmes:

  • WooCommerce en cours d'installation dans un répertoire non standard - auquel cas if ( in_array( 'woocommerce/woocommerce.php', apply_filters(... ne fonctionne pas.
  • Cette vérification étant appelée avant le chargement de WooCommerce - auquel cas if ( class_exists( 'WooCommerce' ) ) { .. } ne fonctionne pas.
3
Jan Żankowski

Vous pouvez envelopper votre plugin dans une vérification pour voir si WooCommerce est installé et actif ou non:

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce is active.';
} else {
echo 'WooCommerce is not Active.';
}
0
Prem Tiwari