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
で読み分けるといったやり方が良いでしょう。
テンプレートの表記をまるまる変えなくてもここのページから下の階層だけ違うバナーを表示させたいなどといった事例にも活用できるかと思います。
以上がカテゴリごとに表記や文言を分岐させるやり方になります。もし、こんな方法もあるよ~とかこっちの方が便利だよ~といった感想などあれば気軽に絡んでいただければ幸いです。