Cum verifici dacă un plugin (WooCommerce) este activ?
Încerc să modific header-ul și footer-ul paginilor WooCommerce. Am o instrucțiune if
care ar trebui să țintească magazinul și coșul WooCommerce, dar nu funcționează. Dacă modific PHP-ul după instrucțiunea if
nu se schimbă nimic. Dar dacă modific PHP-ul în instrucțiunea else
funcționează:
Aceasta nu funcționează:
<?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 ?>
Aceasta funcționează:
<?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 ?>
Cred că funcția WooCommerce nu este definită corect, deoarece și aceasta funcționează:
<?php if (is_cart() || is_shop()): ?>
<?php get_template_part('inc/header-shop'); ?>
<?php else: ?>
<?php get_template_part('inc/page-header'); ?>
<?php endif ?>

Editarea ta m-a adus la această idee, într-adevăr nu există o funcție numită »woocommerce«, dar există o clasă »WooCommerce
«. Un lucru de care trebuie să ții cont este că verificarea trebuie să se facă suficient de târziu, astfel încât plugin-urile să fie deja inițializate, altfel - evident - clasa nu va exista și verificarea va returna false
. Deci verificarea ta ar trebui să arate astfel:
if ( class_exists( 'WooCommerce' ) ) {
// codul tău aici
} else {
// alt cod
}
Pe pagina de documentație WooCommerce »Crearea unui plugin pentru WooCommerce« am găsit acest lucru:
/**
* Verifică dacă WooCommerce este activ
**/
if (
in_array(
'woocommerce/woocommerce.php',
apply_filters( 'active_plugins', get_option( 'active_plugins' ) )
)
) {
// Pune codul pluginului tău aici
}
Personal, cred că nu este la fel de fiabilă ca verificarea clasei. Din motive evidente, ce se întâmplă dacă numele folderului/fișierului este diferit, dar ar trebui să funcționeze și așa. În plus, dacă faci așa, atunci există o funcție API pe care o poți folosi, numită potrivit is_plugin_active()
. Dar, deoarece este disponibilă în mod normal doar pe paginile de administrare, trebuie să o faci disponibilă prin includerea fișierului wp-admin/includes/plugin.php
, unde se află funcția. Folosind-o, verificarea ar arăta astfel:
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
// codul tău aici
} else {
// alt cod
}

Aceasta ar putea fi un joc distractiv de "petrecere", găsind alte metode ;-) Permite-mi să mă alătur cu if( function_exists( 'WC' ) )
, dar este mai precis să ai numele plugin-ului în verificarea clasei, așa cum ai sugerat ;-)

Este un joc distractiv de petrecere :) Presupun că vorbești ipotetic, pentru că, din câte știu eu, nu există funcția WC. Deci probabil e vorba de a crește gradul de conștientizare despre function_exists()
. Nu am adăugat-o în răspuns, pentru că OP a acoperit deja acest aspect în întrebarea sa. @birgire

De fapt, această funcție WC()
există, doar încercam să găsesc o cale mai scurtă referindu-mă la ea ;-) Cred că ar fi mai precis cu if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) )
;-). Continuând jocul, am putea testa și constante (de ex. WOOCOMMERCE_VERSION
) sau acțiuni (de ex. did_action( 'woocommerce_loaded' )
) ;-) @ialocin

Adevărat, la urma urmei există o mulțime de posibilități! @birgire

Da, am înțeles :) Deci WPSE este cam versiunea online a »99 de moduri de a-ți rezolva problemele PHP/WordPress« - a trebuit să o formulez, să o fac oficială :) @birgire

Acest răspuns NU este de încredere. Deoarece nici întrebarea, nici răspunsul nu specifică în mod explicit contextul, este posibil ca WooCommerce să fie activ, dar încărcat după acest cod. De exemplu, într-un alt plugin care se încarcă întâmplător înainte. Verificarea clasei sugerate este mult mai sigură, dacă o înfășurați suplimentar în hook-ul plugins_loaded. Adică înfășurați condiția if într-o funcție check_for_woocommerce()
și înregistrați-o cu add_action('plugins_loaded', 'check_for_woocommerce');

Multe dintre plugin-urile oficiale WooCommerce rezolvă acest lucru prin verificarea constantei WC_VERSION
, pe care WooCommerce o definește, după ce toate plugin-urile s-au încărcat. Cod simplificat:
add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
if (!defined('WC_VERSION')) {
// nu există WooCommerce :(
} else {
var_dump("WooCommerce instalat în versiunea", WC_VERSION);
}
}
Bonusul adăugat este că poți folosi funcția PHP version_compare()
pentru a verifica în continuare dacă este instalată o versiune suficient de nouă de WooCommerce (dacă codul tău necesită funcționalități specifice), deoarece constanta WC_VERSION este potrivită pentru aceasta.

