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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

Q&A

解決済

3回答

1656閲覧

WordPress固定ページにそのページ用テンプレをうまく適用できない

wwwww

総合スコア41

WordPress

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

0グッド

0クリップ

投稿2019/05/10 18:23

■環境情報
・テーマ:Hueman Pro
・WordPressバージョン:WordPress 5.1.1

■実現したいこと
固定ページとして作成したページに、page-[ID].phpのファイル名で固有のテンプレファイルを作成・適用し、そのページだけPHPでの動的生成(DBサーバから情報取得)を実施したい、と考えています。

■詳細
固定ページ作成後、固定ページ用テンプレ(page.php)をコピーして固有テンプレファイル(page-[ID].php)を作成し、対象ページのテンプレとして適用されているところまでは確認しています。

(上記元ネタとした)page.phpのコンテンツ箇所は 以下コードだったので、

<?php hu_get_content( 'tmpl/page-tmpl'); ?>

(参照先の「tmpl/page-tmpl」は、その他の固定ページも参照しているので、そのものは触らず)
page-tmpl.phpをコピーしてpage2-tmpl.php(など)としてtmpl内に配置した上で、
page-[ID].phpのコードを'tmpl/page2-tmpl'とすれば、
コンテンツ箇所の参照先はpage2-tmplになるのかな(その上でpage2-tmpl.phpを好き勝手触ろう)、
と思っていたのですが、ならず。

(明確にそれと確認したわけではないのですが、表示的におそらく)index.phpをテンプレファイルとしているであろう画面が表示されてしまいます。

page-[ID].phpのコンテンツ箇所の参照先を'tmpl/page-tmpl'や'tmpl/page2-tmpl'とせず、
当ファイル内に直接書くことなどを試したのですが、デザイン崩れや、画面が白くなるなどでうまく行かず…断念してしまいました。

page-[ID].phpなどでテンプレファイルを作ることはできるけど、
テーマファイルのテンプレファイル(?)は好き勝手に作れない or 別の場所に新規ファイル作った旨情報を渡さないといけないのかな、などとも考えたのですが…いずれも解決には至らず、手詰まっている現状です。

解決策・アドバイス等、ありましたら、教えていただきたく、お願いいたします。
解決できないのであれば、その他実現方法がありましたら、別途教えて頂きたいです。

よろしくお願いいたします。
※情報に不足などあれば、その旨ご教示ください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

wwwwwさんの回答に対する割り込み回答となってしまいますがご容赦ください。

実際に固定ページテンプレートを作り、動作しましたので参考までに・・

1.page.phpを複製し、page-test.phpとしました
1)page-test.phpの内容を

<?php hu_get_content( 'tmpl/page-tmpl'); ?>

から

<?php hu_get_content( 'tmpl/page-tmpl-custom'); ?>

へ変更しました(参照先をpage-tmpl-customにする)

2.tmplフォルダ内にpage-tmpl.phpを複製し、page-tmpl-custom.phpとしました
※テンプレートが違うことを確認するため、
```ここに言語を入力

<?php the_content(); ?>
(本文を取得するコード)の上に ```ここに言語を入力 <p>テスト用テンプレートにて表示しています</p>

というのを追加しました(これでカスタムテンプレートかどうか判別できます)

wwwwwさんのおっしゃる通り、利用可能なテンプレートが存在しなかったらtmpl/index-tmplの投稿一覧を使いなさいとなっていたので、functions/init-front.phpの51行目付近に書かれているテンプレート定義の以下の部分をfunctions.phpへコピー

