ページを表示する直前の前処理に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へリダイレクトする

お勧めコンテンツ

wp_admin_css_color(2013年3月1日 登録)

void wp_admin_css_color( string $key, string $name, string $url [ , array $colors = array() ] )
カラースキームを設定する。

get_ancestors(2014年12月26日 登録)

array get_ancestors( [ int $object_id = 0 [ , string $object_type = '' [ , string $resource_type = '' ] ] ] )
先祖のIDをまとめて取得する。

get_the_comments_navigation(2015年12月16日 登録)

string get_the_comments_navigation( [ array $args = array() ] )
コメントナビゲーションを取得する。

get_post_type_archive_link(2014年6月11日 登録)

string get_post_type_archive_link( string $post_type )
投稿タイプアーカイブページのURLを取得する。

get_post_custom(2010年2月8日 登録)

array get_post_custom( [ int $post_id = 0 ] )
投稿情報に設定されているカスタムフィールド情報をすべて取得する。

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