The dynamic_sidebar_params
filter is called before each widget is displayed, so multiple times in the same sidebar. It filters the $args
and $instance
parameters that will be passed to the widget.
If you only want to execute it for the third widget of a specific sidebar, you should check for the sidebar ID (found in the id
value of the $args
array, which is passed first), and then count the widgets until you arrive at n. There are different ways to do this: you can get all widgets of the current sidebar and compare the ID of the n-th with the one you are filtering now, or you can just count it in your filter, resetting the count when you get a new sidebar name. Or you could replace dynamic_sidebar()
in your template with a call to a function of your own that will first reset the widget count and then start filtering.
This is an example of the second type: counting widgets in the function, resetting the count each time we start a new sidebar:
add_filter( 'dynamic_sidebar_params', 'wpse15024_dynamic_sidebar_params' );
function wpse15024_dynamic_sidebar_params( $params )
{
// These are the targets. Modify them here:
$targeted_sidebar="sidebar-bottom";
$targeted_widget = (int) 3;
static $widget_counter = array();
static $current_sidebar = null;
$args = $params[0];
$instance = $params[1];
if ( $current_sidebar != $args['id'] ) {
$current_sidebar = $args['id'];
$widget_counter[$current_sidebar] = 0;
}
if ( $current_sidebar == $targeted_sidebar && $widget_counter[$current_sidebar] == $targeted_widget ) {
$args['before_widget'] = '<div id="'.@$args['widget_id'].'" class="span-6 last">';
}
$widget_counter[$current_sidebar]++;
return array( $args, $instance );
}