メニュー

WordPressで任意のページ(階層)とその下層ページのテンプレートを振り分ける為の分岐処理

2020.11.26

任意のページだけテンプレートを変えたい、もしくは任意のページとその下層すべてのテンプレートのデザインを変えたいといった時に便利な処理をご紹介します。

よくあるパターンとしてhttps://www.〇〇〇〇.com/en/ みたいな感じで「en」というページを筆頭に下の階層に英語ページが展開されているとき、英語ページのみテンプレートや言語を変えたいといった処理が必要になります。

もし、/en/以下を日本語ページと別のWordPressを設置して作成している場合はそれぞれテンプレートを作るなりして対応しますが、同じWordPressで作成する場合は英語ページ以下でテンプレートを変えるための分岐処理が必要となります。

ということでfunctions.phpに任意のページもしくは任意のページの下層ページ(固定ページ)なのかを判定する関数を自作します。

/*-----------------------------------
 日本語、英語ページ判定用
-----------------------------------*/
function is_english_page() {
	//任意のページかどうか
	if( is_page( 50 ) ) {
		return true;
	} else {
		//任意のページの下層かどうか
		if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
			return true;
		} else {
			return false;
		}
	}
}

はい、上記のソースは任意のページ(en)のIDが50の場合の処理になってます。
では解説していきます。

//任意のページかどうか
if( is_page( 50 ) ) {
	return true;
} else {
	//任意のページの下層かどうか
	if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
		return true;
	} else {
		return false;
	}
}

まず、任意のページであるかどうかの判定を行っております。任意のページであるならばそのままtrueを返しています。もし任意のページ以外であればさらに判定処理が行われます。

//任意のページの下層かどうか
if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
	return true;
} else {
	return false;
}

//in_array( 任意の値, 配列 )

ここが自作した関数is_english_page()の最大のポイントです。

in_array()は値が配列に存在するかどうかを判定します。また、get_post_ancestors( $post->ID ) はそのページの親や祖先すべてのIDを取得して配列で保持します。つまり親や祖先全てのIDを取得した後にその配列に任意のIDが含まれているかを判定しています。ここでは親や祖先にID50が存在しるかどうかを判定しているわけです。

if( is_english_page() ) {
	//英語のテンプレートの表記
} else {
	//日本語(通常)のテンプレートの表記
}

functions.phpに関数を設置しましたので、各テンプレートで上記の様に使用することができます。

もし、こんな方法もあるよ~とかこっちの方が便利だよ~といった感想などあれば気軽に絡んでいただければ幸いです。

関連記事