メニュー

WordPressで特定のカテゴリとその下層のテンプレートを振り分ける分岐処理

2023.07.26

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

よくあるパターンとしてhttps://www.〇〇〇〇.com/en/みたいな感じで/en/というページを筆頭に下の階層に英語ページが展開されているとき、英語ページ(en)配下のみヘッダーの言語やデザインを変えたいといった処理が必要になります。

もし、/en/にディレクトリを作成して別のWordPressを設置して作成している場合はまったく別の運用になりますが、管理が大変になりますので出来るだけ同じWordPress上での管理が望ましいかと思います。

同じWordPressで作成する場合は英語ページ以下でテンプレートを変えるための分岐処理が必要となりますので、コンテンツを振り分ける為の関数を自作して使用していきます。

分岐用の自作関数を設置する

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

下記の例では、例えば英語ページのトップであるページ(/en/)IDが50であったときの例になります。

/*-----------------------------------
 日本語、英語ページ判定用
-----------------------------------*/
function is_english_page() {
	//英語ページのトップであればtrueを返す
	if( is_page( 50 ) ) {
		return true;
	} else {
		//英語ページの下層(親ページのIDに50が含まれる)はtrueを返す
		if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
			return true;
		} else {
		//英語ページでなければfalseを返す
			return false;
		}
	}
}


では関数処理の中身を解説していきます。

	if( is_page( 50 ) ) {
		return true;
	} else {
		if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
			return true;
		} else {
			return false;
		}
	}

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

		if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
			return true;
		} else {
			return false;
		}

ここがis_english_page()のポイントです。

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

ここでは親や祖先にID50(英語トップ)がいるかどうかを判定しているわけです。

in_array()の使い方

in_array( 任意の値, 配列 )

実際の利用方法

is_english_page()を各テンプレートに実装して表示を分岐する事によって任意のページ以下のデザインや文言などを変える事が可能です。

例えば、header.phpなどでコンテンツを使い分ける場合はこのように使用します。

	if( is_english_page() ) {
		//英語のコンテンツ
		echo '<p>Hello, Welcom to My Site.</p>';
	} else {
		//日本語のコンテンツ
		echo '<p>こんにちわ、私のサイトへようこそ!</p>';
	}

特定のページのみ共通部分の内容を変えたいといった使い方に有効です。
もし内容が膨大な量になるようであれば、ファイルを分けて管理し、get_template_partで読み分けるといったやり方が良いでしょう。

テンプレートの表記をまるまる変えなくてもここのページから下の階層だけ違うバナーを表示させたいなどといった事例にも活用できるかと思います。

以上がカテゴリごとに表記や文言を分岐させるやり方になります。もし、こんな方法もあるよ~とかこっちの方が便利だよ~といった感想などあれば気軽に絡んでいただければ幸いです。

関連記事