Wie überprüfe ich, ob ein Plugin (WooCommerce) aktiv ist?

9

Ich versuche, Kopf und Fuß meiner WooCommerce-Seiten zu ändern. Ich habe eine ifErklärung, die auf den Shop und den Warenkorb von WooCommerce abzielen soll, aber nicht. Wenn ich das PHP nach der ifAnweisung ändere, ändert sich nichts. Aber wenn ich das PHP in der elseAnweisung ändere, funktioniert es:

Das funktioniert nicht:

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

Das funktioniert:

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

Ich denke, die Funktion WooCommerce ist möglicherweise nicht richtig definiert, da dies auch funktioniert:

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

Antworten:

18

Hinweis: Für einen neuen, vollständigeren, besseren und mehr oder weniger offiziellen Weg werfen Sie bitte einen Blick auf die Antwort von kontur . Wie er kommentierte , könnte dies auch mit dem Klassencheck geschehen.


Ihre Bearbeitung hat mich auf diese Idee gebracht, es gibt in der Tat keine Funktion namens »Woocommerce«, aber es gibt eine Klasse » WooCommerce«. Beachten Sie, dass die Prüfung zu spät erfolgen muss, damit die Plug-Ins tatsächlich initialisiert werden. Andernfalls existiert die Klasse offensichtlich nicht und die Prüfung kehrt zurück false. Ihr Scheck sollte also so aussehen:

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

Auf der WooCommerce-Dokumentationsseite » Plugin für WooCommerce erstellen « habe ich Folgendes gefunden:

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

Persönlich denke ich, dass es bei weitem nicht so zuverlässig ist, wie nach der Klasse zu suchen. Was ist aus offensichtlichen Gründen, wenn der Ordner- / Dateiname unterschiedlich ist, aber auch einwandfrei funktionieren sollte? Außerdem, wenn Sie es so machen, gibt es eine API-Funktion, die Sie verwenden können, passend benannt is_plugin_active(). Da es normalerweise nur auf Administrationsseiten verfügbar ist, müssen Sie es verfügbar machen, indem Sie angeben wp-admin/includes/plugin.php, wo sich die Funktion befindet. Mit ihm würde der Scheck folgendermaßen aussehen:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}
Nicolai
quelle
3
Dies könnte ein lustiges "Party" -Spiel sein, bei dem andere Wege gefunden werden ;-) Lassen Sie mich mitmachen if( function_exists( 'WC' ) ), aber es ist genauer, den Plugin-Namen in der Klassenprüfung zu haben, wie Sie vorgeschlagen haben ;-)
birgire
2
Eigentlich WC() existiert diese Funktion , ich habe nur versucht, einen kürzeren Weg zu finden, indem ich mich darauf bezog ;-) Ich denke, es wäre genauer mit if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Mitspielen könnten wir auch auf Konstanten (zB WOOCOMMERCE_VERSION) oder Aktionen (zB did_action( 'woocommerce_loaded' )) testen
;-)
1
Es stimmt, am Ende des Tages gibt es viele Möglichkeiten! @ Birgire
Nicolai
1
Ja, los geht's :) WPSE ist also eine Art Online-Version von »99 Möglichkeiten, um Ihre PHP / WorPress-Probleme zu lösen« - ich musste es prägen, um es offiziell zu machen :) @birgire
Nicolai
2
Diese Antwort ist NICHT zuverlässig. Da weder die Frage noch die Antwort den Kontext explizit angeben, ist es möglich, dass WooCommerce aktiv ist, aber nach diesem Code geladen wird. Zum Beispiel in einem anderen Plugin, das zufällig vorher geladen wird. Die vorgeschlagene Klassenprüfung ist viel zuverlässiger, wenn Sie sie zusätzlich in plugins_loaded hook einschließen . Dh die if-Klausel in eine check_for_woocommerce()Funktion einwickeln und beiadd_action('plugins_loaded', 'check_for_woocommerce');
kontur 30.10.17
6

Viele der offiziellen WooCommerce-Plugins lösen dieses Problem, indem sie nach dem WC_VERSIONLaden aller Plugins nach der von WooCommerce definierten Konstante suchen. Vereinfachter Code:

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

Der zusätzliche Bonus besteht darin, dass Sie mithilfe version_compare()von PHPs weiter prüfen können, ob eine ausreichend neue Version von WooCommerce installiert ist (wenn für Ihren Code bestimmte Funktionen erforderlich sind), da die Konstante WC_VERSION dafür geeignet ist.

kontur
quelle
Das ist ein wirklich guter Weg. Guter Tipp für Plugin-Entwickler.
Jacob Raccuia
3

Um die gegebenen Antworten zu verbessern, verwenden wir Folgendes:

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

Dies verhindert zwei Probleme:

  • WooCommerce wird in einem nicht standardmäßigen Verzeichnis installiert - in diesem Fall if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...funktioniert es nicht.
  • Diese Prüfung wird aufgerufen, bevor WooCommerce geladen wird. In diesem Fall if ( class_exists( 'WooCommerce' ) ) { .. }funktioniert dies nicht.
Jan Żankowski
quelle
Diese Antwort ist nützlich für Plugin-Entwickler, da Sie einfach Ihre gesamte Plugin-Hauptdatei mit dieser IF-Anweisung umschließen können.
Dave Hilditch
Dies war die einzige Lösung, die in meinem Plugin für mich funktioniert hat! Vielen Dank!!!
Sam
1

Ich fand dies nützlich aus der WooCommerce-Entwicklerdokumentation.

Sie können einfach die is_woocommerce_active()Funktion in Ihrer Plugin-Datei aufrufen .

Beispiel

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

is_woocommerce_active wie in der woo-Dokumentation definiert

/**
 * 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
quelle
0

Sie können Ihr Plugin in eine Überprüfung einwickeln, um festzustellen, ob WooCommerce installiert und aktiv ist oder nicht:

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
quelle
2
Dies funktioniert nicht mit Multisites
Andrew Lazarus
@ AndrewLazarus Vielen Dank, dass Sie das erwähnt haben - ich habe gerade eine Stunde durch dieses Problem verloren! :)
Wickywills