WordPressでの質問です。

サイドバーに表示されるアーカーブのカスタマイズについてです。
カテゴリが4つありまして、各カテゴリやそのカテゴリ内の記事を表示した際にアーカイブ部分には該当カテゴリの情報のみを表示したいと思っています。
月単位で表示したいと思います。
以下、イメージです。

「カテゴリA」「カテゴリB」・・・があった場合
「カテゴリB」をクリックするとサイドバーの表示は

2011年9月
 9月に投稿した「カテゴリB」の記事のタイトルA
 9月に投稿した「カテゴリB」の記事のタイトルB

2011年8月
 8月に投稿した「カテゴリB」の記事のタイトルA
 8月に投稿した「カテゴリB」の記事のタイトルB
 8月に投稿した「カテゴリB」の記事のタイトルC
 8月に投稿した「カテゴリB」の記事のタイトルD

のようにサイドバーのナビゲーションに該当カテゴリの記事だけを
月別に表示したいと思っています。

これが実現できるプラグインもしくはソースコードをお教えください。

回答の条件
  • URL必須
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/14 17:40:20
  • 終了:2011/09/21 17:45:03

回答(1件)

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512011/09/18 08:13:16

ポイント200pt

プラグインは知らないので、コードを書いてみました。


1.「functions.php」に次のコードを追加します。(※文字コードはUTF-8です。)

function get_category_monthentry($id, $cat) {
	global $wpdb;

	$sql = "SELECT YEAR( post_date ) AS  `year` , MONTH( post_date ) AS  `month` , COUNT( ID ) AS posts
			FROM $wpdb->posts JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id
			WHERE $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->term_relationships.term_taxonomy_id =".$id.
			" GROUP BY YEAR( post_date ) , MONTH( post_date ) ORDER BY post_date DESC";
	$gresults = $wpdb->get_results($sql);
	$list_query = new WP_Query( 'cat='.$id.'&nopaging=true' );

	if($list_query->have_posts()) : ;
		$list = "<li id=\"entry-list\" class=\"widget-container\">\n";
		$list .= "<h3 class=\"widget-title\">" . $cat . "の年月別エントリー</h3>\n";
		$list .= "<ul>\n";
		$cnt =0; $out = 0; $n = 0;

		while ($list_query->have_posts()) : $list_query->the_post();
			$i = $gresults[$cnt]->posts;
			if($out == $n) {
				$list .= "<li>" . $gresults[$cnt]->year . "年" . $gresults[$cnt]->month . "月\n<ul>\n";
			}
			$list .= "<li><a href=\"" . get_permalink() . "\">" . the_title('','',false) . "</a></li>";
			$out++;
			if($out == $n + $i) {
				$n += $i;
				$cnt++;
				$list .= "</ul>\n</li>\n";
			}
		endwhile;
		$list .= "</ul>\n</li>\n";
		echo $list;
	endif;
}



2.「sidebar.php」の任意の箇所に次のコードを追加します。(※少し余分な記述があったので修正)

				<?php if ( is_single() ) : ?>
					<?php $now_cat = get_the_category(); get_category_monthentry($now_cat[0]->cat_ID, $now_cat[0]->cat_name); ?>
				<?php elseif ( is_category() ) : ?>
					<?php $now_cat = get_query_var('cat'); $id = get_category($now_cat); get_category_monthentry($id->cat_ID, $id->cat_name); ?>
				<?php endif; ?>


※標準テーマの「TwentyTen」の場合、上記のコードを以下の部分以降の任意の箇所に追加します。【コード訂正済み】

		<div id="primary" class="widget-area" role="complementary">
			<ul class="xoxo">

<?php
	/* When we call the dynamic_sidebar() function, it'll spit out
	 * the widgets for that widget area. If it instead returns false,
	 * then the sidebar simply doesn't exist, so we'll hard-code in
	 * some default sidebar stuff just in case.
	 */
	if ( ! dynamic_sidebar( 'primary-widget-area' ) ) : ?>
			<!-- これ以降に先ほどのコードを追加 -->


※現在表示されているアーカイブが必要ない場合は、次の箇所を削除します。(※これも標準テーマの「TwentyTen」です。)

			<li id="archives" class="widget-container">
				<h3 class="widget-title"><?php _e( 'Archives', 'twentyten' ); ?></h3>
				<ul>
					<?php wp_get_archives( 'type=monthly' ); ?>
				</ul>
			</li>



※※※管理画面の「外観」→「ウィジェット」で、表示するウィジェットを設定している場合で、


1.現在表示されているアーカイブが必要ない場合は、管理画面のウィジェットで削除してください。


【※※※ 訂正済み ※※※】

2.次のようにコードを追加する箇所を変更した上で、各ウィジェットの表示順を管理画面のウィジェットで変更してください。(※年月別のカテゴリー内記事リストよりも上に表示したいウィジェットを「ウィジェットエリア1」に、下に表示したいウィジェットを「ウィジェットエリア2」に設定します。)

		<?php endif; // end primary widget area ?>
		<!-- ※※※ ここから追加 ※※※ -->
				<?php if ( is_single() ) : ?>
					<?php $now_cat = get_the_category(); get_category_monthentry($now_cat[0]->cat_ID, $now_cat[0]->cat_name); ?>
				<?php elseif ( is_category() ) : ?>
					<?php $now_cat = get_query_var('cat'); $id = get_category($now_cat); get_category_monthentry($id->cat_ID, $id->cat_name); ?>
				<?php endif; ?>
		<!-- ※※※ ここまで ※※※ -->

			</ul>
		</div><!-- #primary .widget-area -->


ウィジェットの表示に合わせる為に、オリジナルのエリアを作成して、その中に表示するようにしています。(「#originalarea」への指定をstyle.cssに追加してください。)オリジナルのエリアを作成せずに、既存のプライマリーエリア(「ウィジェットエリア1」の下)に追加する様に変更したので、以下のスタイルシートの追加は必要ありません。

#originalarea {
	float: right;
	overflow: hidden;
	width: 220px;
}



※他のテーマを使用していて、「TwentyTen」とは著しく異なるため分からないという時には、「sidebar.php」の内容を以下のようにスーパーpre記法を使用して教えてください。

>||

ここに「sidebar.php」のコードを記述します。

||<

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません