「WordPressで学ぶPHP(1)変数・制御構造編」が発売されました。
「WordPressで学ぶPHP」シリーズの第1巻で、WordPressを通してPHPを学んでいく本です。
この本では、PHPの基本となる変数と制御構造について解説します。
Kindle本で、定価500円です。
WriteToFileプラグインを使った静的ページ分割
先日、「テンプレートの再構築結果を部分的にファイルに出力するプラグイン」(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>
この部分では、ページ数分の繰り返しを行って、各ページへのリンクを「|」で区切って出力しています
ただし、現在表示しているページはリンクにせずに、ページ番号のみ出力するようにしています。