Come verificare se un plugin (WooCommerce) è attivo?


9

Sto cercando di modificare la testa e il piede delle mie pagine WooCommerce. Ho una ifdichiarazione che dovrebbe colpire il negozio e il carrello di WooCommerce, ma non lo è. Se modifico il PHP dopo la ifdichiarazione nulla cambia. Ma se modifico il PHP elsenell'affermazione funziona:

Questo non funziona:

<?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 ?>

Questo funziona:

<?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 ?>

Penso che la funzione WooCommerce potrebbe non essere definita correttamente, perché funziona anche:

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

Risposte:


18

La tua modifica mi ha portato a questa idea, in effetti non esiste una funzione chiamata »woocommerce«, tuttavia esiste una classe » WooCommerce«. Una cosa da tenere presente è che il controllo deve essere effettuato abbastanza tardi, in modo che i plug-in siano effettivamente inizializzati, altrimenti - ovviamente - la classe non esiste e il controllo ritorna false. Quindi il tuo assegno dovrebbe assomigliare a questo:

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

Nella pagina della documentazione di WooCommerce » Creazione di un plug-in per WooCommerce « Ho trovato questo:

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

Personalmente penso che non sia così affidabile come controllare per la classe. Per ovvie ragioni, cosa succede se il nome della cartella / del file è diverso, ma dovrebbe funzionare anche bene. Inoltre, se lo fai in questo modo, allora c'è una funzione API che puoi usare, con un nome appropriato is_plugin_active(). Ma poiché è normalmente disponibile solo nelle pagine di amministrazione, è necessario renderlo disponibile includendo wp-admin/includes/plugin.php, dove risiede la funzione. Usandolo il controllo sarebbe simile a questo:

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

3
Questo potrebbe essere un divertente gioco "da festa", trovando altri modi ;-) Fammi partecipare if( function_exists( 'WC' ) ), ma è più preciso avere il nome del plugin nel controllo della classe, come hai suggerito ;-)
birgire

2
In realtà questa funzione WC() esiste , stavo solo cercando di trovare un modo più breve facendo riferimento ad essa ;-) Immagino che sarebbe più preciso con if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Giocando insieme, potremmo anche testare costanti (ad esempio WOOCOMMERCE_VERSION) o azioni (ad esempio did_action( 'woocommerce_loaded' )) ;-) @ialocin
birgire

1
È vero, alla fine della giornata ci sono molte possibilità! @birgire
Nicolai,

1
Sì, vai :) Quindi WPSE è in realtà un po 'la versione online di »99 modi per risolvere i tuoi problemi PHP / WorPress« - Ho dovuto coniare, per renderlo ufficiale :) @birgire
Nicolai

2
Questa risposta NON È affidabile. Poiché né la domanda né la risposta indicano esplicitamente il contesto, è possibile che WooCommerce sia attivo, ma caricato dopo questo codice. Ad esempio in un altro plug-in, succede che sia caricato prima. Il controllo di classe suggerito è molto più affidabile, se lo avvolgi ulteriormente in hook plugins_loaded . Vale a dire racchiudere la clausola if in una check_for_woocommerce()funzione e registrarla conadd_action('plugins_loaded', 'check_for_woocommerce');
kontur il

6

Molti plugin ufficiali di WooCommerce risolvono questo problema controllando la WC_VERSIONcostante, definita da WooCommerce, una volta caricati tutti i plugin. Codice semplificato:

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

Il vantaggio aggiuntivo è che puoi usare i PHP version_compare()per verificare ulteriormente se è installata una versione abbastanza nuova di WooCommerce (se il tuo codice richiede capacità specifiche), poiché la costante WC_VERSION è adatta a questo.


questo è davvero un buon modo Un buon consiglio da includere anche per gli sviluppatori di plugin.
Jacob Raccuia,

3

Per migliorare le risposte fornite, stiamo usando questo:

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

Questo impedisce due problemi:

  • WooCommerce viene installato in una directory non standard, nel qual caso if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...non funziona.
  • Questo controllo viene invocato prima del caricamento di WooCommerce, nel qual caso if ( class_exists( 'WooCommerce' ) ) { .. }non funziona.

Questa risposta è utile per gli sviluppatori di plug-in poiché puoi semplicemente racchiudere l'intero file principale del plug-in con questa istruzione IF.
Dave Hilditch il

Questa è stata l'unica soluzione che ha funzionato per me nel mio plugin! Grazie!!!
Sam,

1

L'ho trovato utile dalla documentazione per sviluppatori di WooCommerce.

Puoi semplicemente chiamare la is_woocommerce_active()funzione nel tuo file plugin.

Esempio

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

is_woocommerce_active definito come di seguito secondo la documentazione di 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; }
    }
}

0

Puoi avvolgere il tuo plugin in un segno di spunta per vedere se WooCommerce è installato e attivo o meno:

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

3
Questo non funziona con i siti multipli
Andrew Lazarus,

@AndrewLazarus Grazie per averlo menzionato: ho perso un'ora per questo problema! :)
wickywills
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.