この記事は最後に更新してから1年以上経過しています。

ページを表示する直前の前処理に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_home is_singleのようなis_○○関数を使ってリクエストの種類に応じて振り分けできる。また、 get_queried_object関数も使用できるので、リクエストにマッチした投稿データを参照できる。このアクション関数が呼び出された時点ではレスポンスを返していないので、 wp_redirect関数などを使って任意のURLにリダイレクトさせることも可能だ。

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


最終更新 : 2013年04月13日 15:25


お勧め

is_embed(2015年12月23日 更新)

bool is_embed( )
要求されているページが埋め込み投稿ページか調べる。

get_custom_header_markup(2017年4月7日 更新)

string get_custom_header_markup()
カスタムヘッダーのHTMLパーツを取得する。

wp_set_password(2013年5月5日 更新)

void wp_set_password( string $password, int $user_id )
ログインパスワードを設定する。

get_category(2011年5月25日 更新)

mixed get_category( mixed $category [ , string $output = OBJECT [ , string $filter = 'raw' ] ] )
IDを指定してカテゴリー情報を取得する。

get_body_class(2012年6月23日 更新)

array get_body_class( [ string $class = '' ] )
bodyタグのclass属性値を取得する。