お知らせ

WordPressで学ぶPHPとMySQL2009年9月23日

WordPressで学ぶPHPとMySQL」を発売しました。
「WordPressをカスタマイズしたいけど、PHPやMySQLが分からなくて躓いている」という方のための、PHPとMySQLの入門書です。
WordPressでWeb製作をされている方などにお勧めです。
PDFによる販売で、当サイトでのみ購入できます(書店では購入できません)

他にも多数書籍を執筆しています。
こちらもぜひご覧ください。

WriteToFileプラグインを使った静的ページ分割

| コメント(4) | トラックバック(3)

先日、「テンプレートの再構築結果を部分的にファイルに出力するプラグイン」(WriteToFile)を公開しました。
このプラグインを使うと、1つのテンプレートから複数のファイルを出力することができます。

このプラグインの応用例の1つとして、ブログのメインページを静的に分割する方法を紹介します。

9月11日 17時50分
もう1つプラグインが必要なことを記述し忘れていました。申し訳ありませんでした。

1.基本的な考え方

WriteToFileプラグインのMTWriteToFileタグは、繰り返し系のブロックタグの中でも使うことができます。
メインページのページ分割では、MTForタグの繰り返しを利用して、メインページのテンプレートを複数回再構築し、それぞれの結果をMTWriteToFileタグで別々のファイルに保存する、という手法を使います。
例えば、メインページを5ページに分割する場合、処理の大まかな流れは以下のようになります。

<MTFor var="page_no" from="1" to="5">
<MTSetVarBlock name="fname">各ページのファイル名を求める</MTSetVarBlock>
<MTWriteToFile name="$fname">
メインページのテンプレート(ページ分割できるように一部書き換えたもの)
</MTWriteToFile>
</MTFor>

2.VarExpandプラグインのインストール

このカスタマイズでは、変数間どうしでやや複雑な計算を行います。
その処理を簡単にするために、拙作のVarExpandプラグインを使います。

VarExpandプラグインのインストール等については、こちらのページを参照してください。

3.メインページのテンプレートの先頭部分の書き換え

それでは、メインページのテンプレートを具体的に書き換える手順を紹介します。
まず、テンプレートの先頭に以下を追加します。

<MTIgnore>1ページあたりのブログ記事数</MTIgnore>
<MTSetVar name="per_page" value="10">
<MTIgnore>分割するページ数の最大値</MTIgnore>
<MTSetVar name="max_page" value="5">
<MTIgnore>分割するページ数を求める</MTIgnore>
<MTSetVarBlock name="page_count"><$MTBlogEntryCount$></MTSetVarBlock>
<MTSetVarFormula name="page_count" formula="int(($page_count - 1) / $per_page) + 1">
<MTIf name="max_page"><MTIf name="page_count" gt="$max_page"><MTSetVar name="page_count" value="$max_page"></MTIf></MTIf>
<MTIgnore>ページ数分繰り返す</MTIgnore>
<MTFor var="page_no" from="1" to="$page_count">
  <MTIgnore>各ページの先頭のブログ記事のオフセットを求める</MTIgnore>
  <MTSetVarFormula name="ofs" formula="($page_no - 1) * $per_page">
  <MTIgnore>出力するファイル名を求める</MTIgnore>
  <MTSetVarBlock name="fname">index<MTIf name="page_no" ne="1">_<$MTGetVar name="page_no"></MTIf>.html</MTSetVarBlock>
  <MTIgnore>1ページ目は通常通り出力し、2ページ目以降をMTWriteToFileタグで出力するようにする</MTIgnore>
  <MTSetVarBlock name="out"><MTIf name="page_no" eq="1">1<MTElse>0</MTIf></MTSetVarBlock>
  <MTSetVarBlock name="no_file"><MTIf name="page_no" eq="1">1<MTElse>0</MTIf></MTSetVarBlock>
  <MTIgnore>各ページを再構築して保存する</MTIgnore>
  <MTWriteToFile file="$fname" out="$out" no_file="$no_file">

この部分では、1ページあたりの記事数を元にして分割後のページ数を求め、その回数分繰り返しを行って、各ページをファイルに出力するようにしています。
2行目の「<MTSetVar name="per_page" value="10">」で、1ページあたりの記事数を指定することができます。
また、4行目の「<MTSetVar name="max_page" value="5">」で、分割後の最大ページ数を指定することができます。

分割後の各ページのファイル名は、1ページ目は「index.html」で、2ページ目以降は「index_2.html」「index_3.html」・・・のようになります。
このファイル名は14行目のMTSetVarBlockタグで変数$fnameに求めています。

