How to create a widgetized sidebar for every category dynamically?

I want to display a different content in sidebar for every category, but as I create new categories I have to create the area for it. How can I have the widget areas dynamically?

Related posts

Leave a Reply

1 comment

  1. Not a good thing if you have a lot of categories, so be careful!

    First, add the following function in functions.php:

    add_action( 'widgets_init', 'generate_widget_areas' );
    
    function generate_widget_areas() {
    
    //Do not create for uncategorized category
    $terms = get_categories('exclude=1&hide_empty=0'); 
    
    foreach ($terms as $term) {
       register_sidebar( array(
        'name' => 'Category '.$term->name,
        'id' => $term->slug.'-widget-area',
        'description' => 'Widget area for category and posts in '.$term->name,
        'before_widget' => '<li id="%1$s" class="widget-container %2$s">',
        'after_widget' => '</li>',
        'before_title' => '<h3 class="widget-title">',
        'after_title' => '</h3>'    ) );
      }
    }
    

    This is enough, now in Widgets you have a widget area for every category. Now you have to show the area for the category. I like to display the area for categories listings (categories posts listings) and the same area for posts using the category as well (single posts pages).

    In sidebar.php, add:

    <?php if (is_category() ||is_archive()||is_single()) : ?>
    <div id="categories" class="widget-area" role="complementary">
    <ul class="xoxo">
      <?php
       $category = get_the_category();
       if (in_category($category[0]->slug) || is_category($category[0]->slug)){
            dynamic_sidebar( $category[0]->slug.'-widget-area' );
        };
       ?>
    </ul>
    </div><!-- #categories .widget-area -->
    <?php endif; ?>
    

    That’s all, I bet someone can came up with a better code, by now this does the trick.