web-dev-qa-db-ja.com

カテゴリごとにウィジェット付きサイドバーを動的に作成する方法

カテゴリごとにサイドバーに異なるコンテンツを表示したいのですが、新しいカテゴリを作成するときには、そのための領域を作成する必要があります。ウィジェットエリアを動的に設定する方法

3
Diana

あなたがたくさんのカテゴリーを持っているならば、良いことではないので、注意してください!

まず、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>'    ) );
  }
}

これで十分です。現在のウィジェットでは、すべてのカテゴリにウィジェット領域があります。今度はカテゴリのための区域を示さなければならない。私はカテゴリのリストのための領域(カテゴリの投稿のリスト)とカテゴリを使用している投稿のための同じ領域(単一の投稿ページ)を表示するのが好きです。

sidebar.phpに以下を追加します。

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

それがすべてです、私は誰かがより良いコードを思い付くことができると思います、今ではこれがトリックをします。

3
Diana