function hu_is_authorized_tmpl( $tmpl ) { $ct_map = apply_filters( 'hu_content_map', array('tmpl/index-tmpl','tmpl/archive-tmpl','tmpl/page-tmpl','tmpl/single-tmpl','tmpl/search-tmpl','tmpl/404-tmpl','tmpl/page-tmpl-custom') ); //Are we good after filtering ? if ( ! is_array( $ct_map ) || ! is_string( $tmpl ) ) return; return in_array( $tmpl, $ct_map ); }

このコードの中の

array('tmpl/index-tmpl','tmpl/archive-tmpl','tmpl/page-tmpl','tmpl/single-tmpl','tmpl/search-tmpl','tmpl/404-tmpl')

array('tmpl/index-tmpl','tmpl/archive-tmpl','tmpl/page-tmpl','tmpl/single-tmpl','tmpl/search-tmpl','tmpl/404-tmpl','tmpl/page-tmpl-custom')

へ変更(,'tmpl/page-tmpl-custom'を追加しただけ)して保存します。

これで固定ページ編集画面でpage-test.php(のテンプレート名)を指定するときちんとtmpl/page-tmpl-customの内容が表示されます(前述した「テスト用テンプレートにて表示しています」という文字列が表示され、きちんとテンプレートが適用されていることが確認できます)

----補足----
もともとfunctions/init-front.phpの51行目付近には上のコードの前に「hu_is_authorized_tmpl」という関数の定義がなかったら・・という条件があったので、それならfunctions.phpへその定義を書いて「定義はあるよ!」とすれば一番単純かなと考えてこのようにしました。

※Wordpressのバージョンによってはコードチェック機能でエラーが出ます。その時は

array('tmpl/index-tmpl','tmpl/archive-tmpl','tmpl/page-tmpl','tmpl/single-tmpl','tmpl/search-tmpl','tmpl/404-tmpl','tmpl/page-tmpl-custom')

の前にある半角スペースをすべて削除してきちんとTabで空白作ればエラーは出ません。

回答が分かりにくくてすみません。
参考程度に見ていただければ・・・

投稿2019/05/11 07:16

momosiri

総合スコア1509

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

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

Eggpan

2019/05/11 07:49

確かに、hu_is_authorized_tmplは再定義出来るようになっているのでこれでも良さそうですね。 なんでもアリにしちゃうのであればいっそ funcitons.php に function hu_is_authorized_tmpl($tmpl) { return true; } みたいなのを定義、とかでも良さそうです。
momosiri

2019/05/11 14:43

ごめんなさい、wwwwwさんは質問者さんでした。恥ずかしながら今気づきました。 そうなんです。すんごい複雑なテーマなんですけど一応「なかったら」としてある親切な部分もあるので、いかようにもできそうです。その中で、元ソースをそのまま使えるので分かりやすいかなと思って↑の回答とした次第です。
momosiri

2019/05/11 14:47

一番肝心なのは質問されたwwwwwさんがどれかの方法で実装できるかどうかなんですが・・・。
wwwww

2019/05/15 08:51

ご教示ありがとうございます!! 回答遅くなり申し訳ないです…。 >回答が分かりにくくてすみません。 いえ、むしろこれほどご丁寧にしてくださるとは…(汗) 差し当たり、実装方法として、 momosiriさんが具体的にご記載頂いている方法を実行してみようと試みた結果、 現時点でうまくできておりません。 以下、作業内容と、伴う疑問点を記載しましたので、 再度お手数おかけいたしますが、ご確認・ご回答をお願いしてもよろしいでしょうか。 ■前提理解(これがずれている気がしているため記載…) 作業において、親テーマファイルは基本的に修正するものではない。 修正などある場合、子テーマフォルダ内に(同一階層作った上で)ファイルを複製し、そのファイルを修正する ■詰まった点 >固定ページ編集画面でpage-test.php(のテンプレート名)を指定すると 編集画面における「ページ属性」の「テンプレート」選択のこと、と理解しています。 ご記載頂いた通りに実行したのですが、プルダウンリストに表示されませんでした…。 ■作業内容 ・(親テーマの)page.phpを複製し、(子テーマフォルダに)page-test.phpとして保存。  同ファイルを <?php hu_get_content( 'tmpl/page-tmpl-custom'); ?> に修正。 ・(親テーマの)tmplフォルダ内page-tmpl.phpを複製し、(子テーマフォルダに)page-tmpl-custom.phpとして保存。  (親テーマの)functions/init-front.phpの以下箇所を、   function hu_is_authorized_tmpl( $tmpl )~  (子テーマの)functions.phpへコピーし、以下を追記   ,'tmpl/page-tmpl-custom' よろしくお願いいたします。
momosiri

2019/05/15 10:26

回答は親テーマへ直接行っていますので、ひとまず全部戻して親テーマ側でやってみてはいかがでしょう(もちろん有効化するテーマも親テーマで)??・・の前に親テーマの内容はバックアップしてください。 ※無料版のテーマで行っているので有料版だと・・ということの切り分けをしたいところです。 それでうまくいくようであれば、親テーマのfunctions.phpへ書いた記述を一旦メモ帳などにコピーしてから削除し、子テーマを有効にして子テーマのfunctions.phpへコピーしたときにどうなるか?をテスト・・と段階を経てやった方がいいのではないかと思います。
Eggpan

2019/05/17 18:31 編集

■詰まった点で若干勘違いされているかもです。 単純に page.php を page-test.php としてコピーした場合、page-{slug}.php としての動作になるので、 固定ページのスラッグを「test」とした場合の専用テンプレートになります。 「ページ属性」の「テンプレート」で選択可能はカスタムテンプレート、というものになります。 こちらの機能を利用する場合、ファイルにコメントを追記する必要があります。以下が詳しいです。 https://wpdocs.osdn.jp/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88#Custom_Page_Template ページによって、管理画面でテンプレートを切替えしたい → カスタムテンプレート 「test」という固定ページだけ、専用テンプレートにしたい → page-{slug}.php といったような使い分けになります。
wwwww

2019/05/19 08:45

Eggpanさんの記載を参考に、うまくできました! 固定ページをtestとして作成した上で、momosiriさんの記述の通り実行し、専用テンプレを適用した固定ページを作成することができました。 諸々、お手数おかけいたしました。 ありがとうございましたm(_ _)m
guest

0

許可されたものを入れないと'tmpl/index-tmpl'として表示するようになっていますね。

PHP

1 function hu_get_content( $tmpl = 'tmpl/index-tmpl', $print = true ) { 2 $tmpl = hu_is_authorized_tmpl( $tmpl ) ? $tmpl : 'tmpl/index-tmpl'; 3

ここの判定に使われている hu_is_authorized_tmpl() 関数内で
'hu_content_map'フィルターが利用可能な文字列の配列を返しているので、
add_filter() 関数を使ってフィルタを追加すれば他のファイルもテンプレートとして利用できそうです。

投稿2019/05/10 19:06

Eggpan

総合スコア2727

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

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

wwwww

2019/05/10 20:52

早速のご回答、ありがとうございます! フィルター(フック)は、根本理解からしないと なので、少しお勉強したのち、 上記いただいている内容について、試してみます。 ちなみに… >許可されたものを入れないと'tmpl/index-tmpl'として表示するようになっています →これは、どのようにご確認をされたのでしょうか?
Eggpan

2019/05/10 23:21

https://ja.wordpress.org/themes/hueman/ からソースコード入手しまして hu_get_content関数の中身を実際に確認しました。 functions/init-front.php に定義されていた、hu_get_content() 関数の処理部分が回答に記載したコードになります。 hu_get_contentの第1引数は $tmpl と定義されていますが、 $tmpl = hu_is_authorized_tmpl( $tmpl ) ? $tmpl : 'tmpl/index-tmpl'; という部分で、 $tmpl変数に 'tmpl/index-tmpl' が代入されて処理が進むから インデックスのようなページが表示されたのかな、と考えています。
wwwww

2019/05/10 23:52

そのようなことをご実施頂いていたのですね… ありがとうございました。 内容についても、理解しました。 >functions/init-front.php に定義されていた、hu_get_content() 関数 と同じ要領で、hu_is_authorized_tmpl を探し、掘り進んでいけばよいわけですね! 少しでも早く自身の当て勘で探れるようになりたいと思います。 勉強になります。ありがとうございますm(_ _)m
Eggpan

2019/05/10 23:54

フィルター使わない方法としては、 hu_get_content() そのものを元テーマから取ってきて、 自身の子テーマなどでfunctions.phpなどに hu_get_content2() とかで同じようなものを再定義、 こちらは先頭の $tmpl = hu_is_authorized_tmpl( $tmpl ) ? $tmpl : 'tmpl/index-tmpl'; を消してしまう、などの方法もありそうですね。やり方としてはあまり良くないですけども。
guest

0

詳しくは分からないのですが、私が使っているテーマはテンプレパターンが複数(2・3カラムや単一カラムなど)存在します。お使いのテーマで「テンプレを増やす作業」や、最初から多くのテンプレが使えるテーマを「複製改変」してはいかがでしょうか?

投稿2019/05/10 22:29

編集2019/05/10 23:17
kinrinkaryu

総合スコア40

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

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

wwwww

2019/05/10 23:42

書き振りがわかりにくかったらすいません。 当方の問題は、固定ページをひとつ作成した上で、それ用のテンプレを新規で作りたいが、うまくいかない、ことです。なので、「テンプレを増やす作業」を実施している自己認識です。 「複製改変」…なるほど…。抽象的にイメージは沸きますが、(そもそもテーマ1つの扱いさえままならない私にとっては)割りかし高難度の作業になりそうな気がするので、今回はそれ以外の方法で行きたいと思います。 ありがとうございます。
kinrinkaryu

2019/05/11 11:29 編集

コードを提示できなくて申し訳ないです、考え方だけをご参考に。 現在ご使用のテーマは文字通りワンパターンのテンプレしかできないかと思われます。 他の2パタ-ン以上使用できるテーマの読み込み部分をマネできれば『Eggpanさん』 が仰っていることを実践できると思います。そしてパターン1・2・3などのファイルを 現行テンプレや自作のテンプレに置き換えられれば、なさりたいことが実現できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問