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


お勧め

wp_save_post_revision(2024年1月10日 更新)

int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。

get_the_author_posts_link(2019年8月21日 更新)

string get_the_author_posts_link( )
投稿者アーカイブページのリンクを取得する。

get_year_link(2012年2月2日 更新)

string get_year_link( mixed $year )
年アーカイブのURLを取得する。

register_taxonomy(2022年6月1日 更新)

WP_Taxonomy | WP_Error register_taxonomy( string $taxonomy, array | string $object_type, array | string $args = array() )
タクソノミーを登録する。

wp_add_object_terms(2013年8月6日 更新)

mixed wp_add_object_terms( int $object_id, mixed $terms, mixed $taxonomy )
投稿情報などにタクソノミーを追加する。