WordPressで指定したカテゴリーの年別アーカイブを作成する
Posted: 2011.01.21 / Category: WordPress / Tag: テンプレートカスタマイズ
Wordpressでコーポレートサイトを作成するとき、「お知らせ」というカテゴリーを年別で出力したいという場合があると思います。
しかし、Wordpressの標準機能ではちょっと難しかったりしますよね。
この記事ではカテゴリーを年別に出力する方法をご紹介します。
※Wordpress3.04を使用しています。
Sponsored Link
カテゴリー&日付アーカイブを指定するURI
カテゴリーごとの年別をアーカイブを出力したい場合、URIにカテゴリー(category)と日付(data)両方指定できれば実現できそうです。
たとえば次のようなカテゴリーがあるとします。
カテゴリーID : 3
名前 : お知らせ
スラッグ : news
「2010年」の「お知らせ」を出力する場合、パーマリンクがデフォルトの状態だと次のようなURIになります。
http://localhost/?m=2010&cat=3
でも、パーマリンクを標準のまま使用している人はあまりいないですよね?
特にコーポレートサイトだとSEOなどの関係でいろいろ言われそうです。
ここでは次のようにパーマリンクをカスタマイズします。
/%category%/%post_id%.html
しかし、こうしてしまうと「category」と「date」両方の指定ができなくなってしまいます。
これを実現するためにfunctionsファイルに以下のコードを追加します。
functions.php
/* この部分処理が重くなるようです、代わりに理画面のパーマリンク設定で更新を行ってください。 function extend_date_archives_flush_rewrite_rules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); } add_action('init', 'extend_date_archives_flush_rewrite_rules'); */ function extend_date_archives_add_rewrite_rules($wp_rewrite) { $rules = array(); $structures = array( $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_date_permastruct(), $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_month_permastruct(), $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_year_permastruct(), ); foreach( $structures as $s ){ $rules += $wp_rewrite->generate_rewrite_rules($s); } $wp_rewrite->rules = $rules + $wp_rewrite->rules; } add_action('generate_rewrite_rules', 'extend_date_archives_add_rewrite_rules');
引用元: Date Based Category Archives for WordPress
※管理画面のパーマリンク設定で更新を行ってください。
(どうなっているのかわかりませんが)
これで以下のようなURIで指定したカテゴリーの年別アーカイブを表示できるようです。
http://localhost/category/news/date/2010
指定したカテゴリーアーカイブへのリンクを作成する
通常のアーカイブリストなら「wp_get_archives」でアーカイブへのリンク出力してくれますが、カスタマイズされたパーマリンクでは当然標準機能では出力できませんよね。
ここではSQL文で地味にリンクリストを出力してみます。
theme file
<?php $results = $wpdb->get_results($wpdb->prepare(" SELECT YEAR(post_date) AS post_year FROM wp_posts p, wp_term_relationships tr, wp_term_taxonomy tt, wp_terms t WHERE p.ID = tr.object_id AND tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.term_id = t.term_id AND p.post_status = 'publish' AND p.post_type = 'post' AND tt.taxonomy = 'category' AND t.name = 'お知らせ' GROUP BY post_year ORDER BY post_year DESC ")); foreach ($results as $result) : ?> <li> <a href="<?php bloginfo('url'); ?>/category/news/date/<?php echo $result->post_year; ?>"> <?php echo $result->post_year; ?>年 </a> </li> <?php endforeach; ?> </ul>
COMMENTS
よし 2014-03-18 17:51
initフックで呼び出してるflush_rules()は不要ですよ。
コードを追加してから管理画面でパーマリンクの更新ボタンを一度押せばOKです。
http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Rewrite
>flush_rules関数はとても遅いので、実装するときにはすべてのページで実行されるinitフィルターで呼び出さないようにしてください。
webOpixel 2014-03-21 14:05
わざわざ教えて頂ありがとうございます。
修正いたしました。