Come verificare se un plugin (WooCommerce) è attivo?

8 lug 2015, 23:47:48
Visualizzazioni: 31.1K
Voti: 14

Sto cercando di modificare l'header e il footer delle mie pagine WooCommerce. Ho un'istruzione if che dovrebbe individuare il negozio e il carrello di WooCommerce, ma non funziona. Se modifico il PHP dopo l'istruzione if non cambia nulla. Ma se modifico il PHP nell'istruzione else 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é anche questo funziona:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
0
Tutte le risposte alla domanda 7
7
27

La tua modifica mi ha portato a questa idea, in effetti non esiste una funzione chiamata »woocommerce«, ma c'è una classe »WooCommerce«. Una cosa da tenere a mente è che il controllo deve avvenire abbastanza tardi, in modo che i plugin siano effettivamente inizializzati, altrimenti - ovviamente - la classe non esisterà e il controllo restituirà false. Quindi il tuo controllo dovrebbe essere così:

if ( class_exists( 'WooCommerce' ) ) {
  // del codice
} else {
  // altro codice
}

Nella pagina della documentazione di WooCommerce »Creare un plugin per WooCommerce« ho trovato questo:

/**
 * Verifica se WooCommerce è attivo
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Inserisci qui il codice del tuo plugin
}

Personalmente penso che non sia affidabile quanto il controllo della classe. Per ovvi motivi, cosa succede se il nome della cartella/file è diverso, ma dovrebbe funzionare comunque. Inoltre, se lo fai in questo modo, c'è una funzione API che puoi usare, opportunamente chiamata is_plugin_active(). Ma poiché normalmente è disponibile solo nelle pagine di amministrazione, devi renderla disponibile includendo wp-admin/includes/plugin.php, dove risiede la funzione. Usandola, il controllo sarebbe così:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // del codice
} else {
  // altro codice
}
9 lug 2015 00:02:17
Commenti

Potrebbe essere un divertente gioco "da festa", trovare altri modi ;-) Fammi unire con if( function_exists( 'WC' ) ), ma è più preciso avere il nome del plugin nel controllo della classe, come hai suggerito ;-)

birgire birgire
9 lug 2015 02:05:26

È un divertente gioco da festa :) Immagino tu stia parlando in modo ipotetico, perché AFAIK non esiste una funzione WC. Quindi deve trattarsi di sensibilizzare riguardo a function_exists(). Non l'ho aggiunto alla risposta perché l'OP l'aveva già coperto nella sua domanda. @birgire

Nicolai Grossherr Nicolai Grossherr
9 lug 2015 11:16:21

In realtà questa funzione WC() esiste, stavo solo cercando un modo più breve riferendomi ad essa ;-) Immagino che sarebbe più preciso con if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) ) ;-). Continuando a giocare, potremmo anche testare per costanti (es. WOOCOMMERCE_VERSION) o azioni (es. did_action( 'woocommerce_loaded' )) ;-) @ialocin

birgire birgire
9 lug 2015 11:28:25

Vero, alla fine ci sono tantissime possibilità! @birgire

Nicolai Grossherr Nicolai Grossherr
9 lug 2015 11:32:16

sì, da qui l'idea del gioco di società ;-)

birgire birgire
9 lug 2015 11:33:56

Sì, ho capito :) Quindi WPSE è in pratica la versione online di »99 modi per risolvere i tuoi problemi PHP/WordPress« - Dovevo coniarlo, per renderlo ufficiale :) @birgire

Nicolai Grossherr Nicolai Grossherr
9 lug 2015 11:46:26

Questa risposta NON è affidabile. Dal momento che né la domanda né la risposta dichiarano esplicitamente il contesto, è possibile che WooCommerce sia attivo, ma caricato dopo questo codice. Ad esempio in un altro plugin, che viene caricato prima. Il controllo della classe suggerito è molto più affidabile, se lo avvolgi ulteriormente nel hook plugins_loaded. Ovvero, incapsula l'if-clausola in una funzione check_for_woocommerce(), e registrala con add_action('plugins_loaded', 'check_for_woocommerce');

kontur kontur
30 ott 2017 15:27:35
Mostra i restanti 2 commenti
1

Molti dei plugin ufficiali di WooCommerce risolvono questo problema controllando la costante WC_VERSION, che WooCommerce definisce, una volta che tutti i plugin sono stati caricati. Codice semplificato:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // nessun woocommerce :(
    } else {
        var_dump("WooCommerce installato nella versione", WC_VERSION);
    }
}

Il vantaggio aggiuntivo è che puoi usare la funzione version_compare() di PHP per verificare ulteriormente se è installata una versione sufficientemente recente di WooCommerce (nel caso in cui il tuo codice richieda funzionalità specifiche), dato che la costante WC_VERSION è adatta a questo scopo.

30 ott 2017 15:38:48
Commenti

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

Jacob Raccuia Jacob Raccuia
29 gen 2018 17:11:59
2

Per migliorare rispetto alle risposte fornite, utilizziamo questo codice:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Inserisci qui il codice del tuo plugin
}

Questo previene due problemi:

  • WooCommerce installato in una directory non standard - nel qual caso if ( in_array( 'woocommerce/woocommerce.php', apply_filters(... non funziona.
  • Questo controllo viene invocato prima che WooCommerce sia caricato - nel qual caso if ( class_exists( 'WooCommerce' ) ) { .. } non funziona.
17 nov 2016 13:50:55
Commenti

Questa risposta è utile per gli sviluppatori di plugin poiché puoi semplicemente racchiudere l'intero file principale del tuo plugin con questa istruzione IF.

Dave Hilditch Dave Hilditch
30 apr 2019 11:59:57

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

Sam Sam
19 mag 2019 01:12:45
0

Ho trovato questa informazione utile dalla documentazione per sviluppatori di WooCommerce.

Puoi semplicemente chiamare la funzione is_woocommerce_active() all'interno del tuo file di plugin.

Esempio

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

is_woocommerce_active è definita come segue secondo la documentazione di WooCommerce

/**
 * Verifica se WooCommerce è attivato
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
11 dic 2019 19:22:55
0

Soluzione che utilizzo nel 2021:

add_action( 'admin_init', 'my_plugin_check_if_woocommerce_installed' );
function my_plugin_check_if_woocommerce_installed() {

    // Se WooCommerce NON è installato, disattiva il plugin
    if ( is_admin() && current_user_can( 'activate_plugins') && !is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Mostra un avviso di errore eliminabile
        add_action( 'admin_notices', 'my_plugin_woocommerce_check_notice' );

        // Disattiva questo plugin
        deactivate_plugins( plugin_basename( __FILE__) );
        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }
    }
    // Se WooCommerce è installato, attiva il plugin e procedi con ulteriori elaborazioni
    elseif ( is_admin() && is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Esegui ulteriori elaborazioni qui
    }
}

// Mostra un avviso di errore eliminabile se WooCommerce non è presente
function my_plugin_woocommerce_check_notice() {
    ?>
    <div class="alert alert-danger notice is-dismissible">
        <p>Spiacenti, ma questo plugin richiede WooCommerce per funzionare.
            Assicurati che WooCommerce sia sia installato che attivato.
        </p>
    </div>
    <?php
}

Il codice viene eseguito su 'admin_init', anziché su 'register_activation_hook' perché ha bisogno che WooCommerce sia caricato e rilevato con successo. Quindi, se WooCommerce NON viene rilevato, esegue le seguenti operazioni:

a) Mostra un avviso di errore eliminabile all'amministratore sull'assenza di WooCommerce. Questo è molto elegante in quanto non utilizza 'wp_die'.

b) Disattiva automaticamente il tuo plugin personalizzato.

Se WooCommerce viene rilevato, puoi procedere con l'aggiunta di collegamenti al menu, ecc. come necessario.

AVVERTENZE:

  1. La soluzione sopra indicata funziona presupponendo che il nome principale del plugin WooCommerce e il suo file principale rimangano "woocommerce". Se ciò dovesse cambiare in futuro, i controlli si interromperanno. Quindi, per far funzionare questo codice in quel momento, il nome della directory e il nome del file principale di WooCommerce dovrebbero essere aggiornati nel codice sopra, all'interno del controllo if e del controllo elseif.

  2. Nota che se sia WooCommerce che i tuoi plugin sono installati e funzionanti con successo, allora se dovessi disattivare WooCommerce in qualsiasi momento per qualsiasi motivo, disattiverebbe automaticamente anche il tuo plugin.

2 dic 2021 09:38:05
0

Questo è per il supporto multisito.

$is_active = in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) );

if ( is_multisite() ) {
    if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
        include_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    if ( function_exists( 'is_plugin_active_for_network' ) ) {
        $is_active = is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) || $is_active;
    }
}

if ( $is_active ) {

}
14 gen 2024 21:19:38
2

Puoi racchiudere il tuo plugin in un controllo per verificare se WooCommerce è installato e attivo oppure no:

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce è attivo.';
} else {
echo 'WooCommerce non è attivo.';
}
28 giu 2016 13:36:35
Commenti

Non funziona con i multisiti

Andrew Lazarus Andrew Lazarus
20 ott 2016 14:38:16

@AndrewLazarus Grazie per averlo segnalato - ho appena perso un'ora con questo problema! :)

wickywills wickywills
2 gen 2019 15:27:33