Wie verwende ich Klassen, die in einem anderen Plugin deklariert sind?


10

Ich entwickle ein Wordpress Woocommerce Plugin. In meiner lokalen Umgebung funktioniert es einwandfrei, aber ich habe Probleme beim Hinzufügen des Plugins zu einer Replik der Produktumgebung. Ich bin neu in WordPress und nicht sehr vertraut mit Webentwicklern (ich bin ein Java-Programmierer).

In der Plugin-Datei instanziiere ich eine Klasse aus dem Woocommerce-Plugin-Paket wie folgt:

$coupon = new WC_Coupon($some_code);

In der lokalen Umgebung (PHP 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) ist es in Ordnung. In der Produktionsumgebung (PHP 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) habe ich den folgenden Fehler:

Fatal error: Class 'WC_Coupon' not found

Ich habe versucht, die Datei einzuschließen, in der die WC_Coupon-Klasse definiert ist, aber dann wird der Fehler

Fatal error: Cannot redeclare class WC_Coupon

Was ist also der richtige Weg, um Klassen zu verwenden, die in einem anderen Plugin deklariert sind?

Hinweis: Ein Upgrade ist derzeit nicht möglich.

Antworten:


10

Sie müssen überprüfen, ob die Klasse vorhanden ist, aber vorher müssen Sie warten , bis alle Plugins geladen sind: Niemand kann sicherstellen, dass Ihr Plugin nach WooCommerce geladen wird.

Zum Ausführen eines Codes vom Plugin, wenn alle Plugins geladen sind plugins_loaded.

Beachten Sie, dass Sie diesen Hook nicht in einem Thema verwenden können, da dieser Hook beim Laden des Themas bereits ausgelöst wurde.

add_action('plugins_loaded', 'my_coupon_init');

function my_coupon_init() {
  if ( class_exists('WC_Coupon') ) {
    $coupon = new WC_Coupon($some_code);
    // some code here
  } else {
    add_action('admin_notices', 'wc_not_loaded');
  }
}

function wc_not_loaded() {
    printf(
      '<div class="error"><p>%s</p></div>',
      __('Sorry cannot create coupon because WooCommerce is not loaded')
    );
}

Ich bin mir nicht sicher, ob in diesem Fall plugins_loadedder richtige Haken ist. Man wird suchen müssen , wenn genau diese Klasse in verfügbar und Haken nach , dass. Wie auch immer +1
Kaiser

In diesem speziellen Fall hänge ich an den Deaktivierungshaken register_deactivation_hook( __FILE__, 'deactivate');. Also kann ich nicht warten. Kann ich WordPress bitten, die Klasse zu laden, wenn sie noch nicht geladen ist?
Znat

2
Danke @kaiser. Das WC_Couponwird von __constructder Hauptklasse geladen WooCommerce(wirklich von der includes()Methode, die direkt von aufgerufen wird __construct) und die WooCommerceKlasse ist instanziiert (als Singleton), sobald das Plugin geladen wird. So plugins_loadedist der richtige Haken in diesem Fall;)
gmazzap

Anonym vor Kernlasten? Gut gemacht Woo, gut gemacht.
Kaiser

@ NathanZ Check class_exists( 'WC_Coupon' ). Bitte geben Sie auch an, dass Sie dies während der Deaktivierung verwenden ... es hätte viel Zeit sparen können, der Menge zu antworten ...
Kaiser

6

Dies ist zu spät, aber ich möchte mitteilen, wie Woocommerce und seine Klassen verwendet werden, ohne dass eine Fehlerklasse nicht gefunden wird.

Überprüfen Sie zunächst, ob Woocommerce installiert ist, und verwenden Sie den Aktionshakenwoocommerce_loaded .

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

    add_action('woocommerce_loaded' , function (){
         //Put your code here that needs any woocommerce class 
         //You can also Instantiate your main plugin file here 
    });

}

Ich hoffe das hilft jemandem.


3

Der richtige Weg wäre:

 if( class_exists('WC_Coupon') ) $coupon = new WC_Coupon($some_code);

Es ist besser zu überprüfen, ob eine Klasse vorhanden ist, bevor Sie sie verwenden. Sie vermeidet schwerwiegende Fehler, wenn das Plugin deaktiviert ist.

Sie können eine Klasse, die in PHP nicht zulässig ist, nicht erneut deklarieren.

Sie können die Klasse auch erweitern:

class My_WC_Coupon extends WC_Coupon {
   //some code
   //some hook
}

Aber die meiste Zeit und in diesem Fall mit WooCommerce sollten Sie besser einen Haken in der Dokumentation finden, der den Job erledigt.


1
Wenn Sie Ihre Klasse über einen Hook erweitern, existiert die neue Klasse dann nicht nur im Bereich des Funktions-Hooks?
Alexg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.