🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

1回答

8607閲覧

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

shino_k

総合スコア13

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2019/10/30 10:34

編集2019/10/30 11:11

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

イメージとしては、
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()の記述で振り分けができないかも試しましたが無理でした。
(コードが間違っている可能性もあるため、下記サンプル記述いたします。)

php

1【functions.php】 2function page_is_ancestor_of($slug){ 3 global $post; 4 5 // 親か判別したい固定ページスラッグからページ情報を取得 6 $page = get_page_by_path($slug); 7 $result = false; 8 if(isset($page)){ 9 foreach ($post->ancestors as $ancestor) { 10 if($ancestor == $page->ID){ $result = true; } 11 } 12 } 13 return $result; 14} 15 16【page.php】 17<?php if(page_is_ancestor_of('shop') { 18 locate_template('page-shop-template.php',$load); 19} ?>

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

PHP

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

投稿2019/10/30 11:41

AsukaKobayashi

総合スコア296

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shino_k

2019/10/30 11:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問