der Gegenwart

カテゴリ別月別アーカイブページの作成

上記のプラグインを使うのが一番手っ取り早い。

以下、以前にメモっておいたプラグインを使わずにどうにかする方法。2.9とかで動作するのかどうかは知らない。結構めんどい。修正が必要な記述だけを抜き出してるから、そのままfunctions.phpにコピペしても動かないので注意。

カテゴリ別月別アーカイブリストの出力

「wp-includes」ディレクトリ内の「general-template.php」に記述されているwp_get_archives関数をカスタマイズする。基本的にテーマ内に「functions.php」を作成し、その中にカスタマイズした関数*1を記述する。関数名は仮に「wp_get_archives_custom」とする。

関数の引数である文字列にカテゴリID(term_id)である「mcat」を加える。

function wp_get_archives_custom($args = '') {
 global $wpdb, $wp_locale;
 $defaults = array(
  'type' => 'monthly', 'limit' => '',
  'format' => 'html', 'before' => '',
  'after' => '', 'show_post_count' => false,
  'mcat' => false //デフォルト値はなし
 );

月別アーカイブリストを処理している部分を書き換える

if ( 'monthly' == $type ) {
 if($mcat){ //$mcatが空でなければ
  $taxID = $wpdb->get_var("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE $wpdb->term_taxonomy.term_id = $mcat",0,0);//※1
  $query = "SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month, count(ID) as posts FROM $wpdb->posts, $wpdb->term_relationships WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->term_relationships.term_taxonomy_id = $taxID AND $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit;//※2
 } else { //$mcatが空であれば
  $query = "SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";
 }
 $key = md5($query);
 $cache = wp_cache_get( 'wp_get_archives' , 'general');
 if ( !isset( $cache[ $key ] ) ) {
  $arcresults = $wpdb->get_results($query);
  $cache[ $key ] = $arcresults;
  wp_cache_add( 'wp_get_archives', $cache, 'general' );
 } else {
  $arcresults = $cache[ $key ];
 }
 if ( $arcresults ) {
  $afterafter = $after;
  foreach ( $arcresults as $arcresult ) {
   $url = get_month_link($arcresult->year,$arcresult->month);
   $text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year);
   if ( $show_post_count )
    $after = ' ('.$arcresult->posts.')' . $afterafter;
    echo get_archives_link_custom($url, $text, $format, $before, $after, $mcat); //※3
   }
  }
 }
※1
関数の引数として与える値はカテゴリID(term_id)である。しかし、実際に記事とカテゴリを結び付けている値は’term_taxonomy_id’であるため、’term_id’から’term_taxonomy_id’を取得する必要がある
※2
‘$mcat’に値が指定されていた場合のSQL文に変更を加える
※3
アーカイブリンクのURLを取得する関数にも変更を加える必要があり、引数に’$mcat’を追加する。
※4
これはあくまでもアーカイブのリストを取り出す方法なので、archive.php自体は別途記述しないとダメ。$mcatがURLパラメータに含まれていたらどうこうする、みたいな感じでquery_posts()あたりで条件指定する必要がある。

アーカイブリンクのURLを取得する関数にカテゴリ関係の処理を追加する

function get_archives_link_custom ($url, $text, $format = 'html', $before = '', $after = '', $mcat) {
 $text = wptexturize($text);
 $title_text = attribute_escape($text);
 $url = clean_url($url);
 if($mcat) { //$mcatが空でなければ
  $url = $url."?mcat=".$mcat;
 }
 if ('link' == $format)
  return "\t<link rel='archives' title='$title_text' href='$url' />\n";
 elseif ('option' == $format)
  return "\t<option value='$url'>$before $text $after</option>\n";
 elseif ('html' == $format)
  return "\t<li>$before<a href='$url' title='$title_text'>$text</a>$after</li>\n";
 else // custom
  return "\t$before<a href='$url' title='$title_text'>$text</a>$after\n";
 }

オリジナルの関数に、引数$mcatに値が指定されていた場合は出力するURLにGET変数として$mcatの値を加える処理を追加。

  1. コアファイルを直接弄るとバージョンアップしたときに面倒。