カテゴリごとに月次アーカイブ&タグクラウドを表示させる

まだFOX通信では実装してないんだけど、某サイトで実装したので忘れないように覚書。
そのうちFOX通信にも組み込む…かも?

てことで、カテゴリーアーカイブ毎に月次アーカイブ一覧とタグクラウドを表示させる方法。

日付アーカイブはこちらを参照

カテゴリー別に月別アーカイブを表示する : WordPress | FindxFine -Web制作に関するメモ-

タグクラウドに関しては、例のごとく公式フォーラムに質問と解決方法があったので、
こちらを参照させていただきました。

WordPress › 日本語 » 各カテゴリにタグクラウド

相変わらず公式フォーラムはありがたいです。。。(-人-)

ということで、まずカテゴリごとに月次アーカイブを表示させるために、

Archives for a category WordPress plugin (Kwebble blog)

というプラグインをインストールします。
これは、テンプレートタグwp_get_archivesのパラメータを拡張してくれるプラグインです。
wp_get_archivesで使える基本パラメータは以下の通り。

  • type(月別とか週別とか)
  • limit(リストに表示するリミット)
  • format(アーカイブリストの形式。単なるリストとかドロップダウンリスト使う時のoptionタグとか)
  • before
  • after
  • show_post_count(アーカイブの投稿数)

ざっと眺めてみても、カテゴリーはありません。

ただ、このプラグインを入れると、

<?php wp_get_archives('cat=1&format=option&show_post_count=1'); ?>

のような感じで、パラメータに‘cat’を追加してくれるので、
カテゴリ番号を引数にしてカテゴリごとの月次アーカイブを呼び出すことができるようになります。
 #ちなみに上のコードはドロップダウンリスト用にformat=optionを付けています

インストールから使用までの流れは、
Archives for a category WordPress plugin (Kwebble blog)のDownload the plugin zip fileからzipをダウンロード。
解凍してWordpressのプラグインフォルダにアップロード。
管理画面で有効化すると設定の中に「Kwebble」というメニューが出来ているので、
そこで「Disable canonical URLs.」にチェックを入れて「Update Options」をクリック。

あとは、さっき書いたコードを表示したい所に書いてあげるだけ。
サイドバーに表示させたかった&ドロップダウンにしたかったので、
私の場合はsidebar.phpにこんな感じに書きました。

<?php if (is_single() && in_category('1') || is_archive() && is_category('1') ): ?>
				<h1>月次アーカイブ</h1>
					<div class="sub_navi">
						<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'>
  							<option value=""><?php echo attribute_escape(__('Select Month')); ?></option>
  							<?php wp_get_archives('cat=1&format=option&show_post_count=1'); ?>
						</select>
					</div>
	<?php elseif (is_single() && in_category('2') || is_archive() && is_category('2') ): ?>
				<h1>月次アーカイブ</h1>
					<div class="sub_navi">
						<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'>
  							<option value=""><?php echo attribute_escape(__('Select Month')); ?></option>
  							<?php wp_get_archives('cat=2&format=option&show_post_count=1'); ?>
						</select>
					</div>
	<?php endif; ?>

ドロップダウンの書き方は、WordPress Codex 日本語版のwp_get_archivesを参照しました。
 #ちなみに、表示させたいカテゴリーの分だけ延々と続きます(笑)
 #タグクラウドとの合わせ技は後述

続いて、タグクラウド。
functions.phpに以下のコードを記述して、my_category_tag_cloudというテンプレートタグを追加します。

//カテゴリごとのタグクラウド
function my_category_tag_cloud($args) {
  $defaults = array(
    'smallest' => 8, 'largest' => 20, 'unit' => 'pt', 'number' => 0,
    'format' => 'flat', 'separator' => "/", 'orderby' => 'name', 'order' => 'ASC',
    'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'echo' => true
  );
  $args = wp_parse_args( $args, $defaults );

  global $wpdb;
  $query = "
    SELECT DISTINCT terms2.term_id as term_id, terms2.name as name, t2.count as count
    FROM
      $wpdb->posts as p1
        LEFT JOIN $wpdb->term_relationships as r1 ON p1.ID = r1.object_ID
        LEFT JOIN $wpdb->term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
        LEFT JOIN $wpdb->terms as terms1 ON t1.term_id = terms1.term_id,
      $wpdb->posts as p2
        LEFT JOIN $wpdb->term_relationships as r2 ON p2.ID = r2.object_ID
        LEFT JOIN $wpdb->term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
        LEFT JOIN $wpdb->terms as terms2 ON t2.term_id = terms2.term_id
      WHERE
        t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id = " . $args['cat'] . " AND
        t2.taxonomy = 'post_tag' AND p2.post_status = 'publish'
        AND p1.ID = p2.ID
  ";
  $tags = $wpdb->get_results($query);
  foreach ( $tags as $key => $tag ) {
    if ( 'edit' == $args['link'] )
      $link = get_edit_tag_link( $tag->term_id, $args['taxonomy'] );
    else
      $link = get_term_link( intval($tag->term_id), $args['taxonomy'] );
    if ( is_wp_error( $link ) )
      return false;

    $tags[ $key ]->link = $link;
    $tags[ $key ]->id = $tag->term_id;
  }

  $return = wp_generate_tag_cloud( $tags, $args );
  $return = apply_filters( 'wp_tag_cloud', $return, $args );

  if ( 'array' == $args['format'] || empty($args['echo']) )
    return $return;

  echo $return;
  }


このコードの中身はまだちゃんと理解できてないので、とりあえずコピペしただけです(汗)

後は、表示したい所に

<?php my_category_tag_cloud('cat=1'); ?>

を記述してやるだけ。

ということで、月次アーカイブとタグクラウドの合わせ技を使う場合はこんな感じになります。

<?php if (is_single() && in_category('1') || is_archive() && is_category('1') ): ?>
		<div class="widget-area">
			<aside class="widget-container">
				<h1>月次アーカイブ</h1>
					<div class="navi">
						<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'>
  							<option value=""><?php echo attribute_escape(__('Select Month')); ?></option>
  							<?php wp_get_archives('cat=1&format=option&show_post_count=1'); ?>
						</select>
					</div>
			</aside>
			<aside class="widget-container">
				<h1>タグ</h1>
					<div class="navi">
						<?php my_category_tag_cloud('cat=1'); ?>
					</div>
			</aside>
		</div>
	<?php if (is_single() && in_category('2') || is_archive() && is_category('2') ): ?>
		<div class="widget-area">
			<aside class="widget-container">
				<h1>月次アーカイブ</h1>
					<div class="navi">
						<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'>
  							<option value=""><?php echo attribute_escape(__('Select Month')); ?></option>
  							<?php wp_get_archives('cat=2&format=option&show_post_count=1'); ?>
						</select>
					</div>
			</aside>
			<aside class="widget-container">
				<h1>タグ</h1>
					<div class="navi">
						<?php my_category_tag_cloud('cat=2'); ?>
					</div>
			</aside>
		</div>
	<?php endif; ?>

めでたしめでたし。
そのうちFOX通信にもいれとこ。