株式会社オンラインの金沢です。
以前にもお伝えしましたが、当ホームページはTwenty Fifteenの子テーマを作成して使用しています。
それまでもテーマの作成をしたことはありましたが、CMSが多く、カスタム投稿をベースにしたものばかりでした。そのようなサイトの投稿一覧では、パラメータを設定したWP_Queryを呼び出して表示させていました。
ところが、同じようにブログのアーカイブページを表示させようとすると、アーカイブのパラメータ取得に困ってしまいました。Twenty Fifteenのテンプレート関数やウィジェットが生成するリンク先は、すべてarchive.phpにまとめられていますので、どのようにWP_Queryを呼び出せばよいのでしょうか?
そこで見つけましたのが、WordPressのget_query_var関数です(関数リファレンス/get query var – WordPress Codex 日本語版 参照)。これでクエリ変数を得られるのですが、パラメータにキーを入れて呼び出さないと空の文字列が返されます。キーの一覧はWordPress Codexのクエリ変数(Query Vars)のページに掲載されていました。ただし、どのクエリ変数が使われるかは調べないとわからないようです。従って、次のような関数を使用してみました。
function check_query_var() { $keys = array('attachment','attachment_id','author','author_name','cat','category_name', 'comments_popup','day','error','feed','hour','hour','m','minute','monthnum', 'name','p','page_id','paged','pagename','post_parent','post_type','preview', 'second','static','subpost','subpost_id','tag','tag_id','tb','w','year'); foreach($keys as $key) { $query_var = get_query_var($key); if($query_var) { echo $key.': '.$query_var."\n"; } } }
これにより、クエリ変数がある場合はget_query_varの変数キーと返り値を確認することができます。これをheader.phpかfooter.phpに貼り、全ページを見回ってみた結果を表にまとめます。
変数キー | 返り値 | |
---|---|---|
投稿 – 個別 | p | 投稿ID |
投稿 – 作成者アーカイブ | author author_id |
ユーザーID ユーザー名 |
投稿 – 年別アーカイブ | year | 投稿した年 |
投稿 – 月別アーカイブ | monthnum year |
投稿した月 投稿した年 |
投稿 – 日別アーカイブ | day monthnum year |
投稿した日 投稿した月 投稿した年 |
投稿 – カテゴリーアーカイブ | cat category_name |
カテゴリーID スラッグ |
投稿 – タグアーカイブ | tag tag_id |
タグのスラッグ タグのID |
カスタム投稿 – 個別 | p post_type |
投稿ID 投稿タイプ名 |
カスタム投稿 – アーカイブ | post_type | 投稿タイプ名 |
固定ページ | name pagename |
スラッグ? スラッグ? |
検索結果 | post_type | “any” (常時) |
※アーカイブの2ページ目以降 | paged | ページ番号 |
固定ページのpageとpagenameの違いはわかりませんでした。検索結果が常にpost_type: anyとなることは意外でした。検索パラメータは別のところになるのでしょうか。
404ページはURLが近い形式のクエリ変数で試みているようです。例として、「http://www.online-inc.jp/あああああ」とリクエストした場合、クエリ変数は「name: あああああ, pagename: あああああ」となります。
また、パーマリンク設定によってもクエリ変数は変わるようです。当ホームページは数字ベースに設定していますが、投稿名に設定すると「p: 投稿ID」は使わずに、「name: スラッグ名」になるようです。
以上を参考に、あとは条件分岐タグ(is_authorやis_categoryなど)を使用して、各ページのクエリ変数を取得すれば一覧を作成できます。
ここまでやって気が付いたのですが、アーカイブではわざわざWP_Queryを呼ばなくてもthe_postを使い続けるだけで済むではないですか。
Twenty Fifteenでは
while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile;
という風にアーカイブを作成していますので、get_template_partの代わりのループ内処理を記述すれば簡単にアーカイブをカスタマイズできるようです。
骨折り損のような気もしましたが、今後何かに使えるかもしれませんので、忘備録として書いておきます。
金沢