Movable Type 4 の PHP化
Movable Type 4 で出力するページをPHP化する(=拡張子を .php にする)カスタマイズを紹介します。
Movable Type には何種類かのテンプレートがあり、PHP化の対象は「インデックステンプレート」と「アーカイブテンプレート」の2つです。
このエントリーは、Movable Type 3 の記事「Movable Type の PHP化(その1)」をMovable Type 4 向けに修正したものです。
1.インデックステンプレートの拡張子を変更する
デフォルトテンプレートの場合、インデックステンプレートでPHP化を行なうのは「メインページ」と「アーカイブインデックス」の2つです。ここではメインページをサンプルに説明します。
ブログ管理画面の「デザイン」→「テンプレート」をクリック。
「メインページ」をクリック。
「テンプレートの設定」をクリック。
「出力ファイル」を index.html から index.php に変更します。変更後は「保存」をクリックします。
アーカイブページもメインページと同様の手順で archives.html から archives.php に変更します。
2.アーカイブテンプレートの拡張子を変更する
ブログ管理画面の「設定」→「公開」をクリックします。
「アーカイブオプション」の「ファイルの拡張子」の内容を html から php に書き換え(ピリオドは不要)、下にある「変更を保存」をクリックします。
この設定を行なうことで、MovableType の全てのアーカイブページの拡張子は .php に変更されます。
※「カスタム」設定を行なっていない場合、以下の内容はスキップして3項の作業に進んでください。
なお、アーカイブテンプレートのパスを「カスタム」設定で拡張子に .html を設定している場合、本項の設定が反映されません。
「カスタム」以外を選択している場合(2項の設定で拡張子が自動的にphpに変更)
「カスタム」を選択して、拡張子を直接設定している場合
上記のように直接設定している場合は、パスに記述した拡張子 .html を %x に書き換えます。2項の設定により、%x は自動的に .php に読み替えられてページを出力します(このフィールドの %x が .php に書き変わるわけではありません)。
3.XML宣言の修正
※デフォルトテンプレートではこの作業は不要です。
ページの先頭に、
<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
がある場合、拡張子を .php にして表示すると、ページが真っ白になるか
Parse error: parse error, unexpected T_STRING in [...] on line 1
というようなエラーが表示されます。これはXML宣言がPHPとして誤解釈されてしまうための事象です。
これを回避するには、ご利用のテンプレートに記述されている XML宣言を削除するか、
<? echo('<?xml version="1.0" encoding="<$MTPublishCharset$>"?>') ?>
とPHPが解釈可能なフォーマットに変更してください。どのテンプレートに書かれているか分からない場合は、管理画面の「デザイン」→「テンプレート」でテンプレート一覧画面を開いたときに右上にある検索フィールドで「xml version」で検索するとよいでしょう。
なお、XML 宣言を各ページで利用している場合、システムテンプレートで不具合が発生する可能性があります。不具合の内容や対処の詳細については下記の記事をご覧ください。
4.ファイル・ディレクトリのパーミッション変更
※本設定の要否や設定内容はサーバによって異なります。
PHPファイルが実行ファイルとして動作するように、再構築で生成されるディレクトリおよびファイルのパーミッションを変更する必要があります。パーミッションを変更するには Movable Type をインストールしたディレクトリにある mt-config.cgi をダウンロードし、任意のエディタで編集します。
「さくらのインターネット」の場合、mt-config.cgi の最後に、下記の3行を追加します。
HTMLUmask 0022
DirUmask 0022
HTMLPerms 0777
編集後、mt-config.cgi を元のディレクトリに上書きアップロードします。
なお、この設定項目は一意に決まるものではなく、レンタルサーバによって設定値が異なる可能性があります。あるいは、本項の変更自体が不要な場合もあります。
HTMLPerms は、perl の sysopen の第4パラメータ、つまり PHP ファイル作成時のファイルパーミッションを設定する環境変数です。
XXUmask は、Movable Type 内部から Linux の umask コマンドを実行する時の引数となります。HTMLUmask はファイル作成時のマスク、DirUmask はディレクトリ作成時のマスクです。umask の機能については下記を参照ください。
5.再構築とページ確認
全体を再構築します。再構築が完了したら PHP化されたページが正常に表示されることを確認してください。この時点では .html のページが残っているので、メインページであればURLの末尾に index.php を付与して、PHPのファイルに直接アクセスしてください。
6.ファイルのリダイレクト
※リダイレクトが不要な場合はこの作業をスキップしてください。
各アーカイブページについて、.htaccess を用いて旧ファイル(html)から新ファイル(php)へのリダイレクトを行います。リダイレクトを利用すれば、外部からリンクされてしまっている旧ファイルへのリンクを、新ファイルへ転送することができます。
設定の詳細は「.htaccess によるリダイレクト」を参照ください。
7.不要ファイルの削除
ブログディレクトリ(メインページがあるディレクトリ)およびその配下にある .html のファイルを削除します。Movable Type には拡張子の変更により .html のファイルを削除する機能はありませんので、FTPツールあるいは TeraTerm 等を利用し、ファイルを手動で削除します。
.html のファイルを削除する理由は次の通りです。
HTTPサーバの設定にもよりますが、一般的にURLが "/" で終わる場合、サーバは最初に、そのディレクトリの index.html を探すようになっています。当サイトの場合、
http://www.koikikukan.com/
をブラウザに指定して実行した場合、HTTPサーバは
http://www.koikikukan.com/index.html
を一番最初に検索します。index.html が存在しない場合は次候補の index.htm や index.php 等を検索する、という仕組みになっています。
したがって、拡張子を変更しただけでは新しく作った index.php にアクセスされない可能性があります。「可能性がある」と書いたのは、URLに index.php まで指定すれば当然アクセスできるからです。
archives.html については、実際にはURLに archives.php まで設定するためアクセス上は問題ありませんが、削除することを推奨します。*1
参考までに、この「ファイルを検索する」という設定は Apache HTTP サーバの「DirectoryIndex ディレクティブ」で行います。
このディレクティブに記述されたファイルがひとつもみつからない場合はそのディレクトリのファイルリストが表示される、という仕組みになっています。
アーカイブページの .html ファイルの削除については、「アーカイブの設定」の有無によって、アーカイブディレクトリの位置が異なります。
7.1 「アーカイブをサイトパスとは別のパスで公開する」を行っている場合
ブログ管理画面の「設定」→「公開」にある「アーカイブをサイトパスとは別のパスで公開する」をチェックしていれば、アーカイブディレクトリを丸ごと削除しても構いません(ただしPHPファイルも消えてしまうので、すぐに再構築してください)。
ただし画像ファイルなどをこのでぃれっクトリにアップロードしている場合はこの作業を行なわず、手作業で .html ファイルを削除してください。
7.2 「アーカイブをサイトパスとは別のパスで公開する」を行っていない場合
「アーカイブをサイトパスとは別のパスで公開する」をチェックしていない場合は、ブログ管理画面の「設定」→「公開」にある「サイトパス」配下にアーカイブ用のディレクトリ(下記)が作成されているので、そのディレクトリを丸ごと削除しても構いません(ただしPHPファイルも消えてしまうので、すぐに再構築してください)。
アーカイブごとにディレクトリ名は概ね次のようになります。なお、「アーカイブマッピング」の設定によってディレクトリ名は異なるので参考程度にしてください。
- 年別/月別/週別/日別アーカイブ:「年(「2009」等)」ディレクトリ
- カテゴリ(+日付含む)アーカイブ:「catX」ディレクトリ
- ユーザー(+日付含む)アーカイブ:「author」ディレクトリ
ディレクトリを丸ごと削除する場合、削除するディレクトリ配下に手動でアップロードしているようなファイルがないことを確認してから行なってください。
*1:旧ファイルを削除する理由は、もし削除しなければ同じ内容のファイルが2つ存在することになります。内部リンクから旧ファイルへのアクセスがなくても、外部からのリンク等が残っている場合、検索エンジンのクロール対象となり、ペナルティを受ける可能性があるためです。
- Movable Type 4 で PHP 化する時の注意事項
- Movable Type 4 の PHP 化で XML 宣言を自動的に切り替える
- Movable Type の PHP化(その2:.html のままPHPを有効にする)
- Movable Type の PHP化(その1)
≫ MTと鯖をいろいろと。 from Wisotope社長・野村のブログ。
ここ2日間、ずっとMTを触ってました。... [続きを読む]
≫ Movable Type 5 の「PHP化」と「カテゴリのツリー表示」 from CrowLife
PHP化Movable Type の初心者だけど、他のサイトを見ると記事が多くなるにつれて、再構築に時間がかかるようになるので、そんなときはPHP化したほ... [続きを読む]
ご無沙汰しています。
先般は色々とお世話になり、ありがとうございました。
今回は、無謀にも、このPHP化に挑戦してしまいました。
記事数は全く以って少なく、再構築にストレスは感じていませんし、
PHPの知識もありませんが、
「いずれは役に立つ日がくるだろう」のノリで実行してみました。
ほぼうまくいったのですが、ひとつ、質問させてください。
インデックステンプレートのアーカイブインデックスについてですが、
私の管理ページには存在していません。
KoikikukanTemplateSet 4.2_0.13 for style
を使っています。
また、どこかでポカしてるんでしょうかね・・・(‥ゞ
>やまださん
こんばんは。
ご質問の件ですが、アーカイブインデックスがない場合、下記の内容で「アーカイブインデックス(ファイル名はarchive_index.html)」というインデックステンプレートを作成してください(作成されていない原因は不明です)。
<mt:unless name="page_layout" like="column">
<mt:setvar name="page_layout" value="layout-three-column" />
</mt:unless>
<mt:setVar name="main_template" value="1" />
<mt:setVar name="archive_index" value="1" />
<mt:include module="ヘッダー" />
<mt:unless name="page_layout" eq="layout-three-column-right">
<mt:if name="page_layout" like="three|left">
<div id="links-left-box">
<dl id="links-left">
<mt:include module="サイドバー2" />
<mt:if name="page_layout" like="two">
<mt:include module="サイドバー" />
</mt:if>
</dl>
</div>
</mt:if>
</mt:unless>
<div id="content">
<div class="blog">
<mt:IfArchiveTypeEnabled archive_type="Category">
<h2 class="date">カテゴリー一覧</h2>
<div class="entry">
<mt:TopLevelCategories>
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<mt:If tag="CategoryCount">
<li><a href="<$mt:CategoryArchiveLink$>" title="<$mt:CategoryDescription$>"><$mt:CategoryLabel$></a>
<mt:Else>
<li><$mt:CategoryLabel$>
</mt:If>
<$mt:SubCatsRecurse$>
</li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
</div>
</mt:IfArchiveTypeEnabled>
<mt:IfArchiveTypeEnabled archive_type="Monthly">
<mt:ArchiveList archive_type="Monthly">
<mt:ArchiveListHeader>
<h2 class="date">月別一覧</h2>
<div class="entry">
<ul>
</mt:ArchiveListHeader>
<li><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a></li>
<mt:ArchiveListFooter>
</ul>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
<mt:Ignore>
<!-- List of author archives, if category author are enabled -->
<mt:IfArchiveTypeEnabled archive_type="Author">
<mt:ArchiveList archive_type="Author">
<mt:ArchiveListHeader>
<h2 class="date">ユーザー一覧</h2>
<div class="entry">
<ul>
</mt:ArchiveListHeader>
<li><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a></li>
<mt:ArchiveListFooter>
</ul>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
</mt:Ignore>
<mt:Ignore>
<!-- List of category archives by month, if category archives are enabled -->
<mt:IfArchiveTypeEnabled archive_type="Category-Monthly">
<mt:ArchiveList archive_type="Category-Monthly">
<mt:ArchiveListHeader>
<h2 class="date">月別カテゴリー一覧</h2>
<div class="entry">
<ul>
</mt:ArchiveListHeader>
<li><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a></li>
<mt:ArchiveListFooter>
</ul>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
</mt:Ignore>
<mt:Ignore>
<!-- List of author archives, if category archives are enabled -->
<mt:IfArchiveTypeEnabled archive_type="Author-Monthly">
<mt:ArchiveList archive_type="Author-Monthly">
<mt:ArchiveListHeader>
<h2 class="date">月別ユーザー一覧</h2>
<div class="entry">
<ul>
</mt:ArchiveListHeader>
<li><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a></li>
<mt:ArchiveListFooter>
</ul>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
</mt:Ignore>
<mt:IfArchiveTypeEnabled archive_type="Individual">
<mt:ArchiveList archive_type="Individual">
<mt:ArchiveListHeader>
<h2 class="date">ブログ記事一覧</h2>
<div class="entry">
<ul>
</mt:ArchiveListHeader>
<li><$mt:ArchiveDate format="%Y.%m.%d"$>: <a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a></li>
<mt:ArchiveListFooter>
</ul>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
</div>
<mt:if name="page_layout" like="two.*liquid.*|three.*liquid.*">
<p id="footer">Copyright © 2008 <mt:BlogName encode_html="1" /> All Rights Reserved.</p>
</mt:if>
</div>
<mt:if name="page_layout" eq="layout-three-column-right">
<div id="links-left-box">
<dl id="links-left">
<mt:include module="サイドバー2" />
</dl>
</div>
</mt:if>
<mt:if name="page_layout" like="three|right">
<div id="links-right-box">
<dl id="links-right">
<mt:if name="page_layout" like="two">
<mt:include module="サイドバー2" />
</mt:if>
<mt:include module="サイドバー" />
</dl>
</div>
</mt:if>
<mt:unless name="page_layout" like="two.*liquid.*|three.*liquid.*">
<mt:include module="フッター" />
</mt:unless>
また、メインページにある
<p class="content-nav"><a href="<mt:link template="archive_index" />">Archives</a></p>
という部分がアーカイブインデックスへのリンクを表示しますが、適正にリンクされない場合は、下記のように修正してみてください。
<p class="content-nav"><a href="<mt:link template="アーカイブインデックス" />">Archives</a></p>
それではよろしくお願い致します。
さくらインターネット+Movable Type 5.0 ですが、mt-config.cgi の設定に、
UploadUmask 0022
を追加しないと、ポップアップ画像のPHPファイルに実行属性が与えられすに表示出来ない状態になりました。ご参考まで。
>Tagoshuさん
こんばんは。
情報ありがとうございました!
yujiro様、こんばんわ。
MT5にバージョンアップさせたのですが、初歩の段階のphp化が出来ずにいます。
test.phpもちゃんと紫の表になったのに、いざtestを書いてみると、「・・・on line 1」の表示が出てきてしまいます。
せっかくM5にしたのだからとwebページとblogページ、両方ともサイトは有るのですが、両方とも必要なものですよね?
すみませんが教えて頂けないでしょうか?
yujiro様、こんにちは。
MT4のphp化を参考に「xml version」で検索し、訂正したところ、うまくphpのテスト記事が表示されるようになりました。
ただxml宣言されていて、訂正しても、「xml version」で検索するとやはりテンプレートにリストアップされるのが謎です。
なぜなのでしょうか?
追伸:
MT5のプロフェッショナルガイド、すごく役にたってます。
MT5.02はMT4と仕様が全然違うので大変です。
>tsudukuさん
こんばんは。
ご質問の件、無事に直ったようでよかったです。
「訂正しても、「xml version」で検索するとやはりテンプレートにリストアップされる」とは具体的にどういうことでしょうか。
また、拙著お買い上げくださりありがとうございます。
ではでは!