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


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
Один лайнер: addgery ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Захарі Шусслер

3
Ці однолінійки мають серйозний недолік, що якщо користувачі хочуть видалити видалення запускати, вони не можуть, оскільки не існує функції підключення, яку можна видалити.
Елліот

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.