Come verificare se un plugin (WooCommerce) è attivo?
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 ?>

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
}

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

È 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

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

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

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

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.

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.

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

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

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:
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 controlloelseif
.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.

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

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.';
}
