カテゴリー&日付アーカイブを指定する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

  1. /*
  2. この部分処理が重くなるようです、代わりに理画面のパーマリンク設定で更新を行ってください。
  3. function extend_date_archives_flush_rewrite_rules(){
  4. global $wp_rewrite;
  5. $wp_rewrite->flush_rules();
  6. }
  7. add_action('init', 'extend_date_archives_flush_rewrite_rules');
  8. */
  9. function extend_date_archives_add_rewrite_rules($wp_rewrite) {
  10. $rules = array();
  11. $structures = array(
  12. $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_date_permastruct(),
  13. $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_month_permastruct(),
  14. $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_year_permastruct(),
  15. );
  16. foreach( $structures as $s ){
  17. $rules += $wp_rewrite->generate_rewrite_rules($s);
  18. }
  19. $wp_rewrite->rules = $rules + $wp_rewrite->rules;
  20. }
  21. 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

  1. <?php
  2. $results = $wpdb->get_results($wpdb->prepare("
  3. SELECT YEAR(post_date) AS post_year
  4. FROM wp_posts p, wp_term_relationships tr, wp_term_taxonomy tt, wp_terms t
  5. WHERE p.ID = tr.object_id
  6. AND tr.term_taxonomy_id = tt.term_taxonomy_id
  7. AND tt.term_id = t.term_id
  8. AND p.post_status = 'publish'
  9. AND p.post_type = 'post'
  10. AND tt.taxonomy = 'category'
  11. AND t.name = 'お知らせ'
  12. GROUP BY post_year
  13. ORDER BY post_year DESC
  14. "));
  15. foreach ($results as $result) :
  16. ?>
  17. <li>
  18. <a href="<?php bloginfo('url'); ?>/category/news/date/<?php echo $result->post_year; ?>">
  19. <?php echo $result->post_year; ?>
  20. </a>
  21. </li>
  22. <?php endforeach; ?>
  23. </ul>