質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

WordPress 階層のある固定ページで、子ページに一括で共通テンプレートを適用したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,664

score 13

助力をいただきたいので質問させていただきます。

イメージとしては、
example.com/shop/shop-a
example.com/shop/shop-b
example.com/shop/shop-c ...

固定ページ(親 /shop )の子階層ページが複数あり、shopの子ページすべてにsingle.php相当の共通テンプレートを適用させたい、という意図です。
子ページ用テンプレートファイルは仮にpage-shop-template.phpとしております。

避けたいこと

  • 素直にカスタム投稿などでarchive-shop.phpとsingle-shop.phpにするのが
    おそらく一番手っ取り早いと思いますが、それはできないという状態です。
    (実際に新規サイトだったら、私もそれを検討すると思います)

  • 管理画面→固定ページ の各ページからテンプレート選択は【例外的に個別テンプレートの設定が必要なページ】のみに利用したいため避けたいです。
    (同様の構成の子ページが、分類によっては数十ページある状態、というのも理由です。)

試したこと①

page-shop-template.phpを一旦page-shop.phpに変更してみましたが、
これでは当然/page/部分への適用になるだけで意味はありませんでした。

試したこと②

https://www.genius-web.co.jp/blog/website-operation/wordpress-toggle-the-display-for-each-parent-and-child-page-of-a-fixed-page.html
こちらのページを参考にして、親ページ/子ページの判定をfunctions.phpに記述いたしました。

その後、子ページに自動的にpage-shop-template.phpを読み込ませる方法が分からない状態です。
仕様上、純粋なpage.phpのファイルの使用予定はないため、
空のpage.phpにif分岐→locate_template()の記述で振り分けができないかも試しましたが無理でした。
(コードが間違っている可能性もあるため、下記サンプル記述いたします。)

【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;
}

【page.php】
<?php if(page_is_ancestor_of('shop') {
    locate_template('page-shop-template.php',$load);
} ?>


上記の内容では、functions.phpは問題ないようですが、page.phpでエラーが吐かれるだけでした。

どうぞ、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

ifのところの閉じかっこが、1つ足りなかったのでそれを足して、
local_templateの最後の$loadはtrueに変えてみました。
これで動くのではないか、と思いますのでお試しください。

<?php if(page_is_ancestor_of('shop')) {
    locate_template('page-shop-template.php',true);
} ?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/30 20:58

    ご指摘と修正、どうもありがとうございます!
    (閉じカッコは転記の際に間違って消してしまっていたようで、実コードには残っておりました。お恥ずかしい……)
    $loadをtrueに書き換えたところ無事に動きました。
    とても助かりました、ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る