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

9

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

Cela ne fonctionne 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 n'est peut-être pas correctement définie, car cela fonctionne également:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
Bruyère
la source

Réponses:

18

Votre montage m'a donné cette idée, il n'y a en effet aucune fonction appelée »woocommerce«, il y a une classe » WooCommerce« cependant. Une chose à savoir est que le chèque doit arriver suffisamment tard pour que les plug-ins soient réellement initialisés, sinon - évidemment - la classe n'existera pas et le chèque reviendra false. Votre chèque devrait donc 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 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. De plus, si vous le faites comme ça, il y a une fonction API que vous pouvez utiliser, qui porte bien son nom is_plugin_active(). Mais parce qu'il n'est normalement disponible que sur les pages d'administration, 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
}
Nicolai
la source
3
Cela pourrait être un jeu de "fête" amusant, trouver d'autres moyens ;-) Permettez-moi de participer if( function_exists( 'WC' ) ), mais il est plus précis d'avoir le nom du plugin dans la vérification de classe, comme vous l'avez suggéré ;-)
birgire
2
En fait, cette fonction WC() existe , j'essayais simplement de trouver un moyen plus court en me référant à elle ;-) Je suppose que ce serait plus précis avec if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). En parallèle, nous pourrions également tester des constantes (par exemple WOOCOMMERCE_VERSION) ou des actions (par exemple did_action( 'woocommerce_loaded' )) ;-) @ialocin
birgire
1
C'est vrai, à la fin de la journée, il y a beaucoup de possibilités! @birgire
Nicolai
1
Ouais, allez-y :) Donc, WPSE est en fait en quelque sorte la version en ligne de »99 façons de résoudre vos problèmes PHP / WorPress« - J'ai dû le monnayer, pour le rendre officiel :) @birgire
Nicolai
2
Cette réponse N'EST PAS fiable. Étant donné que ni la question ni la réponse n'indiquent explicitement le contexte, il est possible que WooCommerce soit actif, mais chargé après ce code. Par exemple, dans un autre plugin, cela arrive d'être chargé auparavant. La vérification de classe suggérée est beaucoup plus fiable, si vous l'enveloppez également dans le crochet plugins_loaded . C'est-à-dire envelopper la clause if dans une check_for_woocommerce()fonction, et l'enregistrer avecadd_action('plugins_loaded', 'check_for_woocommerce');
kontur
6

De nombreux plugins WooCommerce officiels résolvent ce problème en vérifiant la WC_VERSIONconstante, que WooCommerce définit, 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);
    }
}

Le bonus supplémentaire est que vous pouvez utiliser PHP version_compare()pour vérifier davantage si une nouvelle version suffisante de WooCommerce est installée (si votre code nécessite des capacités spécifiques), car la constante WC_VERSION convient à cela.

kontur
la source
c'est un très bon moyen. Bon conseil pour les développeurs de plugins à inclure également.
Jacob Raccuia
3

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 est installé dans un répertoire non standard - auquel cas if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...cela ne fonctionne pas.
  • Cette vérification est invoquée avant le chargement de WooCommerce - auquel cas if ( class_exists( 'WooCommerce' ) ) { .. }cela ne fonctionne pas.
Jan Żankowski
la source
Cette réponse est utile pour les développeurs de plugins car vous pouvez simplement envelopper votre fichier principal de plugin avec cette instruction IF.
Dave Hilditch
C'était la seule solution qui fonctionnait pour moi dans mon plugin! Je vous remercie!!!
Sam
1

J'ai trouvé cela utile dans la documentation du développeur WooCommerce.

Vous pouvez simplement appeler la is_woocommerce_active()fonction dans votre fichier plugin.

Exemple

if ( ! is_woocommerce_active() ) 
{
    add_action( 'admin_notices', 'WC_Subscriptions::woocommerce_inactive_notice' );
    return;
}

is_woocommerce_active défini comme ci-dessous selon la documentation woo

/**
 * Check if WooCommerce is activated
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
Nilesh
la source
0

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.';
}
Prem Tiwari
la source
3
Cela ne fonctionne pas avec les multisites
Andrew Lazarus
@AndrewLazarus Merci d'avoir mentionné cela - je viens de perdre une heure à ce problème! :)
wickywills