Pentru a îmbunătăți răspunsurile oferite, folosim următoarea abordare:
$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
// Puneți codul plugin-ului aici
}
Aceasta preîntâmpină două probleme:
- WooCommerce instalat într-un director nestandard - caz în care
if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...
nu funcționează. - Această verificare este invocată înainte ca WooCommerce să fie încărcat - caz în care
if ( class_exists( 'WooCommerce' ) ) { .. }
nu funcționează.

Acest răspuns este util pentru dezvoltatorii de plugin-uri, deoarece poți pur și simplu să înfășori întregul fișier principal al plugin-ului tău cu această instrucțiune IF.

Am găsit acest lucru util din documentația pentru dezvoltatorii WooCommerce.
Puteți apela simplu funcția is_woocommerce_active()
în fișierul pluginului dumneavoastră.
Exemplu
if ( ! is_woocommerce_active() )
{
add_action( 'admin_notices', 'WC_Subscriptions::woocommerce_inactive_notice' );
return;
}
is_woocommerce_active definit după cum urmează conform documentației WooCommerce
/**
* Verifică dacă WooCommerce este activat
*/
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
function is_woocommerce_activated() {
if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
}
}

Soluția pe care o folosesc în 2021:
add_action( 'admin_init', 'my_plugin_check_if_woocommerce_installed' );
function my_plugin_check_if_woocommerce_installed() {
// Dacă WooCommerce NU este instalat, dezactivează pluginul
if ( is_admin() && current_user_can( 'activate_plugins') && !is_plugin_active( 'woocommerce/woocommerce.php') ) {
// Afișează notificarea de eroare care poate fi închisă
add_action( 'admin_notices', 'my_plugin_woocommerce_check_notice' );
// Dezactivează acest plugin
deactivate_plugins( plugin_basename( __FILE__) );
if ( isset( $_GET['activate'] ) ) {
unset( $_GET['activate'] );
}
}
// Dacă WooCommerce este instalat, activează pluginul și continuă procesarea
elseif ( is_admin() && is_plugin_active( 'woocommerce/woocommerce.php') ) {
// Continuă procesarea aici
}
}
// Afișează notificarea de eroare care poate fi închisă dacă WooCommerce nu este prezent
function my_plugin_woocommerce_check_notice() {
?>
<div class="alert alert-danger notice is-dismissible">
<p>Ne pare rău, dar acest plugin necesită WooCommerce pentru a funcționa.
Vă rugăm să vă asigurați că WooCommerce este atât instalat, cât și activat.
</p>
</div>
<?php
}
Codul rulează pe acțiunea 'admin_init', în loc de 'register_activation_hook', deoarece are nevoie ca WooCommerce să fie încărcat și detectat cu succes. Astfel, dacă WooCommerce NU este detectat, face următoarele:
a) Afișează administratorului o notificare de eroare care poate fi închisă, despre absența WooCommerce. Aceasta este o abordare elegantă, deoarece nu folosește 'wp_die'.
b) Dezactivează automat pluginul personalizat.
Dacă WooCommerce este detectat, puteți continua cu adăugarea de link-uri în meniu, etc., după cum este necesar.
ATENȚIE:
Soluția de mai sus funcționează cu presupunerea că numele de bază al pluginului WooCommerce și fișierul său principal rămân "woocommerce". Dacă acest lucru s-ar schimba în viitor, atunci verificările vor eșua. Deci, pentru a face acest cod să funcționeze atunci, ar trebui actualizat numele directorului WooCommerce și numele fișierului principal din codul de mai sus, în cadrul verificărilor
if
șielseif
.Rețineți că dacă atât WooCommerce, cât și pluginul dumneavoastră sunt instalate și rulează cu succes, atunci dacă dezactivați WooCommerce din orice motiv, acest lucru va determina și dezactivarea automată a pluginului dumneavoastră.

Acest cod este pentru suportul multisite.
$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 ) {
}

Puteți înfășura plugin-ul într-o verificare pentru a vedea dacă WooCommerce este instalat și activ sau nu:
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) {
echo 'WooCommerce este activ.';
} else {
echo 'WooCommerce nu este activ.';
}
