ページを表示する直前の前処理にtemplate_redirectアクションを

ページを表示する直前の前処理にtemplate_redirectアクションを - テンプレートファイルをスッキリさせよう

説明

リクエストに応じてページを表示する直前の準備として何かしらの処理を行っておきたいケースがある。そんな時、テーマの各テンプレートファイルの先頭部分に処理内容をずらずらと記述していませんか。

リクエストに応じてページを表示する事前に行う処理は、リクエストに応じた投稿情報を取得する前にやる処理と、投稿情報を取得してから表示の直前に行う処理に分けることができる。それぞれのタイミングに応じたアクションも複数用意されている。

具体的には、前者であればWordPressの歴代標準テーマに倣ってafter_setup_themeアクションを使用すればいいし、場合によってはinitアクションを使用してもいいだ。後者の場合はというと、自分の場合は何かアクションを使用するのではなく、各テンプレートファイルの先頭部分に記述してきた。どのページでどのような処理をすればいいのか安易に記述でき、しかもテンプレートファイル内なのでデータのやり取りが簡単にできるからだ。ただこの場合、テンプレートファイルの冒頭部分がついついゴチャゴチャになりがちで、テーマの切り替えが面倒といったデメリットがある。最近は子テーマで構築するケースもあるので、親テーマのテンプレートファイルは基本的に触りたくはない。というわけで、ちょっとソースコードを眺めることにした。

目から鱗のtemplate_redirectアクション

これまでもそうだったが、WordPressで「○○できないか」と考えてソースコードを見ていくと、ほぼ必ずといっていいほど答えがある。今回は、/wp-includes/template-loader.phpの中にあった。以下は、その冒頭部分のソースコードである。

if ( defined('WP_USE_THEMES') && WP_USE_THEMES )
	do_action('template_redirect');

// Halt template load for HEAD requests. Performance bump. See #14348
if ( 'HEAD' === $_SERVER['REQUEST_METHOD'] && apply_filters( 'exit_on_http_head', true ) )
	exit();

このtemplate-loader.phpは、まさにテーマのテンプレートファイルを振り分けを行っており、その振り分けを行う直前にtemplate_redirectアクションが実行されることがわかる。このアクションを使用すれば、テンプレートファイルに振り分けられる直前にさまざまな処理を行うことができるようだ。

使い方としては、テーマのfunctions.phpに以下のようなコードを記述すればいい。

add_action( 'after_setup_theme', 'mytheme_setup_theme' );
if ( ! function_exists( 'mytheme_setup_theme' ) ) {
	function mytheme_setup_theme() {
		add_action( 'template_redirect', 'mytheme_template_redirect' );
	}
	function mytheme_template_redirect() {
		$queried = get_queried_object();
		if ( is_home() ) {
			// ここにホームの表示前に行う処理を記述
			
		} else if ( is_category() ) {
			// ここにカテゴリーアーカイブページの表示前に行う処理を記述
			
		} else if ( is_single() ) {
			// ここに投稿ページの表示前に行う処理を記述
			
		}
	}
}

すでにリクエストに応じた投稿データを取得しているため、template_redirectアクション関数内ではis_homeis_singleのようなis_○○関数を使ってリクエストの種類に応じて振り分けできる。また、get_queried_object関数も使用できるので、リクエストにマッチした投稿データを参照できる。このアクション関数が呼び出された時点ではレスポンスを返していないので、wp_redirect関数などを使って任意のURLにリダイレクトさせることも可能だ。

このようにtemplate_redirectアクションを使用すれば、テンプレートファイルの冒頭にプログラムコードを記述する必要はなくなり、テンプレートファイルはすっきりさせることができる。template_redirectアクション関数内で何らかのデータを取得してテンプレートファイルで使用するケースは、グローバル変数に格納するなどの工夫すればいいだろう。

関連

  • add_action - アクション関数を追加する
  • get_queried_object - ページリクエストにマッチした情報を取得する
  • is_category - カテゴリーアーカイブページか調べる
  • is_home - ホームページか調べる
  • is_single - 投稿か調べる
  • wp_redirect - 指定されたURLへリダイレクトする

お勧めコンテンツ

the_post_thumbnail_caption(2016年8月18日 登録)

void the_post_thumbnail_caption( mixed $post = null )
投稿ページのサムネイル(アイキャッチ画像)キャプションを表示する。

_n(2014年2月5日 登録)

string _n( string $single, string $plural, int $number [ , string $domain = 'default' ] )
数値フォーマットの翻訳テキストを取得する。

wp_attachment_is(2015年4月28日 登録)

bool wp_attachment_is( string $type [ , mixed $post_id = 0 ] )
添付ファイルの種類を調べる。

wp_kses_post_deep(2016年2月16日 登録)

mixed wp_kses_post_deep( mixed $data )
複数の投稿内容をサニタイズする。

get_singular_template(2015年8月19日 登録)

string get_singular_template()
singularテンプレートのパス名を取得する。

最終更新日時 : 2013-04-13 15:25