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

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

ただいまの
回答率

88.81%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 615

wwwww

score 25

■環境情報
・テーマ: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 別の場所に新規ファイル作った旨情報を渡さないといけないのかな、などとも考えたのですが…いずれも解決には至らず、手詰まっている現状です。

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+3

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/15 19:26

    回答は親テーマへ直接行っていますので、ひとまず全部戻して親テーマ側でやってみてはいかがでしょう(もちろん有効化するテーマも親テーマで)??・・の前に親テーマの内容はバックアップしてください。
    ※無料版のテーマで行っているので有料版だと・・ということの切り分けをしたいところです。

    それでうまくいくようであれば、親テーマのfunctions.phpへ書いた記述を一旦メモ帳などにコピーしてから削除し、子テーマを有効にして子テーマのfunctions.phpへコピーしたときにどうなるか?をテスト・・と段階を経てやった方がいいのではないかと思います。

    キャンセル

  • 2019/05/18 03:30 編集

    ■詰まった点で若干勘違いされているかもです。
    単純に 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
    といったような使い分けになります。

    キャンセル

  • 2019/05/19 17:45

    Eggpanさんの記載を参考に、うまくできました!
    固定ページをtestとして作成した上で、momosiriさんの記述の通り実行し、専用テンプレを適用した固定ページを作成することができました。

    諸々、お手数おかけいたしました。
    ありがとうございましたm(_ _)m

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/11 05:52

    早速のご回答、ありがとうございます!

    フィルター(フック)は、根本理解からしないと なので、少しお勉強したのち、
    上記いただいている内容について、試してみます。

    ちなみに…
    >許可されたものを入れないと'tmpl/index-tmpl'として表示するようになっています
    →これは、どのようにご確認をされたのでしょうか?

    キャンセル

  • 2019/05/11 08: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' が代入されて処理が進むから
    インデックスのようなページが表示されたのかな、と考えています。

    キャンセル

  • 2019/05/11 08:52

    そのようなことをご実施頂いていたのですね…
    ありがとうございました。

    内容についても、理解しました。
    >functions/init-front.php に定義されていた、hu_get_content() 関数
    と同じ要領で、hu_is_authorized_tmpl を探し、掘り進んでいけばよいわけですね!

    少しでも早く自身の当て勘で探れるようになりたいと思います。
    勉強になります。ありがとうございますm(_ _)m

    キャンセル

  • 2019/05/11 08:54

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

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/11 08:42

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

    キャンセル

  • 2019/05/11 12:49 編集

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

    キャンセル

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

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

関連した質問

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