插件中的自定义小部件功能不起作用?


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

谢谢。

Answers:


15

尝试更换:

register_widget('States_Widget');

与:

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

很高兴我可以提供帮助
Bainternet,2011年

2
单行代码:add_action('widgets_init',create_function('','return register_widget(“ States_Widget”);'));
Zachary Schuessler

3
这些单行代码具有严重的缺点,即如果用户要发出remove_action,则不能这样做,因为没有钩子函数可以删除。
Elliot 2014年

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名传递给我们的lambda函数才能使用它。这样做的部分是use (&$widget_name)。如前所述,不能像这样初始化钩子remove_action

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.