LIGデザイナー採用
LIGデザイナー採用
2013.01.29

WordPressでアーカイブの条件を変更する方法

おっしー

サワッディ!

トゥァエーンおっしー。

今回はWordpressでサイトを構築する際によく使用する、アーカイブの取得条件を変更する方法についてご紹介します。

※WordPressバージョン3.9対応
※2014.4.25 修正
wp_get_archivesを使用する > 設定可能な値 > type > 用意されている値
上記中で、事実と異なった表記をしているものがありましたので修正をいたしました。申し訳ございません。

wp_get_archivesを使用する

アーカイブの条件を変更する際に「wp_get_archives」を使用されている方も多いと思います。
何をやっているのか見てみます。

wp-includes/general-template.phpに存在する関数です。

function wp_get_archives($args = '') {

 ~ 省略 ~

}

設定可能な値

type

アーカイブの種別を指定

用意されている値

daily 日別
weekly 週別
monthly 月別
yearly 年別
postbypost 最新記事順
alpha タイトルのあいうえお順

※記述しない場合は「月別」となります。

limit

表示件数・・・何件まで表示、としたい場合

format

表示形式を指定できます。

中で「get_archives_link」を呼び出しているのでget_archives_linkで用意されている形式が使用できます。

用意されている値

html liタグで出力します
link aタグで出力します
option optionタグで出力します

※記述しない場合はliタグで出力します。

before

リンク名の前に連結する文字列

after

リンク名の後に連結する文字列

show_post_count

投稿件数を表示する場合はtrue、表示しない場合はfalse

echo

表示する場合は1、文字列として取得する場合は0

※現在の最新版(3.5)では新たに「order(順序)」が追加されました!わーい。

order

初期値はDESC(昇順)なのでASC(降順)の設定を行う場合に便利に。

wp_get_archives('type=monthly&limit=12');

「&」繋ぎで表示したい形式で書くとその形式で表示されます。
※上の書き方だと月別に12か月分表示して欲しい。ってことになってます。

日別の場合はこんな感じ。

便利!!

getarchives_whereフィルターを使用する

でもでも。もっと条件を絞りたいという方。

月別!とか日別!じゃなくて!

カスタム投稿タイプで条件を絞りたい!とかね。

その場合はどうするの? 教えてよワードプレス様。

と思い調べてみたら「検索を行う直前にgetarchives_whereフィルターが実行される。」

と書いてある!

  • getarchives_where
  • getarchives_join

このフィルター達だわ。私が求めていたの。

フィルターを使えばよしなにカスタマイズ出来るって事ですね。流石ワードプレス様。
なのでfunctionにこう書きましたよ。

add_filter( 'getarchives_where' , 'my_getarchives_where_filter' , 10 , 2 );
function my_getarchives_where_filter( $where , $r ) {
  global $wpdb;
  $where .=" post_type = 'post'" , "post_type IN ( '取得したい投稿タイプ' ) AND taxonomy = '取得したいタクソノミ名' AND slug = '取得したいスラッグ名'" , $where );
};

add_filter( 'getarchives_join', 'my_getarchives_join', 10, 2 );
function my_getarchives_join( $join, $r) {
  global $wpdb;
  $join .= " 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)
  INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)";
  return $join;
}

こんな感じでwhereとjoinを指定するフィルターを使用すると自由自在なのです!

やったね!