WEB系キャンパス

固定ページで親子ごとに表示を変える条件分岐

固定ページで親子関係でヘッダーや見出し部分のレイアウトや表示を変えたい場合の条件分岐が必要な場面があったのでメモ。
カレント表示やpage.phpの一つのテンプレートでできたりと、今後けっこう使えそう。

要はこんな時に使いたい。
↓会社概要ページでは別のレイアウトパターンを使いたい。
・http://hogehoge.com/company/aaa
・http://hogehoge.com/company/bbb
・http://hogehoge.com/company/ccc

↓会社概要ページでは別のレイアウトパターンを使いたい。
・http://hogehoge.com/service/aaa
・http://hogehoge.com/service/bbb
・http://hogehoge.com/service/ccc

まず、functions.phpに下記のコードを追加

// 固定ページの親子関係を判定する関数
function page_is_ancestor_of($slug){
    global $post;
    $page = get_page_by_path($slug);
    $result = false;
    if(isset($page)){
        foreach ($post->ancestors as $ancestor) {
        if($ancestor == $page->ID){ $result = true; }
        }
    }
    return $result;
}

これであとは箇所の親の固定ページのスラッグ名で条件分岐する。

<?php if(is_page(‘company') || page_is_ancestor_of('company')): ?>

   <!--ここにcompanyとその子の固定ページに表示させたい事を書く。—>

<?php elseif(is_page('service') || page_is_ancestor_of('service')): ?>

   <!--ここにcompanyとその子の固定ページに表示させたい事を書く。—>

<?php else: ?>

   <!--それ以外はここに書く —>

<?php endif; ?>

これで、ローカルで公開していた時は問題なくできたんだけど、サーバーにアップすると、なぜか404ページでだけ、「Invalid argument supplied for foreach() in…」ってエラーが出てしまった。

ググってみたら、配列の形式ではない変数でforeach文を実行しようとしているようで…

foreach ($post->ancestors as $ancestor) {

の部分を

foreach ((array)$post->ancestors as $ancestor) {

に変更したらいけました。

なので、functions.phpに書くコードは以下がよさそうです。

// 固定ページの親子関係を判定する関数
function page_is_ancestor_of($slug){
    global $post;
    $page = get_page_by_path($slug);
    $result = false;
    if(isset($page)){
        foreach ((array)$post->ancestors as $ancestor) {
        if($ancestor == $page->ID){ $result = true; }
        }
    }
    return $result;
}

参考サイト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です