メニュー

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

2020.11.26

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
/*-----------------------------------
 日本語、英語ページ判定用
-----------------------------------*/
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の場合の処理になってます。
では解説していきます。

01
02
03
04
05
06
07
08
09
10
11
//任意のページかどうか
if( is_page( 50 ) ) {
    return true;
} else {
    //任意のページの下層かどうか
    if ( in_array( 50, get_post_ancestors( $post->ID ) ) ) {
        return true;
    } else {
        return false;
    }
}

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

1
2
3
4
5
6
7
8
//任意のページの下層かどうか
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が存在しるかどうかを判定しているわけです。

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

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

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

関連記事