WordPressのテンプレートは、どのテンプレートファイルをどんな時に使うかがファイル名によって決められています。
・個別記事の時はsingle.php
・アーカイブページはarchive.php
・カスタム投稿タイプが「item」のときの個別記事はsingle-item.php
のようにテンプレートファイルが読み込まれることはほとんどの方がご存知だと思います。WordPressのテンプレートを作成するときは真っ先に覚えましょうと言われることが多いですね。
しかし「個別記事はstandalone.phpという名前にしたいなぁ…」とか、「ユーザーエージェントがスマホでアーカイブページの時にはarchive-sp.phpを使いたいなぁ…」など、ファイル名だけでは対応しきれないケースも往々にしてあります。
そのような場合に、読み込むテンプレートを自分の好きなように指定することができるフィルターフックについて調べました。
ADs
テンプレートを読み込む際、その読み込むテンプレートに応じて以下のようなフィルターフックが適用されます。
index_template
404_template
archive_template
author_template
category_template
tag_template
taxonomy_template
date_template
home_template
front_page_template
page_template
paged_template
search_template
single_template
text_template, plain_template, text_plain_template (すべての MIME タイプ)
attachment_template
comments_popup
フック名が「ファイル名_template」となっているので、どのテンプレートを読み込むときに適用されるフィルターフックかはすぐに判断できると思います。
上記フィルターフックはファイル名を返すことで、その返したファイルをテンプレートとして利用します。
具体的には以下のような使い方になります。
1 2 3 4 5 6 7 8 |
function custom_template($template){ global $wp_query; if($wp_query->query_vars['post_type'] == 'item' && $wp_query->query_vars['taxonomy'] == 'area'){ $template = dirname( __FILE__ ) . '/archive-item.php'; } return $template; } add_filter( 'archive_template', 'custom_template' ); |
もしsearch.phpがあったとしてもフィルターフックで上書きされるのでarchive.phpが使われます。
1 2 3 4 5 6 7 |
function my_search_template($template){ if(is_search()){ $template = dirname( __FILE__ ) . '/archive.php'; } return $template; } add_filter( 'search_template', 'my_search_template' ); |
など、複雑なif文を使うこともできるので細かな制御が可能となります。
既に誰かが作ったWordPressテーマがあり、その追加機能やレイアウト修正を承った時にお勧めです。
たとえば「運用中のWordPressサイトにカスタム投稿タイプと専用のレイアウトを追加してほしい」と言われた時、既存のarchive.phpやsingle.phpにif文を書くよりも、新しくarchive-new.phpを作成してfunctions.phpに数行追加して終わらせるほうがお手軽です。
既存のテーマが複雑な場合は、あちこちいじると事故るリスクも高いです。
フィルターフックを全パターン書くことで「トップページはstart.php」「カテゴリーはcat.php」「個別記事はonly.php」みたいに完全なオリジナルなテンプレート構成を取ることもできますが、やりすぎは自分でも把握できなくなるのであまりお勧めはしません。
参考になれば幸いです。
ADs
コメントはまだありません。