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


15

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

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

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

Благодарю.

Ответы:


15

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

register_widget('States_Widget');

с:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}

Рад, что я мог помочь
Bainternet

2
Одна строка: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Захари Шуесслер

3
Эти однострочники имеют серьезный недостаток: если пользователи хотят выполнить команду remove_action, они не могут этого сделать, потому что нет функции, которая может быть удалена.
Эллиот

1

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

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.