Custom Widget Funktion im Plugin funktioniert nicht?

15

Ich habe einen Code direkt aus einem meiner von mir erstellten Themes genommen und es ist eine Liste aller 50 Status in einer ungeordneten Liste, die in ein Widget gepackt ist, das Sie einfach auf die Seitenleiste ziehen und dort ablegen können.

Wenn ich versuche, diesen Code in einer PLUGIN-Datei zu verwenden, wird der folgende Fehler angezeigt:

Fatal error: Call to a member function register() on a non-object in C:\xampp\htdocs\wordpress\wp-includes\widgets.php on line 431

Warum sollte es im Theme funktionieren, aber nicht im Plugin? Übrigens ist das aktive Thema NICHT das Thema, aus dem ich den Code entfernt habe.

Hier ist mein Code: http://pastebin.com/ZeRWW3yb

Vielen Dank.

Jared
quelle

Antworten:

15

versuche zu ersetzen:

register_widget('States_Widget');

mit:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
Bainternet
quelle
Ich
bin
2
Einzeilig: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");');
Zachary Schuessler
3
Diese Einzeiler haben den schwerwiegenden Nachteil, dass Benutzer, die remove_action ausgeben möchten, dies nicht können, da es keine Hook-Funktion gibt, die entfernt werden kann.
Elliot
1

Angenommen, Sie müssen ein Widget innerhalb einer Klassenmethode initialisieren, indem Sie den Widgetnamen als Argument übergeben. Um dies zu erreichen, würden Sie dies tun:

class WidgetMonster {
    /**
     * Register widget via PHP lambda function as an argument to the add_action function
     * @var $widget_name string | WP_Widget.
     */
    public static function register_widget_helper( $widget_name ) {
        add_action('widgets_init',
            function() use ( &$widget_name ) {
                return register_widget( $widget_name );
            }
        );
    }
}

Beachten Sie, dass wir den Variablennamen $widget_namean unsere Lambda-Funktion übergeben müssen, um ihn zu verwenden. Der Teil, der dies tut, ist use (&$widget_name). Wie bereits erwähnt, können so initialisierte Hooks von nicht entfernt werden remove_action.

toni_lehtimaki
quelle