なお、4行目のvalueのところを「value="0"」にすると、すべてのブログ記事を対象にページ分割を行うこともできます。
ただ、記事の数が多いブログだと、全記事を再構築することになり、処理時間が長くなりますので、通常は「value="0"」は使わないことをお勧めします。

4.メインページのテンプレートの最後の部分の書き換え

次に、メインページのテンプレートの最後に、以下のタグを追加します。

</MTWriteToFile>
</MTFor>

5.MTEntriesタグの書き換え

メインページのテンプレートの中には、MTEntriesタグで記事の一覧を出力する部分があります。
このMTEntriesタグを、以下のように書き換えます。

<mt:Entries offset="$ofs" lastn="$per_page">

これによって、各ページの先頭の記事(変数$ofs)から、1ページあたりの記事(変数$per_page)が処理対象になります。

6.ページ選択部分の追加

最後に、ページを選択する部分を追加します。

Movable Type 4.2の標準テンプレートセットの場合、以下のようなタグがあって、アーカイブページへのリンクが出力されるようになっています。

<a href="<$mt:Link template="archive_index"$>">アーカイブ</a>

このタグの直前に、以下のようなタグを追加すると、ページ選択のリンクが出力されます。

<MTIf name="page_count" gt="1">
  <MTFor var="page_ctr" from="1" to="$page_count" glue="|">
    <MTIf name="page_ctr" eq="$page_no">
      <MTGetVar name="page_ctr">
    <MTElse>
      <a href="<$MTBlogURL$><MTIf name="page_ctr" gt="1">index_<$MTGetVar name="page_ctr">.html</MTIf>"><MTGetVar name="page_ctr"></a>
    </MTIf>
  </MTFor>
  <br />
</MTIf>

この部分では、ページ数分の繰り返しを行って、各ページへのリンクを「|」で区切って出力しています
ただし、現在表示しているページはリンクにせずに、ページ番号のみ出力するようにしています。

トラックバック(3)

トラックバックURL: http://www.h-fj.com/mt/mt-tb.cgi/1461.

私的なことを言うと、Movable Typeにおいてはこの先 スタティックでの構... 続きを読む

こんにちわ^^ 先日、The blog of H.Fujimoto さんとこで WriteToFile プラグインというものが公開されました。 テンプレー... 続きを読む

こんにちわ^^ 先日、The blog of H.Fujimoto さんとこで WriteToFile プラグインというものが公開されました。 テンプレー... 続きを読む

コメント(スレッド1件,コメント4件)

コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。

No.1 bzbell : VarExpand プラグインタグが使われてます

こんばんわ^^

先日 WriteToFile プラグインを DL したもの、使い道が思い浮かばなかったのですが、ページ分割にも使えるんですね!!
素直になるほどっ!! とプチ感動しちゃいました (; ̄∇ ̄A

今までのページ分割では分割したページがすべて同じってのが通例でしたが、この方法だったら分岐可能なので、1 ページ目とそれ以外みたいに個別に出力内容を変更できそうですね。

いいかも (●´∀`●)
さっそくやってみます。

No.2  : (無題)

>bzbellさん
こんにちは。

このプラグインは工夫次第でいろいろな使い方ができると思います。
例えば、ページ分割に使う場合、最初の数ページは静的出力、それ以後は動的出力、といった処理を作ることができるでしょう。

bzbellさんもぜひ何か面白い活用法を考えてみてください。

No.3 bzbell : (無題)

こんばんわ^^

>このプラグインは工夫次第でいろいろな使い方ができると思います。
>例えば、ページ分割に使う場合、最初の数ページは静的出力、それ以後は動的出力、といった処理を作ることができるでしょう。

あちゃぁ (>∀< )
その使い方もいいですね。無駄がなくって。
機能がシンプルなだけにこのプラグインオモシロいです!!

>bzbellさんもぜひ何か面白い活用法を考えてみてください。

はい。今せっせといろいろ TRY してますの。
後ほどこのプラグインの記事書こうと思ってます。

ps
ここでコメントするようなことじゃないのですが、こちらのWidgetSetLoopプラグインを MTOS 以外でも対応する予定ありますでしょうか。

No.4  : (無題)

>bzbellさん
こんにちは。

WidgetSetLoopプラグインはMITライセンスで公開していますので、個人ライセンスや商用ライセンスのMTとも組み合わせていただくことができます。

コメントする