web-dev-qa-db-fra.com

Comment créer une barre latérale sous forme de widget pour chaque catégorie de manière dynamique?

Je souhaite afficher un contenu différent dans l'encadré pour chaque catégorie, mais lorsque je crée de nouvelles catégories, je dois créer la zone correspondante. Comment puis-je avoir les zones de widget dynamiquement?

3
Diana

Pas une bonne chose si vous avez beaucoup de catégories, alors soyez prudent!

Premièrement, ajoutez la fonction suivante dans 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>'    ) );
  }
}

Cela suffit, vous disposez désormais dans Widgets d'une zone de widgets pour chaque catégorie. Maintenant, vous devez afficher la zone pour la catégorie. J'aime afficher la zone pour les listes de catégories (catégories de publications) et la même zone pour les publications utilisant également la catégorie (pages de publications individuelles).

Dans sidebar.php, ajoutez:

<?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; ?>

C'est tout, je parie que quelqu'un peut créer un meilleur code, à présent cela fait l'affaire.

3
Diana