Nie działa funkcja niestandardowego widżetu we wtyczce?

15

Wziąłem kod prosto z jednego z utworzonych przeze mnie motywów i jest to lista wszystkich 50 stanów z nieuporządkowanej listy spakowanej w widżecie, który można po prostu przeciągnąć i upuścić na pasku bocznym.

Problem polega na tym, że gdy próbuję użyć tego kodu w pliku PLUGIN, pojawia się następujący błąd:

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

Dlaczego miałby działać w temacie, ale nie we wtyczce? Nawiasem mówiąc, aktywny motyw NIE jest motywem, z którego wyjąłem kod.

Oto mój kod: http://pastebin.com/ZeRWW3yb

Dzięki.

Jared
źródło

Odpowiedzi:

15

spróbuj zastąpić:

register_widget('States_Widget');

z:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
Bainternet
źródło
Cieszę się, że mogłem pomóc
Bainternet
2
One-liner: add_action ('widgets_init', create_function ('', 'return register_widget („States_Widget”);'));
Zachary Schuessler,
3
Te jednowierszowe mają poważną wadę, że jeśli użytkownicy chcą wydać polecenie remove activity, nie mogą, ponieważ nie ma żadnej zahaczonej funkcji, którą można by usunąć.
Elliot
1

Załóżmy, że musisz zainicjować widget w metodzie klasy, przekazując nazwę widgetu jako argument. Aby to osiągnąć, wykonaj następujące czynności:

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

Zauważ, że musimy $widget_nameużyć nazwy zmiennej do naszej funkcji lambda, aby z niej skorzystać. Częścią tego jest use (&$widget_name). Jak już wspomniano, haczyków zainicjowanych w ten sposób nie można usunąć remove_action.

toni_lehtimaki
źródło