15

I took a code straight out of one of my themes I created, and it's a list of all 50 states in an unordered list packed into a widget you can just drag and drop on the sidebar.

The problem is, when I try using this code in a PLUGIN file, I get the following error:

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

Why would it work in the theme, but not in the plugin? By the way, the active theme is NOT the theme I took the code out of.

Here's my code: http://pastebin.com/ZeRWW3yb

Thanks.

2 Answers 2

16

try replacing :

register_widget('States_Widget');

with:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
3
  • Glad i could help
    – Bainternet
    Commented Feb 24, 2011 at 22:21
  • 2
    One-liner: add_action('widgets_init', create_function('', 'return register_widget("States_Widget");')); Commented Aug 13, 2012 at 13:23
  • 3
    Those one-liners have the severe disadvantage that if users want to issue remove_action, they can't, because there is no hooked function that can be removed.
    – Elio
    Commented Oct 7, 2014 at 22:20
1

Let us assume that you need to initialize a widget inside a class method by passing the widget name as an argument. To accomplish this you would do this:

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

Note that we need to pass the variable $widget_name name to our lambda function in order to use it. The part doing this is use (&$widget_name). As already noted hooks initialized like this cannot be removed by remove_action.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.