Kinderklasse in einem anderen Plugin registrieren

Ich denke, das sollte relativ einfach sein, aber irgendwie kann ich nicht herausfinden, wie das geht. Im Wesentlichen gibt es ein bereits vorhandenes Plugin, das dies tut:

add_action('widgets_init', create_function('', 'register_widget("Foo");')); if ( ! class_exists( 'Foo' ) ) { class Foo extends WP_Widget { /*constructs etc*/ }} 

jetzt möchte ich ein anderes plugin schreiben (extension im wesentlichen), das das obige erweitert. Ich habe versucht, so etwas wie das Folgende zu machen (und habe auch vergeblich versucht, einige Beispiele / Dokumentationen zu finden)

 add_action('widgets_init', create_function('', 'register_widget("Bar");')); class Bar extends Foo { function __construct() { /*do stuff*/ } } 

aber alles was ich je bekommen habe ist

 Fatal error: Class 'Foo' not found in ... 

also nehme ich an, es ist eine Frage davon, dass ‘Bar’ AFTER Foo ausführen soll, aber ich weiß nicht wie.

irgendwelche Hinweise / Ideen / Schnipsel oder auch nur Links zu Dokumenten etc. würde sehr geschätzt werden, da ich an der ersten Hürde hier versage .. 🙁

Solutions Collecting From Web of "Kinderklasse in einem anderen Plugin registrieren"

Ich stelle die Weisheit in Frage, eine class von einem anderen Plugin zu erweitern. Sie haben keine Ahnung, was passiert, wenn das nächste Plugin das nächste Mal aktualisiert wird.

Im Allgemeinen können Sie jedoch steuern, wann in einer Warteschlange eine function ausgeführt wird, indem Sie einen dritten Parameter übergeben – eine Priorität . Übergeben Sie also eine Priorität hoch genug und Ihre function sollte nach der function des anderen Plugins laufen.

 add_action( 'widgets_init', create_function('', 'register_widget("Bar");') ,100 ); 

Ich weiß nicht, ob das in Ihrem Fall funktioniert. Ich habe es nie ausprobiert.

Sie sollten sich darüber im Klaren sein, dass Sie aufgrund der Plugin-Ladefolge Probleme haben könnten.

Ändern der Plugin-Ladereihenfolge
Bedeutet ein aktiviertes Plugin automatisch, dass seine Methoden anderen WP-functionen zur Verfügung stehen?

widget_init nach plugins_loaded , was wahrscheinlich kein Problem für Sie darstellt.

Bei weiterer Untersuchung … bekomme ich Fehler mit fehlenden Variablen, die der Konstrukteur benötigt. Folgendes funktioniert.

 if ( ! class_exists( 'Foo' ) ) { class Foo extends WP_Widget { /*constructs etc*/ function __construct($id = 'twidg', $descr = 'Test Widget', $opts = array()) { $widget_opts = array(); parent::__construct($id,$descr,$widget_opts); /*do stuff*/ } } } function rw_cb() { register_widget("Foo"); } add_action('widgets_init', 'rw_cb'); class Bar extends Foo { function __construct() { $widget_opts = array(); parent::__construct('twidgextended','Test Widget 2',$widget_opts); } } function rw_cb_2() { register_widget("Bar"); } add_action('widgets_init', 'rw_cb_2'); 

Wenn jede Komponente in eine Dummy-Plug-in-Datei eingefügt wird, funktioniert sie. Das einzige Mal, dass ich einen fatalen Fehler bei einer nicht gefundenen classndatei bekomme, ist, wenn ich versuche, das Plugin mit der Bar classndefinition vor dem Plugin mit der Foo Definition zu aktivieren, was Sinn macht.

Wenn Sie diesen Block wie folgt einpacken, wird das Problem jedoch getriggers und Sie können ihn in beliebiger Reihenfolge aktivieren.

 if (class_exists('Foo')) { class Bar extends Foo { function __construct() { $widget_opts = array(); parent::__construct('twidgextended','Test Widget 2',$widget_opts); } } function rw_cb_2() { register_widget("Bar"); } add_action('widgets_init', 'rw_cb_2'); } 

Ach, aber du hast mich in die richtige Richtung weisen (speziell deine zweite Verbindung). das Folgende (zumindest in meinem Szenario) scheint den Trick zu machen. Danke.

  add_action( 'widgets_init', 'extend_foo' ); function extend_foo(){ if (class_exists( 'Foo' ) ) { class Bar extends Foo { function __construct() { parent::__construct(); } } } } 

(obwohl ich mir nicht sicher bin, ob das die eleganteste Art ist, Dinge zu tun … aber wenn es funktioniert ….)