本文にたくさんの質問がありますが、あえてトピックタイトルの質問にお答えします。
WordPressにはテンプレート階層というものがあり、すべてのページを index.php で表示しなければならないわけではありません。
例えば個別投稿ページは single.php 、固定ページは page.php 、カテゴリアーカイブページは category.php 、などを用意すれば、 index.php よりも優先して使用されます。
その上で、 header.php や footer.php のようなパーツは、上記のすべてのPHPファイルからインクルードできます。
つまり index.php や single.php など複数のテンプレートファイルの共通部分を header.php などに分離するというのが一般的な使い方です。
ところで get_template_part()
は関数ですので、ここにファイル名を入れるとインクルードできるというのはPHPやWordPressの仕様というより、そういう関数だということです。
ですので、拡張子はいらないというより「書いてはいけない」のであって、またカレントディレクトリを表す ./
もいりません。
詳しくは関数のソースをご覧ください。
https://developer.wordpress.org/reference/functions/get_template_part/
お返事ありがとうございます。
>>>
WordPressにはテンプレート階層というものがあり、すべてのページを index.php で表示しなければならないわけではありません。
例えば個別投稿ページは single.php 、固定ページは page.php 、カテゴリアーカイブページは category.php 、などを用意すれば、 index.php よりも優先して使用されます。
index.phpにすべてを集約しないといけないというわけではなかったのですね。
個別投稿ページは single.php 、固定ページは page.php 、カテゴリアーカイブページは category.php
とindexにインクルードしないファイルがあってもURLに
/page.phpなどと入れれば表記できるという事でしょうか?
/だけだと必然的にindexが表記されますよね?
>>>その上で、 header.php や footer.php のようなパーツは、上記のすべてのPHPファイルからインクルードできます。
つまり index.php や single.php など複数のテンプレートファイルの共通部分を header.php などに分離するというのが一般的な使い方です。
indexにすべて集約するやり方の方が変わっているという事でしょうか?
WEBデザインレシピのサンプルはこのようになっていたのでこれが一般的と思っていました。
実務ではむしろ違うやり方の方を要求される方が圧倒的に多いのですかね。
こちらにあるようなことをおっしゃっているんですかね。
http://buburinweb.wp.xdomain.jp/wordpress-theme-page
>>>
ところで get_template_part() は関数ですので、ここにファイル名を入れるとインクルードできるというのはPHPやWordPressの仕様というより、そういう関数だということです。
ですので、拡張子はいらないというより「書いてはいけない」のであって、またカレントディレクトリを表す ./ もいりません。
詳しくは関数のソースをご覧ください。
https://developer.wordpress.org/reference/functions/get_template_part/
get_template_part()はワードプレス特有の関数というわけではなく、ファイルをインクルードするPHPの一般的な関数なのですね。
しかもこれはindex.phpをカレントとした相対パスを指定すればよく、
カレントディレクトリにでも./は付けてはいけず、拡張子もつけてはいけず、
phpかhtmlかは自動判別?するのですね。
この関数以外では相対パスを指定してインクルードすることはできないので、すべてのファイルのインクルードは、
これで行うのが無難なのですかね?
<?php get_template_part( ‘navigation’ ); ?>という形が正しいのですね。
一つ前の下記トピックに書き込まれた @wordfile さんのご質問へのコメントです。
https://ja.wordpress.org/support/topic/インクルードしてもnavgationが表記されない%E3%80%82/
<?php get_header(); ?>とfooterは可能なのに、<?php //wp_nav_menu();
は、ダッシュボード上でGUIでメニューの追加をしないと認識しないという事ですかね?
そうです。
何度かリンクを示した説明ページ(WordPress Codex 日本語版)に次のように書いてありますよ。
「このタグは、ナビゲーションメニューを表示します。メニューは 管理画面 > 外観 > メニュー で作成できます。」
私はむしろ自分のテーマを他の人に見られたくないのですが、まさかテーマを有効にしただけで勝手に公開されるなんてことはないですよね。
それが一番心配です。
テーマを有効にしただけで公開されることはありません。
いくつかWordPressに関して誤解されているようですね。
ドメインのルート / にアクセスした場合、ブラウザの仕様では index.php をリクエストしますが、WordPressでは「リライト」という仕組みによって「サイトのトップページ」に設定されたページを返します。
リライトはサーバー上に実体のないURLのアクセスに対してURLの構造から表示するべき内容を判別し、実体(PHP+データベースの内容)に置き換える仕組みです。
page.php は固定ページの内容を設定するファイルですが、これも「固定ページを表すURL」をリクエストされた場合にリライトによって実体である page.php の内容を返すのであって、URLが page.php になるわけではありません。
get_template_part()
は .php と .html を自動判別しません。
ファイル名を必ず .php として扱います。
そもそもWordPressのテーマファイルに .html はありません。
テーマディレクトリに .html ファイルを含めて、それに直接アクセスすれば表示はできると思いますが、それはもはやWordPressのシステムの範疇ではありません。
ちなみに get_template_part()
はサブディレクトリのPHPをインクルードすることもできます。
その場合の書き方は get_template_part('hoge/navigation');
です。
>>>
ドメインのルート / にアクセスした場合、ブラウザの仕様では index.php をリクエストしますが、WordPressでは「リライト」という仕組みによって「サイトのトップページ」に設定されたページを返します。
ワードプレスはindex.phpを返すのではなく、自動的に設定されたトップページに指定されたphpファイルが開かれるのですね。
ただオリジナルのテーマなので私はトップページを指定した記憶がなのですが、
勝手にindex.phpがトップページに指定されているのですかね?
>>>
get_template_part() は .php と .html を自動判別しません。
ファイル名を必ず .php として扱います。
そもそもWordPressのテーマファイルに .html はありません。
テーマディレクトリに .html ファイルを含めて、それに直接アクセスすれば表示はできると思いますが、それはもはやWordPressのシステムの範疇ではありません。
ちなみに get_template_part() はサブディレクトリのPHPをインクルードすることもできます。
その場合の書き方は get_template_part(‘hoge/navigation’); です。
ありがとうございます。
拡張子を書いてはいけない理由はhtmlはワードプレスでは絶対にないので、phpを省略してもphpとわかるという意味なのですね。
またindex.phpをカレントディレクトリにして相対パスを書けばhtmlフォルダ内にheader.phpなどを入れても上記のような指定でインクルードできるという事ですね。
了解しました。
<?php get_header(); ?>とfooterは可能なのに、<?php //wp_nav_menu();
は、ダッシュボード上でGUIでメニューの追加をしないと認識しないと覚えておきます。
それなら<?php get_header(); ?>とfooter以外はすべて
get_template_part(‘hoge/navigation’);
get_template_part(‘hoge/maincontent’);
などと記載すればよいという事ですね。
get_template_part() の制限事項を考慮して、get_template_part() と自作関数呼び出し(その中でHTMLコードを出力)を使い分ける、という考え方もあります。
制限事項(変数のスコープ)は下記リンク先の「テンプレートに変数を渡す」セクションに示されています。
https://wpdocs.osdn.jp/関数リファレンス/get_template_part
サイトのトップページはダッシュボードの「設定 > 表示設定」の「フロントページ」で設定します。
初期設定では「最新の投稿」になっていると思います。
その場合、 front-page.php → home.php → index.php の優先順位でテーマファイルが使われます。
他のテーマファイルがなければ、どんなページも index.php で表示されることになります。
get_template_part('hoge/navigation');
の hoge/navigation
は、 index.php に対する相対パスではありません。
テンプレートディレクトリ(テーマのフォルダ)のルートに対する絶対パスです。
index.php はルートに置かれるので、実質的には相対パスにも見えますが、上の階層は参照できません。
ありがとうございます。
>>>
サイトのトップページはダッシュボードの「設定 > 表示設定」の「フロントページ」で設定します。
初期設定では「最新の投稿」になっていると思います。
その場合、 front-page.php → home.php → index.php の優先順位でテーマファイルが使われます。
他のテーマファイルがなければ、どんなページも index.php で表示されることになります。
初期設定ではindex.phpが最優先でないのですね。
front-page.php → home.php → index.phpすべてあった場合はfrontが表記されてしまうのですね。
ただindex.phpをアドレスに指定した場合はこれが表記されるのですよね。
また自分で好きはphpファイルをしていすることも可能なのですね。
>>>
get_template_part(‘hoge/navigation’); の hoge/navigation は、 index.php に対する相対パスではありません。
テンプレートディレクトリ(テーマのフォルダ)のルートに対する絶対パスです。
index.php はルートに置かれるので、実質的には相対パスにも見えますが、上の階層は参照できません。
/htdocs/wp/wp-content/themes/my-corpolate
上記のようにmy-corpolateがオリジナルのテーマの場合はmy-corpolateがルートディレクトリになるという認識で正しいでしょうか?
つまりindex.phpがここになくてもmy-corpolateがルートであることに変わりがないという事なのですね。
実質ルートにあるので、あたかもindex.phpがルートになるように錯覚しているだけなのですね。
>>>
get_template_part() の制限事項を考慮して、get_template_part() と自作関数呼び出し(その中でHTMLコードを出力)を使い分ける、という考え方もあります。
制限事項(変数のスコープ)は下記リンク先の「テンプレートに変数を渡す」セクションに示されています。
https://wpdocs.osdn.jp/関数リファレンス/get_template_part
蒸すかしいですね正直初心者にはよくわかりませんが、
get_template_part()は相対パスで示せばどんなphpファイルでもインクルードしてくれるわけでなく、
ひじょうにまれにうまくインクルードされないことがあるという事ですかね。
恐縮ですがリンク先を見てもまだわかりません。;
CG
(@du-bist-der-lenz)
/htdocs/wp/wp-content/themes/my-corpolate をルートに指定してあれば、ルートディレクトリになるという認識で正しいでしょう。
https://ja.wordpress.org/support/topic/仕様で決まっているルートディレクトリとは/#post-217484
で説明されていることを、言い換えただけですが「Absolute path to the WordPress directory」はファイル構成やサーバーによって変わることがあります。故に、他者からは断定できません。
ただindex.phpをアドレスに指定した場合はこれが表記されるのですよね。
多分されません。
リライト次第だと思いますが、たとえば俺のサイトでは /index.php
ではトップページ /
へリダイレクトされました。
/wp-content/themes/xxxx/index.php
ではリダイレクトされずエラーになります。
また自分で好きはphpファイルをしていすることも可能なのですね。
できません。
ダッシュボードをご覧になればわかりますが、トップページの設定は「最新の投稿」と「固定ページ」のいずれかです。
前者はアーカイブページと同様(テーマファイルは別)で、後者は個別の固定ページの扱いです。
サイトのトップページはダッシュボードの「設定 > 表示設定」の「フロントページ」で設定します
ここで指定すればどんな名前のファイルでも最優先にできるわけではないのですか?
ここで指定して最優先になる者とならないものがあるのですかね?
どのファイルがなるか区別が難しいです。
「最新の投稿」と「固定ページ」のいずれかのphpファイルしか最優先にできないのですね。
ただ私のサイトはindex.phpがいつも出てきます