2010-06-01
WordPress 日付別アーカイブ一覧をカテゴリー指定可能にするプラグイン 修正編
WordPress 日付別アーカイブ一覧をカテゴリー指定可能にするプラグイン - 130単位
前の記事でプラグインを作ってみましたが、早速不具合が見つかりました。
このような階層化されたカテゴリーがあり、1つの記事で両方のカテゴリーにチェックが付いていると、記事数の表示がおかしくなります。これはフックしている追加のSQL文でGROUP BYしていないのがまずかったです。ただGROUP BYを加えられるようなフックは存在しないため、別の方法で修正してみました。
コード
<?php /** * カテゴリー指定による日付別アーカイブ */ Class DateCategoryArchives { public $cat;//カテゴリーを保持 /** * コンストラクタ * メソッドをフックに追加/削除します */ public function __construct() { add_filter('getarchives_where', array($this, 'getarchives_where_by_cat'), 10, 2); add_filter('year_link', array($this, 'add_cat_query')); add_filter('month_link', array($this, 'add_cat_query')); add_filter('day_link', array($this, 'add_cat_query')); if ($_REQUEST['cat']) { remove_filter('template_redirect', 'redirect_canonical'); } } /** * wp_get_archives()の記事照会のWHERE句にカテゴリーの条件を加えて返します * * @param string $where WHERE句 * @param array $args wp_get_archives()の引数をパースした配列 * @return string WHERE句 */ public function getarchives_where_by_cat($where, $args) { if (!isset($args['cat'])) { $this->cat == null; return $where; } global $wpdb; //対象とするカテゴリーの抽出 $q['cat'] = ''.urldecode($args['cat']).''; $q['cat'] = addslashes_gpc($q['cat']); $cat_array = preg_split('/[,\s]+/', $q['cat']); $q['cat'] = ''; $req_cats = array(); foreach ( (array) $cat_array as $cat ) { $cat = intval($cat); $req_cats[] = $cat; $in = ($cat > 0); $cat = abs($cat); if ( $in ) { $q['category__in'][] = $cat; $q['category__in'] = array_merge($q['category__in'], get_term_children($cat, 'category')); } else { $q['category__not_in'][] = $cat; $q['category__not_in'] = array_merge($q['category__not_in'], get_term_children($cat, 'category')); } } //リクエストするカテゴリーの文字列 $this->cat = implode(',', $req_cats);; //含めるカテゴリー if ( !empty($q['category__in']) ) { $cat_string = "'" . implode("', '", $q['category__in']) . "'"; $whichcat .= " AND $wpdb->posts.ID IN ( SELECT dca_n_tr.object_id FROM $wpdb->term_relationships AS dca_n_tr INNER JOIN $wpdb->term_taxonomy AS dca_n_tt ON dca_n_tr.term_taxonomy_id = dca_n_tt.term_taxonomy_id WHERE dca_n_tt.taxonomy = 'category' AND dca_n_tt.term_id IN ($cat_string) )"; } //除外するカテゴリー if ( !empty($q['category__not_in']) ) { $cat_string = "'" . implode("', '", $q['category__not_in']) . "'"; $whichcat .= " AND $wpdb->posts.ID NOT IN ( SELECT dca_n_tr.object_id FROM $wpdb->term_relationships AS dca_n_tr INNER JOIN $wpdb->term_taxonomy AS dca_n_tt ON dca_n_tr.term_taxonomy_id = dca_n_tt.term_taxonomy_id WHERE dca_n_tt.taxonomy = 'category' AND dca_n_tt.term_id IN ($cat_string) )"; } return $where . $whichcat; } /** * URLにカテゴリーのクエリパラメータを加えて返します * * @param string $url URL * @return string URL */ public function add_cat_query($url) { if (isset($this->cat)) { $url = add_query_arg('cat', $this->cat, $url); } return $url; } } $DateCategoryArchives = new DateCategoryArchives();
変更点
留意点
プラグイン有効化時にwp_get_archives('cat=1')で出力したリンクの遷移先のテンプレートは、category.phpが優先されます。カテゴリー別と日付別で前者が優先されるのは、wp-includes/template-loader.phpの処理手順を見るとわかります。これをdate.phpやarchives.phpに変更したい場合は以下の方法があります。
まあそもそもカテゴリーと日付という異なる軸を同時に表示させようとしているので、若干の無理が生じてしまってます。機会があれば、ダッシュボードでどのテンプレートを利用するか設定できるようにも対応してみたいと思います。
http://deeeki.sitemix.jp/files/wordpress/date-category-archives.zip
トラックバック - http://d.hatena.ne.jp/deeeki/20100601/wp_date_category_archives
リンク元
- 127 http://www.lifeisg.com/blog
- 73 http://www.lifeisg.com/blog/wp/wordpress3-01-y-y-y/
- 30 http://www.google.co.jp/search?q=wordpress+カテゴリーアーカイブ テンプレートプラグイン&btnG=??%9
- 30 http://www.google.co.jp/url?sa=t&rct=j&q=archives for a category 子カテゴリー&source=web&cd=2&ved=0CCMQFjAB&url=http://d.hatena.ne.jp/deeeki/20100601/wp_date_category_archives&ei=HSWsTvONBc_EmQ
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cts=1331393807292&ved=0CDYQFjAA&url=http://d.hatena.ne.jp/deeeki/20100601/wp_date_category_archives&ctbs=lr:lang_1ja&ei=BXVbT9GHJo-KmQWhlPG0Dw&usg=AFQjCNEsGka7nwiFDePh-oT1f_D4O
- 20 http://www.google.co.jp/search?q=wordpress+アーカイブ+一覧&hl=ja&rlz=1T4GGLL_jaJP370JP370&start=10&sa=N
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=wordpress アーカイブ カテゴリ別 archives for a category&source=web&cd=5&sqi=2&ved=0CEMQFjAE&url=http://d.hatena.ne.jp/
- 14 http://www.google.co.jp/url?sa=t&rct=j&q=wordpress カテゴリー別 記事一覧 日付&source=web&cd=5&ved=0CDoQFjAE&url=http://d.hatena.ne.jp/deeeki/20100601/wp_
- 13 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331288828042&ved=0CDcQFjAB&url=http://d.hatena.ne.jp/deeeki/20100601/wp_date_category_archives&ei=7tpZT76lELGfmQW8mNmcDw&usg=AFQjCNEsGka7nwiFDePh-oT1f_D4O1APqg&sig2=Y_CK_iHi
- 12 http://search.yahoo.co.jp/search?p=WordPress+カテゴリー別+アーカイブ&aq=-1&ei=UTF-8&pstart=1&fr=top_ga1_sa&b=11



