Функция пользовательского виджета в плагине не работает?


Я взял код прямо из одной из моих тем, которые я создал, и это список всех 50 состояний в неупорядоченном списке, упакованном в виджет, который вы можете просто перетащить на боковую панель.

Проблема в том, что когда я пытаюсь использовать этот код в файле плагина, я получаю следующую ошибку:

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

Почему это должно работать в теме, но не в плагине? Кстати, активная тема - ЭТО НЕ та тема, из которой я взял код.

Вот мой код: http://pastebin.com/ZeRWW3yb

Спасибо.

Author: Jared, 2011-02-24

2 answers

Попробуйте заменить:

register_widget('States_Widget');

С помощью:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
 16
Author: Bainternet, 2011-02-24 22:02:27

Предположим, что вам нужно инициализировать виджет внутри метода класса, передав имя виджета в качестве аргумента. Для этого вы должны сделать следующее:

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

Обратите внимание, что нам нужно передать имя переменной $widget_name нашей лямбда-функции, чтобы использовать ее. Часть, делающая это, use (&$widget_name). Как уже отмечалось, крючки, инициализированные подобным образом, не могут быть удалены remove_action.

 1
Author: toni_lehtimaki, 2019-08-26 11:00:56