WordPressのデフォルトの仕様では、home.phpがトップページ?
-
WordPress2.8.4を、ブログとしてではなく、通常サイトのCMSとして使用するためにカスタマイズしています。私が現在行っているのは “存続 のテンプレート(他人が作成したテンプレート)をカスタマイズする作業ではありません。”今回の場合、私がテンプレートをほぼ初期の状態から作成していま す。
WordPressのデフォルトの仕様(管理画面の[設定]→[表示設定]→[フロントページの表示]項目→[固定ページ] でトップページを指定していない状態)では、サイトのルートURL(例:http://example.com/)にブラウザでアクセスするとまずhome.phpを探して、home.phpが存在すればその内容をサイトのトップページとして表示する仕組みになっているのでしょうか?
この場合、home.phpに以下の例ような固定ページとしての記述をすれば、home.phpを固定ページとし(管理画面の「ページ」→「新規追加」より入力した記事を表示し)、かつ、サイトのトップページとして固定できるのでしょうか(管理画面の[設定]→[表示設定]→[フロントページの表示]項目→[固定ページ] でトップページを指定していないことが前提です。)?
固定ページとしての記述 例:<?php
/*
Template Name: 固定ページ
*/
?>よろしくお願いします。
-
上記の質問ですが、現在作成しているサイトにブログはなく固定ページだけなので、各ページのサイドバー、ヘッダー、フッターは同一となり、コンテンツ部分だけがページ毎に異なります。
コンテンツ部分は、サイトの利用者に管理画面の「ページ」→「新規追加」より入力してもらうことになります(つまり、サイトを利用者がはじめて利用する段階では、固定ページは何も作成されていません。ここが問題となるところです。)。
そのため、テンプレートはindex.phpのみで事足りると思いました。
しかし、index.phpに上記コメントの例のように「固定ページとしての記述」を指定しているにもかかわらず、いざサイトのルートURL(例:http://example.com/)にアクセスするとindex.phpには投稿記事の一覧が表示されてしまいます(このサイトには、ブログはないので投稿記事は必要ありませんが、検証用に投稿記事も投稿しました。)。
上述したとおり固定ページの記事は、サイトの利用者に管理画面より入力してもらうため、管理画面の[設定]→[表示設定]→[フロントページの表示]項目→[固定ページ] で予めトップページを指定しておくことができません(ご存知のように、この機能は既に公開済みのページをトップページにするためのものだからです。)。
そこで、公開前の固定ページをそのページに付加されこととなるページタイトル又はページの並び順等で判別し、トップページとしたいのです。
たとえば、固定ページのページタイトルが「ホーム」であった場合にそれをトップページとする。または、固定ページのページ順が「0」(最初)であった場合にそれをトップページとするなどの具合です。
追加質問1:
この場合、index.phpと同じ内容のhome.phpを作成して、home.phpに<?php query_posts(‘pagename=ホーム’); ?>又は<?php query_posts(‘paged=0’); ?>などと記述し、その下にコンテンツ部分のループ(管理画面の「ページ」→「新規追加」より入力した記事を表示させたい)を記述する方法ぐらいしか思い浮かびませんが、これで解決するのでしょうか(教えて下さい。)?追加質問2:
どうにかしてhome.phpを使用せず、index.phpのみでトップページに固定ページの内容を表示するようにできないでしょうか(上述したとおりコンテンツ部分は、サイトの利用者に管理画面より入力してもらうため、管理画面の[設定]→[表示設定]→[フロントページの表示]項目→[固定ページ] で予めトップページを指定しておくことができません。)?よろしくお願いします。
追加質問1のquery_postsをindex.phpに記述すれば良いだけでは?query_postsでループを制御しているわけですからhome.phpだろうがindex.phpだろうが表示内容は制御できるはずです。
shokun0803さん
ご回答、ありがとうございました。追加質問1のquery_postsをindex.phpに記述すれば良いだけでは?query_postsでループを制御しているわけですからhome.phpだろうがindex.phpだろうが表示内容は制御できるはずです。
ただ、追加質問1のquery_postsをindex.phpに記述すとindex.phpにサイトのトップページ(固定ページのページタイトルが「ホーム」でのページ。または、固定ページのページ順が「0」(最初)のページ)の記載情報しかループに表示されなくなります。
どうにかしてquery_posts又はそれ以外のタグで固定ページの情報(投稿ページの情報ではなく)しかループに表示しないようにできないでしょうか?
よろしくお願いします。
ん~、やりたいことが見えてきません。
index.phpだけで全てのページを制御したいということですか?TOPページと他のページの構成が別なのであればhome.phpに追加質問1のquery_postsを記述してindex.phpはページだけを表示するようにループを制御すれば可能ではないですか?
質問で記述されている内容でほとんどクリアできそうな気がするんですけどね。ご自身で試してみていますか?論じるよりも試したほうが早いですし、スキルアップにもなりますよ;)
shokun0803さん
ご回答、ありがとうございました。index.phpだけで全てのページを制御したいということですか?
その通りです。テンプレートファイルの管理及び更新等をできるだけ簡単にするためにindex.phpだけでトップページ及びその他のページを制御しようとしています。
TOPページと他のページの構成が別なのであればhome.phpに追加質問1のquery_postsを記述してindex.phpはページだけを表示するようにループを制御すれば可能ではないですか?
そうなのですが、トップページとその他のページの構成が同じなのでindex.phpにまとめたいと思いまして。ちなみに、トップページもその他のページも同じデザイン(構成)の固定ページです。
ご自身で試してみていますか?論じるよりも試したほうが早いですし、スキルアップにもなりますよ;)
はい、色々試しています。もう、いろいろ試し始めて数日が経過しました(私のWordPressにおけるスキルの未熟さが影響しています。)。
よろしくお願いします。
shokun0803さん
まだ、私の問題は解決していませんが、色々試してみて私のquery_postsの理解が間違っていたようです。
<?php query_posts(‘pagename=ホーム’); ?>
で指定できるのは、ページタイトルでなく、ページスラッグでした。また、<?php query_posts(‘paged=0’); ?>
で指定できるのは、指定した記事を表示するのではなく、対象のテンプレートに表示する記事のページ数(一つの記事が複数ページにわたる場合)を指定するものだったのです。また、index.php(「その他ページ」と名前を付ける)とhome.php(「フロント」と名前を付ける)を作成して、特定の固定ページの記事をhome.phpに表示させた場合、そのページにはサイトルート(http://www.example.com)でアクセスできず、サイトルートでアクセスするとデフォルトのWordPressトップページにアクセスしてしまいます。
つまり同じ記事は自動的にhome.php及びデフォルトのWordPressトップページで表示されてしまいます。そのため、同じ内容のページが2つできてしまうことになります。
例:
例えば、「テストページ」というタイトルの固定ページを管理画面より新規追加し、home.php(「フロント」)のコンテンツ部分に表示します。そうすると自動的にその記事はデフォルトのWordPressトップページのコンテンツ部分にも表示されてしまいます。結果、http://www.example.comでアクセスすると、デフォルトのWordPressトップページで生成された「テストページ」というタイトルのページが表示され、http://www.example.com/?page_id=2でアクセス(この場合、「/?page_id=2」部分は例)すると、home.phpで生成された「テストページ」というタイトルのページが表示されてしまいます。つまり、管理画面の[設定]→[表示設定]→[フロントページの表示]項目→[固定ページ] でトップページを指定していない状態でhome.phpに固定ページの記事を表示させるとデフォルトのWordPressのトップページにも同じ記事が表示されるため、同じページが2つできてしまうのです。
そのため、shokun0803さんのご指摘のようにhome.phpとindex.phpの両方をテーマ内で使用した場合もうまく行きません(同じページが2つ生成されてしまいます。)。
管理画面の[設定]→[表示設定]→[フロントページの表示]項目→[固定ページ] でトップページを指定していない状態でこの問題を回避する方法は、あるでしょうか?
よろしくお願いします。
doganteさん、こんにちは。
[設定]→[表示設定]→[フロントページの表示]および[固定ページ]の選択状態は、それぞれ
get_option('show_on_front')
get_option('page_on_front')
で取得されています。
initあたりのフックで、post_titleが「ホーム」となっているページのIDが取得できたら、上記2つにフックし、get_option(‘show_on_front’)の返値がpage、get_option(‘page_on_front’)の返値が取得できたIDとなるようにしてあげれば、テンプレート側でクエリーを打ち直すことも、複数テンプレートを用意することもなくて済むはずです。
すみません、私も勉強不足でjim912さんの提示内容が完全に理解できていないのですが・・・
doganteさんの提示している条件はwordpressが初期状態(インストール直後)でユーザーが設定を何もいじっていないことが前提だと思うのですが、jim912さんの提示している内容は[フロントページの表示]および[固定ページ]を選択していなくてもget_option(‘show_on_front’)の内容を直接書き換えてしまうことで同じような動作を実現すると言うような内容であっていますでしょうか?
だとすれば色々とできそうですね;)query_postsの問題ですが、投稿スラッグではなくタイトルで分岐するならget_postsで制御したほうがよさそうです。
私なりに考えてみたことはpost_typeでpageだけ取得し、ループ中でタイトルで分岐すれば、例えば「ホーム」というタイトルがあり、かつis_home()ならTOPページと判断しその内容を表示、それ以外のタイトルでかつis_page()であればページの内容を表示、「ホーム」というタイトルがなく、かつis_home()である、またはページ数が0なら「ホームを作成してください」などのように表示するなどではどうでしょうか?jim912さん、shokun0803さん
ご回答ありがとうございました。いろいろ調べてみて、私が推測するにjim912さんが指摘されているのは以下のようなことでしょうか?
<?php function init(){ if($page_data['post_title'] == 'ホーム'){ $page = get_page_by_title('ホーム'); get_option('show_on_front') = page; get_option('page_on_front') = $page -> ID; } } ?>
上記のコードを私の作成しているカスタムテーマ内のindex.phpの
</html>
タグの直下に以下のように記述したのですが、ブラウザーには何も表示されなくなってしまいました。</html> <?php function init(){ if($page_data['post_title'] == 'ホーム'){ $page = get_page_by_title('ホーム'); get_option('show_on_front') = page; get_option('page_on_front') = $page -> ID; } } ?>
何か間違ってたら、ご指摘お願いします。
よろしくお願いします。
shokun0803さん、こんにちは。
[フロントページの表示]および[固定ページ]を選択していなくてもget_option(‘show_on_front’)の内容を直接書き換えてしまうことで同じような動作を実現すると言うような内容であっていますでしょうか?
おっしゃるとおりです。
トップページに表示する記事、ページリストの出力リストなどなど、[フロントページの表示]、[固定ページ]を元に出力の変更を行っている箇所は多岐にわたります。事後的にこれらの出力を改変することも不可能ではありませんが、非常に非効率的です。
それよりは、その挙動に影響を与える根本を正してしまったほうが、漏れもありませんし、簡単ですよね。私の提示した内容は、データベースに格納されているデータが何であろうと、ホームというタイトルを持つページがあれば(ステータスの条件も加味せねばならないかもしれませんが)、[フロントページの表示]の選択が「固定ページ」、[フロントページ]の選択が「ホーム」となっているとデータの改変をおこなってしまうというものです。
その他、記事の保存時に同時に2項目のアップデートを行う方法も考えられますが、記述するコードは、上記の方が圧倒的に少なくなると思います。
shokun0803さん
ご回答、ありがとうございました。query_postsの問題ですが、投稿スラッグではなくタイトルで分岐するならget_postsで制御したほうがよさそうです。
私なりに考えてみたことはpost_typeでpageだけ取得し、ループ中でタイトルで分岐すれば、例えば「ホーム」というタイトルがあり、かつ is_home()ならTOPページと判断しその内容を表示、それ以外のタイトルでかつis_page()であればページの内容を表示、「ホーム」というタイトルがなく、かつis_home()である、またはページ数が0なら「ホームを作成してください」などのように表示するなどではどうでしょうか?上記方法では、index.php(home.phpを使用せず、index.phpだけで全てのページの表示をまかなう場合)又はhome.php(index.phpのほかにhome.phpをトップページとして使用する場合)の表示内容はコントロールできるのですが、index.php(又はhome.php)以外に存続のトップページ(通常は、最新の投稿ページの一覧が表示されるページ)が出力されてしまいます。つまり、index.php(又はhome.php)と同じページがもう一つ(存続のトップページ)が出力されます。
結果、http://www.example.comでアクセスすると、存続のトップページで生成されたページが表示され、http://www.example.com/?page_id=2でアクセス(この場合、「/?page_id=2」部分は例)すると、index.php(又はhome.php)で生成されたページが表示されてしまいます。
つまり、私が思うに、index.php又はhome.php等のファイル内のループでの表示条件を制御してもそれはそのページに表示する内容を制御しているに過ぎず、そのページがサイトのトップページとなることはありません。index.php又はhome.php等のループ内の表示条件を制御しても、WPのトップページはindex.php(又はhome.php)を利用して別途に自動で作成されてしまいます。
[フロントページの表示]、[固定ページ]でindex.php(又はhome.php)を利用して作成したページをサイトのトップページとして指定すると、index.php(又はhome.php)が存続のトップページと同一のもの(ページ)となります。ただ、今回はこの機能は使用しないのが前提です。
jim912さんの指摘されている方法が有効だと思うのですが、詳細が分からず困ってます。
よろしくお願いします。
shokun0803さん
index.php(又はhome.php)以外に存続のトップページ(通常は、最新の投稿ページの一覧が表示されるページ)が出力されてしまいます。つまり、index.php(又はhome.php)と同じページがもう一つ(存続のトップページ)が出力されます。
上記の私のコメントですが、私はindex.php(又はhome.php)以外に存続のトップページができてしまっているかどうかをwp_page_menuタグで検証しています。既にご存知かもしれませんが、wp_page_menuタグは値が「show_home=1」の場合に、wp_list_pagesと違い、サイトのトップページをリストに含めて出力できます。
以下のようなコードを検証用にページに記載しています:
<?php wp_page_menu('sort_column=menu_order & show_home=1'); ?>
上記のコードの出力により、[フロントページの表示]→[固定ページ]でindex.php(又はhome.php)を利用して作成したページをサイトのトップページとして指定すると、index.php(又はhome.php)が存続のトップページと同一のもの(ページ)となるのが分かります。
shokun0803さん
initあたりのフックで、post_titleが「ホーム」となっているページのIDが取得できたら、上記2つにフックし、 get_option(‘show_on_front’)の返値がpage、get_option(‘page_on_front’)の返値が取得できた IDとなるようにしてあげれば、テンプレート側でクエリーを打ち直すことも、複数テンプレートを用意することもなくて済むはずです。
どうやら、jim912さんはoption-reading.phpの32行目から54行目あたりに手を加えることをいっておられると思えるのですが、jim912さんが指摘されている内容がお分かりですか?
jim912さんがいっておられる「ページタイトルが[ホーム]の固定ページのページID」は、以下で取得できると思いますが、その先が全く分かりません。
<?PHP $page = get_page_by_title('ホーム'); echo $page -> ID; ?>
こんばんは。
割り込みコメント失礼します。
doganteさん、フック(アクションフック、フィルターフック)について
先ず理解される必要があると思います。
WordPressを拡張する時には理解必須だと思います。http://wpdocs.sourceforge.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API
jim912さんが仰っているのは、具体的には、
add_filter('option_show_on_front', '自分で作成する関数名'); add_filter('option_page_on_front', '自分で作成する関数名');
というように、フィルターフックしてはどうか?ということだと思います。
フックを使えば、必要のない管理画面のメニューを本体のコードを触ることなく
非表示かつアクセスできないようにすることも簡単にできます。今回されようとしていること(CMS化)にはフックは避けて通れないと思いますよ。
色んなプラグインのソースコードを見ると参考になるところが多いと思います。失礼、読み返したら、
initあたりのフックで
とのことですので、jim912さんは、initあたりのフックで
update_optionで、DBの内容を書き換えてしまってはどうか?
といってるんですよね?早とちり、失礼しました。
- トピック「WordPressのデフォルトの仕様では、home.phpがトップページ?」には新たに返信することはできません。