[WordPress General] wp get archives にないカテゴリ毎の月次アーカイブに対応する
カテゴリ毎の月次アーカイブを呼び出す関数がないようで悩みました。
[markdown]
## wp_get_archives
wp get archives にはカテゴリを指定するオプションがありませんでした。
> * [テンプレートタグ/wp get archives – WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_get_archives)
## wp_get_cat_archives
ググってみると [Archives for a category](http://kwebble.com/projects/wp-plugin-afac) で解決されている方が多かったのですが、サイトを見ると Warning と書いてあり、2009年からメンテしていないとのこと。公式からもダウンロードできないです。
フックとか WordPress の深いところを全く知らないので、困っていたところ、こちらの記事を見つけました。
ありがとうございます。
> * [WordPress でカテゴリ別アーカイブ – Qiita](http://qiita.com/shuhei/items/c364c0ea129a06e9f71a)
前段の add_filter は理解できていないのですが、後段(echo flag 以外)は理解できたので、必要だったオプションタグの出力に対応させてみました。
“`php:functions.php
add_filter(‘getarchives_where’, ‘custom_archives_where’, 10, 2);
add_filter(‘getarchives_join’, ‘custom_archives_join’, 10, 2);
function custom_archives_join($x, $r) {
global $wpdb;
$cat_ID = $r[‘cat’];
if (isset($cat_ID)) {
return $x . ” INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)”;
} else {
return $x;
}
}
function custom_archives_where($x, $r) {
global $wpdb;
$cat_ID = $r[‘cat’];
if (isset($cat_ID)) {
return $x . ” AND $wpdb->term_taxonomy.taxonomy = ‘category’ AND $wpdb->term_taxonomy.term_id IN ($cat_ID)”;
} else {
$x;
}
}
function wp_get_cat_archives($opts, $cat) {
$args = wp_parse_args($opts, array(‘echo’ => ‘1’)); // default echo is 1.
$echo = $args[‘echo’] != ‘0’; // remember the original echo flag.
$args[‘echo’] = 0;
$args[‘cat’] = $cat;
$tag = ($args[‘format’] === ‘option’) ? ‘option’ : ‘li’;
$archives = wp_get_archives(build_query($args));
$archs = explode(‘'.$tag.'>‘, $archives);
$links = array();
foreach ($archs as $archive) {
$link = preg_replace(“/='([^’]+)’/”, “=’$1?cat={$cat}'”, $archive);
array_push($links, $link);
}
$result = implode(‘'.$tag.'>‘, $links);
if ($echo) {
echo $result;
} else {
return $result;
}
}
“`
> * [関数リファレンス/wp parse args – WordPress Codex 日本語版](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_parse_args)
ビュー側でこんな指定をします。
“`php:index.php
“`
### 追記
アクセスが多いので追記(2017/12/04)。
こちらのサイトも合わせて読んでください。
> * [wp_get_archivesっぽいのでカテゴリ&月別アーカイブ(子孫カテゴリ込み)](http://doshirouto.wp.xdomain.jp/web/wordpress/wp-category/1686)
> * [Wordpressで指定したカテゴリーの年別アーカイブを作成する | webOpixel http://www.webopixel.net/wordpress/236.html の改造版。プラグイン有効時にflush_rules()か、パーマリンク設定の更新が必要。](https://gist.github.com/torounit/5106240)
## 補遺
以下、アクションフックやフィルタフックの勉強をするときに見直す。
Railsでもお世話なった方。プラグイン形式にされている。
> * [WordPress 日付別アーカイブ一覧をカテゴリー指定可能にするプラグイン 修正編 – 130単位](http://d.hatena.ne.jp/deeeki/20100601/wp_date_category_archives)
functions.php あたりで対応しているもの。
> * [WordPress – wp_get_archives()でカテゴリ別アーカイブを取得する方法 – Qiita](http://qiita.com/mcatm/items/1f5be412bed0eeb13752)
> * [カテゴリー毎の日付別アーカイブを表示する | wpxtreme](http://wpxtreme.jp/%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%83%BC%E6%AF%8E%E3%81%AE%E6%97%A5%E4%BB%98%E5%88%A5%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
> * [カテゴリー別の月アーカイブ | web制作メモおよび独り言, 最近の仕事など | WordPressでホームページ制作 太陽ブログ](http://web-taiyo.com/works/140107.html)
> * [WordPressで指定したカテゴリーの年別アーカイブを作成する | webOpixel](http://www.webopixel.net/wordpress/236.html)
フック
> * [WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック](http://webdesignrecipes.com/wordpress-action-hook-and-filter-hook/)
> * [Wordpressでアーカイブの取得条件を変更する方法 | 株式会社LIG](http://liginc.co.jp/programmer/archives/4031)
[/markdown]