3

I have run into an issue trying to use the sidebar args (before_widget,after widget,after_widget,before_widget) as theme style friendly parameters for the function wp_list_bookmarks, that is that the wp_list_bookmarks output will look just as the one inside WP_Widget_Links.

I almost copied verbatim the code of the links widget but when trying to reuse the only one sidebar args (via the global $wp_registered_sidebars) I get some css classes for the widget container that dont show up using the WP_Widget_Links.

For example the following dump of a sidebar args:

'name' => 'Sidebar 1'
'id' => 'sidebar-1'
'before_widget' => '<li id="%1$s" class="widget %2$s">'
'after_widget' => '</li>'  
'before_title' => '<h2 class="widgettitle">'
'after_title' => '</h2>'

By reading the wp code I assumed that is safe to change %1$s, %2$s for %id, %class resp, and then once the wp_list_bookmarks gets executed I should end with before_widget looking like <li id="linkcat-" class="widget linkcat">. But after comparing to the output of the links widget the widget css classname is missing, and the output of my code looks a bit odd in the page.

This is the code where I use the function, which gets called as a filter to sidebars_widgets:

function my_sidebars_widgets($sidebar_widgets) {
    global $wpdb, $wp_registered_sidebars;
    static $hits;
    if(++$hits == 2) {

        $sidebar = array_values($wp_registered_sidebars);

        $before_title = $sidebar[0]['before_title'];
        $after_title = $sidebar[0]['after_title'];
        $before_widget = $sidebar[0]['before_widget'];
        $after_widget = $sidebar[0]['after_widget'];

        $before_widget = str_replace('%2$s','%class',$before_widget);
        $before_widget = str_replace('%1$s','%id',$before_widget);

        wp_list_bookmarks(apply_filters('widget_links_args',array(
            'title_before' => $before_title, 'title_after' => $after_title,
            'category_before' => $before_widget, 'category_after' => $after_widget,
            'hide_invisible' => true,'title_li' => 'Links',
            'categorize' => 0,'inquiry' => true
        )));
    }
    return $sidebar_widgets;
}

Did you have any clue of what Im missing here? I keep trying to get clear how WP feed widgets args but no explanation so far while reading the code.

thanks in advance for any on your considerations.

3
  • Will you post the full output(HTML) of wp_list_bookmarks What are you trying to do exsactly. Are you trying to output a list of bookmarks in your theme or write a plugin? If the former see wp_list_bookmarks
    – Brooke.
    Apr 7, 2011 at 5:52
  • Can you also include the code you use to call wp_list_bookmarks()? You can edit your question to do this, you don't have to do this in a comment.
    – Jan Fabry
    Apr 7, 2011 at 9:33
  • @BandonRandom: thanks for reply, Im defining a plugin. And the output I want is one that gets the theme style. Apr 8, 2011 at 12:41

1 Answer 1

2

After a few var_dumps I know this:

1) When wp_list_bookmarks is called whithin WP_Widget_Links->widget The 'class' parameter is ignored because the 'category_before' parameter doesn't have the %class wildcard. Instead 'category_before' will look as if 'class' where 'widget_links'.

This is how the function dynamic_sidebar set the $before_widget parameters for the widget once it gets called.

Of course this can be altered by filters like 'widget_links_args' or 'dynamic_sidebar_params'.

2) On many themes in order to present default widgets the wp_list_bookmarks is called but with zero parameters then the default values are used as defined in bookmark-template.php:

('class' => 'linkcat','category_before' => '<li id="%id" class="%class">')

and this happen even when the sidebar is registered using:

('before_widget' => '<li id="%1$s" class="widget %2$s">')

which can let to a little inconsistence because WP_Widget_Links 'category_before' parameter is initially borrow from sidebar 'before_widget' parameter.

Your Answer

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

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