この記事は最後に更新してから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


お勧め

add_rewrite_rule(2018年5月27日 更新)

void add_rewrite_rule( string $regex, string $redirect [ , string $after = 'bottom' ] )
リライトルールを追加する(リライトルール追加用のデータを登録する)。

post_type_supports(2018年5月27日 更新)

bool post_type_supports( string $post_type, string $feature )
投稿タイプが特徴(≒編集要素)を有しているか調べる。

sanitize_textarea_field(2018年5月27日 更新)

string sanitize_textarea_field( string $str )
TEXTAREA要素に入力された文字列またはデータベースに格納された複数行文字列をサニタイズする。

get_all_category_ids(2014年9月5日 更新)

array get_all_category_ids( )
すべてのカテゴリIDを取得する。

esc_xml(2020年8月17日 更新)

string esc_xml( string $text )
XML要素向けにエスケープする。