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 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. 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.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.