How can I get $id variable in widget’s form function?
According to widget’s structure I see that widget function have $args as a parameter, which will be extracted in function’s body. In my case i want to use $id variable (from extracted $args) which contains current sidebar’s id. How can I make ‘visible’ $id variable in form function? Any ideas?
class Ex_Widget_Example extends WP_Widget {
//constructor goes here
function widget($args, $instance) {extract($args);}
function update($new_instance, $old_instance ) { }
function form( $instance ) {}
}
For example we have sidebar with id ‘my_sidebar’. I put this widget in it. For example my widget function, which we use to output something on page, looks like this:
function widget($args, $instance) {
extract($args);
echo $id; //or just echo $args['id'];
}
So on my page, in my ‘my_sidebar’ sidebar I will see a text ‘my_sidebar’. That’s great. But how can I get this $id or $args[‘id’] in widget’s form function. In class example I see, that only widget function takes $args as argument. I’m not an expert in OOP pragramming, I tried to create a static variable (unsuccessfully), which would keep id value:
class Ex_Widget_Example extends WP_Widget {
public static $widget_id;
//constructor goes here
function widget($args, $instance) {
extract($args);
self::$widget_id = $id;
echo self::$widget_id //here outputs sidebar's id perfectly on my page
}
function update($new_instance, $old_instance ) { }
function form( $instance ) {
echo self::$widget_id //here outputs nothing on my widget's form
}
}
Maybe wordpress call form function first, before widget function, that’s why I can’t see anything on my form ….anyway, any ideas how to solve this problem?
Do you search for
$args['widget_id']
? Just save it in a variable you can access inform()
later.Look at
wp-includes/default-widgets.php
to see how widgets work. Not the best code, but it should give you some hints.As a follow up on @toscho answer, you maybe could get the current sidebar (that holds the widget) via the DB options table:
Not tested
The following worked for me inside the function for the form
Edit: the following also works