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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

807閲覧

WordPressのindex.phpから同じように分岐させているのに、一方では関数が実行されない

marusankakun

総合スコア16

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/03/10 19:49

###状況
現在「index.php」を作成し、そこから各ページへと流れる条件分岐を書いたのですが、こちらの書き方をすると、「lp.php」ではheaderやfooterが読まれるのに、「single.php」では読まれませんでした。

つまり「lp.php」ではget_header()get_footer()が「index.php」から引き継がれているのだと思いますが、なぜか「single.php」では引き継がれないといった状況に思えます。

###理解できないこと
なぜこのようなことが起こるのでしょうか?

・どちらも「index.php」から同じように条件分岐している。
・「index.php」にはget_header()get_footer()がある。

のに、一方でしか実行されないというのが理解できないです。

###該当のソースコード

「index.php」

php

1<?php 2get_header(); 3 4if( is_front_page() || is_home() ){ 5 get_template_part( 'lp' ); 6}elseif( is_page() ){ 7 get_template_part( 'page' ); 8}elseif( is_single() || is_singuler() ){ 9 get_template_part( 'single' ); 10} 11 12get_footer(); 13?>

「lp.php」

<p>lp.phpです。</p> <!-- ここではget_header()やget_footer()が効いています。 -->

「single.php」

<p>single.phpです。</p> <!-- ここではget_header()やget_footer()が効きません。 -->

###試したこと
まずカスタム投稿タイプでも、通常の投稿タイプでも同じでした。

続いて「index.php」をサーバーから削除してみましたところ、トップページ(つまり「lp.php」を開いたとき)はエラーとなり、記事ページ(つまり「single.php」を開いたとき)は平気でした。

ということはさらに疑問です。これは記事ページを開いて「single.php」を読む際には、「index.php」が不要という仕様になっているのだと思いますが、それならばなぜ他のページでは「index.php」が必要なのでしょうか?

この試したことと考察が正しいならば、「index.php」の要不要が統一されていないのはどうして?という別の疑問になってきます。

このあたりについて知りたいです。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

なぜこのようなことが起こるのでしょうか?

個別投稿表示 にあるように single.phppage.php は、WordPress のテンプレートファイル名として、名前が予約されています

個別投稿表示
個別投稿ページの表示に使用されるテンプレートファイル。

  1. single-{post_type}.php - 投稿タイプが product ならば WordPress は single-product.php を探す。
  2. single.php
  3. singular.php
  4. index.php

固定ページ表示
固定ページ (page 投稿タイプ) の表示に使用されるテンプレートファイル。

  1. カスタムテンプレートファイル - ページ作成画面の「テンプレート」ドロップダウンメニューで選択したテンプレート名。get_page_templates()参照。
  2. page-{slug}.php - 固定ページのスラッグが recent-news ならば WordPress は page-recent-news.php を探す。
  3. page-{id}.php - 固定ページIDが 6 ならば WordPress は page-6.php を探す。
  4. page.php
  5. singular.php
  6. index.php

とあるように is_single() や is_singuler() で、判別される個別投稿表示では、 single.phpindex.php より優先度が高いので、single.php が直接呼び出されているのではないでしょうか。

また、同様に is_page()で判別されている page.php についても page.php が、 index.php より優先度高いので、 ヘッダやフッタが表示されないと思います。

投稿2020/03/10 21:25

編集2020/03/10 21:27
CHERRY

総合スコア25171

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

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

marusankakun

2020/03/11 10:10 編集

どうもありがとうございます。なるほど優先順位が決まっているんですね。 だからget_header()やget_footerという関数は、index.phpに1つ書かれているのではなくて、single.phpやpage.phpなどの各テンプレートにいちいち書かれているということでしょうか? なぜどのテーマも同じ関数をいちいち書くのが疑問でしたが、そういうことでしたら納得できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問