yusk -ユースク-

  • WordPress
  • Twitter
  • RSS
  • Facebook

201104-26

htmlファイルのままphp includeし、相対パスで読み込めるようにする

php_memo

最近大量のページ数のサイトをコーディングすることになって、全てがCMSではないため、今後の更新とかを考え共通エリアを設けてメンテナンスをどうにか楽にできないか、と思ったんですよ。

20~30ページ位ならスタティックなhtmlで問題ないけど、さすがに200ページ強になるとまともに組んだのでは後々の修正とかがメンドイ。自身、こんなボリュームのサイトを1人でデザイン・コーディングするのは初めてだったので、メモを残そうと思った次第なのです。

さて手段ですが、色々調べました。

  • php includeする
  • JavaScriptでincludeする
  • Dreamweaverのテンプレートかライブラリ機能を使う

・・・予想通り。まぁ思いつくところでこれが代表的だと思う。

そこで最初に消したのが、JavaScript。
これはソースに出ないばかりか、SEO的にも疑問がありまくる。

次にDreamweaverのテンプレート機能。これはけったいなソースを吐き出してくれるので、キレイなソースとはほど遠くなるので却下。自分だけじゃなくて他の人も更新する可能性が高いためでもあるが。

では残った最良の方法、php includeです。

ご存知の通りphpでincludeすると、サーバ側で処理をしてリクエスト先に跳ね返してくれるため、検索ロボット的に問題がない。なんとも素晴らしい方法だ。
しかも他にDreamweaverで更新する人のことを考え、htmlファイル内でphpを使えるようにしようと思い、調べてみたら普通に出来るじゃないか。 決まりですね。

includeは使ったことは無かったが、なんとなく解っていた気がしたので、早速試す。

「htmlファイルのままphp includeし、相対パスで読み込めるようにする」

が前提条件です。

但し、ゆうすけはphpとかのプログラムが基本的に組めません^^; 理解はしててディレクションで説明出来てある程度見積りくらいならイケるんですけどね。。なので、四苦八苦しました。

htmlファイル内でphpコードを使えるようにする

これは様々なblogで紹介し尽くされてますが、
.htaccessに

AddType application/x-httpd-php .html

と1行追加するだけでサーバの設定に追加され、htmlファイルもphpとみなしてくれるので、
スタティックなhtml内でphpを使うことが出来るようになる。
※サーバによって上記記述が違う場合があります。必ず試して確認してください。
ちなみにOCNホスティングだとMIMEタイプが違います。

AddType application/x-httpd-php5 .html

のようになるので注意。

php includeで共通エリアを読み込む

これはphpをお解かりの方には説明不要ですが、僕はphp初心者も良いところなので、メモ書きなのです。
通常のルートからのパスを書くのではなく、相対パスでの使用前提のため、

include(dirname(__FILE__).'/header_inc.php');

のようにincludeします。
dirname(__FILE__)だと、ディレクトリ最後の/(スラッシュ)は付かないので、読み込む側のファイル名の前に/を付けてあげます。

しかし、これだけではincludeするファイル内にimgとかaとかでhrefで参照しているパスは絶対パスにしなくてはなりません。
何故なら、ディレクトリによって参照するファイルの階層が変わるからです。
ルートからのパスで/から始める絶対パス指定をするのがセオリーです。それは解ってます。

ディレクトリ例

この形だと、root直下のindex.htmlからは問題無くheader_inc.php、footer_inc.php、navi_inc.phpを読み込んで表示ができます。

しかし、listフォルダの中にあるindex.htmlやdetail.htmlから読み込むと、各includeしたphpファイル内で参照しているパスは、読み込んだ先のファイルを基点として参照するため、相対パスではズレることになります。

制作環境は様々で、XAMPP使用でローカルで参照したり、リニューアルでテストサーバやテストディレクトリで制作する必要がある場合、いちいち絶対パスを変えなくてはいけません。これは自分的に嫌だ。嫌なので、なんとか相対パスでどこに格納してもしっかり参照出来るように出来ないものか。

これの解決法はネットで探しても、ズバリ詳しく載っているものが無かったので、自分でなんとかしました。

階層ごとのファイルが読み込まれた時に、相対パスを付加する

我流で調べて実行したので、マニアックかもしれません。

<?php $Path = "./"; include(dirname(__FILE__).'/header_inc.php'); ?>

includeの前に$Pathで自身のパスを指定してあげます。

<div>
<p><a href="<?php print $Path; ?>index.html">あいうえお</a></p>
</div>

そしてincludeするファイルの中のhrefに<?php print $Path; ?>に続いてファイル名を指定することで、読み込まれた先のファイルの$Pathで指定されている参照先(この場合は、index.html(1階層目)の$Pathの”./”になる)をファイル名の前に読み込んでくれます。

そして2階層目では、

<?php $Path = "../"; include(dirname(__FILE__).'/../header_inc.php'); ?>

のように../を付けてincludeすることになります。
もちろん3階層でも4階層でも同じ要領で../を増やせばどの階層からでも相対パスが崩れることなく読み込めるのです。

※注意点。$Pathとincludeの両方の相対パスを合わせましょう。1つでも合わないとエラーを返してくれます。

出来たときは1人で感動してましたw はい。まだまだ勉強不足です^^;

コメント一覧

コメントは承認制をとっておりまして、運営者の判断にて承認いたしますことをご了承ください。誹謗中傷等は削除させて頂きます。また、ご返信が遅れる場合もあります。

  • 素晴らしいです。パチパチ。phpに詳しくないので、探していましたが、参考にさせていただきます。

    金井

    2012-08-04 / 12:17 PM

  • すごく素晴らしいです!
    PHP初心者で応用も何もわからない状態で、どのキーワードでもこの解決方法がわからず頭を抱えていたのですがこんな簡単にできるんですね。
    まさに発想の勝利です。
    使わせていただきますありがとうございました。

    level

    2013-01-09 / 7:27 PM

トラックバック一覧

トラックバックURL

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">