ブログ記事とコメントをひとつのフィードで配信する
Movable Typeで、ブログ記事とコメントをひとつのフィードにまとめて出力するカスタマイズを紹介します。
1.利用シーン
このフィードは、掲示板やFAQなどのような、コメント投稿の比重が高いサイトでの利用を想定しています。
例えばコミュニティ掲示板で、トピックに対するコメントをフィードで配信している場合、コメントしか購読できないと、元のトピックの内容が分かりません。元のトピックを読むには、表示されているコメントの元ページから辿るか、トピックを配信するフィードを別に購読する必要があります。次のキャプチャは、Firefox 3でフィードを表示したものです。
変更前

トピックとコメントをひとつのフィードにまとめて時系列に表示することで、掲示板全体の流れを購読することができます。
変更後

もちろん、通常のブログでも利用できます。
2.フィード用テンプレートの作成
フィード用のインデックステンプレートを作成します。
テンプレート名:トピックとコメント ※名前は何でも構いません
ファイル名:comments.xml
テンプレートの内容:以下
<$mt:HTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$mt:PublishCharset$>"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><$mt:BlogName remove_html="1" encode_xml="1"$></title>
<link rel="alternate" type="text/html" href="<$mt:BlogURL encode_xml="1"$>" />
<link rel="self" type="application/atom+xml" href="<$mt:Link template="feed_recent"$>" />
<id>tag:<$mt:BlogHost exclude_port="1" encode_xml="1"$>,<$mt:TemplateCreatedOn format="%Y-%m-%d"$>:<$mt:BlogRelativeURL encode_xml="1"$>/<$mt:BlogID$></id>
<updated><mt:Entries lastn="1"><$mt:EntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></mt:Entries></updated>
<mt:If tag="BlogDescription"><subtitle><$mt:BlogDescription remove_html="1" encode_xml="1"$></subtitle></mt:If>
<generator uri="http://www.sixapart.com/movabletype/"><$mt:ProductName version="1"$></generator>
<mt:SetVar name="number" value="5" />
<mt:Entries lastn="$number">
<mt:EntryDate format="%Y%m%d%H%M%S" setvar="date" />
<mt:SetVarBlock name="feed_data{$date}">
<entry>
<title><$mt:EntryTitle remove_html="1" encode_xml="1"$></title>
<link rel="alternate" type="text/html" href="<$mt:EntryPermalink encode_xml="1"$>" />
<id><$mt:EntryAtomID$></id>
<published><$mt:EntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
<updated><$mt:EntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
<summary><$mt:EntryExcerpt remove_html="1" encode_xml="1"$></summary>
<author>
<name><$mt:EntryAuthorDisplayName encode_xml="1"$></name>
<uri><$mt:CGIPath encode_xml="1"$><$mt:CommunityScript encode_xml="1"$>?__mode=view&blog_id=<$mt:BlogID$>&id=<$mt:EntryAuthorID$></uri>
</author>
<mt:EntryCategories>
<category term="<$mt:CategoryLabel encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
</mt:EntryCategories>
<mt:EntryIfTagged><mt:EntryTags><category term="<$mt:TagName normalize="1" encode_xml="1"$>" label="<$mt:TagName encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#tag" />
</mt:EntryTags></mt:EntryIfTagged>
<content type="html" xml:lang="<$mt:BlogLanguage ietf="1"$>" xml:base="<$mt:BlogURL encode_xml="1"$>">
<$mt:EntryBody encode_xml="1"$>
<$mt:EntryMore encode_xml="1"$>
</content>
</entry>
</mt:SetVarBlock>
</mt:Entries>
<mt:Comments lastn="$number">
<mt:CommentDate format="%Y%m%d%H%M%S" setvar="date" />
<mt:SetVarBlock name="feed_data{$date}">
<entry>
<mt:CommentEntry>
<title>「<$mt:EntryTitle remove_html="1" encode_xml="1"$>」へのコメント</title>
<link rel="alternate" type="text/html" href="<$mt:EntryPermalink encode_xml="1"$>" />
<id><$mt:EntryAtomID$><$mt:CommentID$></id>
<published><$mt:CommentDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
<updated><$mt:CommentDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
<summary><$mt:CommentBody trim_to="60" remove_html="1" encode_xml="1"$>...</summary>
<author>
<name><$mt:CommenterUsername encode_xml="1"$></name>
<uri><$mt:CGIPath encode_xml="1"$><$mt:CommunityScript encode_xml="1"$>?__mode=view&blog_id=<$mt:BlogID$>&id=<$mt:CommenterID$></uri>
</author>
<mt:EntryCategories>
<category term="<$mt:CategoryLabel encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
</mt:EntryCategories>
<mt:EntryIfTagged><mt:EntryTags><category term="<$mt:TagName normalize="1" encode_xml="1"$>" label="<$mt:TagName encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#tag" />
</mt:EntryTags></mt:EntryIfTagged>
<content type="html" xml:lang="<$mt:BlogLanguage ietf="1"$>" xml:base="<$mt:BlogURL encode_xml="1"$>">
<$mt:CommentBody encode_xml="1"$>
</content>
</mt:CommentEntry>
</entry>
</mt:SetVarBlock>
</mt:Comments>
<mt:loop name="feed_data" sort_by="key reverse">
<mt:if name="__counter__" le="$number">
<mt:GetVar name="__value__" />
</mt:if>
</mt:loop>
</feed>
3.テンプレートの解説
作成したインデックステンプレートでは、まず、最新のブログ記事について、指定件数分、ハッシュ変数に設定します。同じように、最新のコメントについて、指定件数分、先程と同じハッシュ変数に設定します。ハッシュのキーにはブログ記事投稿時間、またはコメント投稿時間を利用します。設定後、ハッシュのキーを降順にソートして出力します。
フィード出力数は、次のMTSetVarタグで設定します。
<mt:SetVar name="number" value="15" />
また、フィード出力数とMTEntriesタグ、MTComentsタグのlastnモディファイアの値は変数numberを使って、すべて同数にしています。
<mt:Entries lastn="$number">
…中略…
</mt:Entries>
<mt:Comments lastn="$number">
…中略…
</mt:Comments>
例えばフィード出力数が「15」であれば、MTEntriesタグ、MTComentsタグのlastnモディファイアの値も「15」になります。こうしておけば、フィードの出力内容がブログ記事のみ、またはコメントのみになった場合でも不足なく表示されます。
収集したデータはMTLoopタグで出力します。
<mt:loop name="feed_data" sort_by="key reverse">
<mt:if name="__counter__" le="$number">
<mt:GetVar name="__value__" />
</mt:if>
</mt:loop>
変数numberを「15」にしておけば、最大15回繰り返します。
4.フィード用リンクの作成
次のような、フィード用リンクのウィジェットテンプレートを作成します。
<ul>
<li><img src="<$mt:StaticWebPath$>images/status_icons/feed.gif" alt="購読する" width="9" height="9" /> <a href="<$mt:BlogURL$>comments.xml" title="購読する">すべての掲示板とコメント</a></li>
</ul>
予定日を過ぎたブログ記事を「最近のブログ記事」に表示しない
Movable Type 4 以降で、ブログ記事を指定した日程順に並べ、予定日を過ぎたブログ記事は「最近のブログ記事」に表示しないカスタマイズです。完全形ではありませんが、とりあえずアイデアということで紹介します。
1.カスタムフィールドの作成
ブログ記事用のカスタムフィールド「EntryScheduleDate(日付フィールド)」を作ります。このフィールドにスケジュールとなる任意の日付を設定します。
作成したカスタムフィールドのベースネームは、次項の都合で「cf_1」としておきます。
2.インデックステンプレートの作成
次のインデックステンプレートを作成します。このテンプレートはダイナミックパブリッシングを指定します。
<mt:Date format="%Y%m%d" setvar="current_date" />
<mt:Entries limit="5" sort_by="field:cf_1" sort_order="ascend">
<mt:EntriesHeader>
<div class="widget">
<h3 class="widget-header">今後のスケジュール</h3>
<div class="widget-content">
<ul>
</mt:EntriesHeader>
<mt:EntryScheduleDate format="%Y%m%d" setvar="entry_date" />
<mt:if name="entry_date" ge="$current_date">
<li><mt:EntryScheduleDate format="%b月%e日" strip="" />:<mt:EntryTitle /></li>
</mt:if>
<mt:EntriesFooter>
</ul>
</div>
</div>
</mt:EntriesFooter>
</mt:Entries>
まず、MTDate タグでこのインデックステンプレートの再構築日付(=アクセス日付:年月日)を取得し、変数current_dateに保存します。
次に、MTEntriesタグでブログ記事を処理します。「sort_by="field:cf_1"」と「sort_order="ascend"」を組み合わせて、設定したスケジュール順に表示します。
カスタムフィールドMTEntryScheduleDateタグの日付(年月日)を変数entry_dateに保存し、変数current_date以上、つまり同一日か未来の日付であれば一覧に表示します。
このサンプルでは年月日までの比較ですが、formatモディファイアの値を変更すれば時分秒まで比較可能です。
3.その他
以前に公開した「新着マーク表示」のように、PHPを利用してテンプレートタグを書き換えればスタティックパブリッシングでも動作すると思います。
mt-csv2customfields v0.03
CSV形式のデータを Movable Type のブログ記事およびカスタムフィールドに一括読み込みさせるスクリプト mt-csv2customfields.cgi をバージョンアップしました。
追加機能は次の通りです。
- コメント受信設定とトラックバック受信設定に対応
- 出力ファイル名(ベースネーム)の設定に対応
最新版のダウンロードと使用方法は以下の記事を参照願います。なお、本スクリプトは MT5.0 で正常に動作することを確認しています。
複数ブログのブログ記事を時間順に1件ずつ表示する
MultiBlog タグに mode="context" を付与した場合や、Entries タグに blog_ids="children" を付与すれば、複数ブログのタグを時間順に表示することができますが、それぞれのブログの件数を制限することはできません(「blog_ids="children"」はMovable Type 5以降で利用可能)。
例えば、ウェブサイト配下に 3 つのブログがあり、ウェブサイトに各ブログの最新記事1件を時間順に並べる場合などです。
このエントリーでは、3つのブログのブログ記事が次のように(新着順に)並んでいても、

このように、それぞれのブログの最新記事1件を表示するカスタマイズを紹介します。

上記の表示は以下のサブテンプレートで実現できると思いますので、試してみてください。
1.MultiBlog タグの場合
<mt:MultiBlog mode="context">
<mt:Entries lastn="0">
<mt:EntriesHeader>
<ul>
</mt:EntriesHeader>
<mt:BlogName setvar="blog_name" />
<mt:var name="flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$blog_name">
<mt:var name="flag" value="1" />
</mt:if>
</mt:loop>
<mt:unless name="flag">
<li><mt:BlogName />:<mt:EntryTitle /></li>
<mt:setVar name="push(list)" value="$blog_name" />
</mt:unless>
<mt:EntriesFooter>
</ul>
</mt:EntriesFooter>
</mt:Entries>
</mt:MultiBlog>
2.MTEntries タグの場合
<mt:Entries blog_ids="children" lastn="0">
<mt:EntriesHeader>
<ul>
</mt:EntriesHeader>
<mt:BlogName setvar="blog_name" />
<mt:var name="flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$blog_name">
<mt:var name="flag" value="1" />
</mt:if>
</mt:loop>
<mt:unless name="flag">
<li><mt:BlogName />:<mt:EntryTitle /></li>
<mt:setVar name="push(list)" value="$blog_name" />
</mt:unless>
<mt:EntriesFooter>
</ul>
</mt:EntriesFooter>
<mt:var name="__counter__" />
</mt:Entries>
2010.04.14
「blog_ids="site"」を「blog_ids="children"」に変更しました("site"は、Movable Type 5.0ベータ版で設定可能となっていた値)。また、「blog_ids="children"」の利用可能バージョンを追記しました。
Movable Type のブログ記事にフラグメント識別子(ページ内リンク)を設定する
Movable Type のブログ記事の中でフラグメント識別子(ページ内リンク)を設定する方法を紹介します。
1.フラグメント識別子について
「フラグメント識別子」とは「文書の特定の場所へのリンク」のことです。例えば次の画面の「注1」~「注3」が、フラグメント識別子つきのリンクです。

下の例の青色部分がフラグメント識別子です。
<a href="post.html#note1">注1</a>
上記のリンクをクリックすれば、post.html 文書の、次のように id 属性値が note1 という位置の内容を先頭になるようにを表示します。
<p id="note1">注1:~</p>
以前は、この id 属性の代わりに name 属性を用いて、
<a name="note1">注1:~</a>
という形式が一般的でしたが、現在は a 要素に特定しない、id 属性による設定が一般的です(a 要素の name 属性は XHTML1.1 以降では廃止されます)。
2.ブログ記事のフラグメント識別子について
Movable Type のブログ記事で「注1」のようなページ内リンクを付与するときに気をつけないといけないのは、「メインページ・アーカイブページで id 属性値が重複しないこと」です。ブログ記事ページでは他のブログ記事ページが表示されないので、id 属性を気にする必要がありませんが、メインページ・アーカイブページでは他のブログ記事も表示されるので、ブログ内のすべてのブログ記事で一意となる id 属性値を設定する必要があります。id 属性値を重複させないためには、ブログ記事の ID 番号を用いるのが簡単です。
つまり、ブログ記事内のフラグメント識別子は次のような形式が例として望ましいと考えます。
<a href="#note[ブログ記事ID]">~</a>
具体的には、次のようにMTEntryID タグをフラグメント識別子に設定します。
<a href="#note<$mt:EntryID$>">~</a>
1つのブログ記事に複数のフラグメント識別子を付与する場合は、さらに一意となる番号を付与します。
<a href="#note<$mt:EntryID$>1">~</a>
なお、ブログ記事内でテンプレートタグを利用するには、予め各テンプレートの MTEntryBody タグに mteval モディファイアを追加しておきます。
<$mt:EntryBody mteval="1"$>
3.番号付与を自動化する
ブログ記事内でフラグメントを複数設定する場合、2項で説明した「一意となる番号」についても、テンプレートタグを用いて次のようにを自動化する方法が考えられます。
まず、下の内容を「フラグメント」というテンプレートモジュールで保存します。
<mt:SetVarTemplate name="fragment"><mt:SetVar name="fragment_number" op="++" /><mt:GetVar name="fragment_number" /></mt:SetVarTemplate>
<mt:SetVar name="fragment_number" value="0" />
そして、ブログ記事の初回のフラグメント識別子は次のように設定します。リッチテキストでは適正に保存できないため、リッチテキストで編集した後、フォーマットを「なし」または「改行を変換」に変更してから追加してください。
<a href="#note<$mt:EntryID$><mt:include module="フラグメント" /><mt:GetVar name="fragment" />">注1</a>
動作概要は、MTInclude タグで、「フラグメント」テンプレートモジュールを呼び出し、変数 fragment の利用と、変数 fragment_number を初期化します。そして、MTGetVar タグで変数 fragment を取得することで、MTSetVarTemplate タグの内容が評価されます。つまり、変数 fragment_number をインクリメントし、fragment_number の値を出力します。これでフラグメント識別子の最後に 「1」が表示されます。また、MTInclude タグを別の行に記述すると冗長な空行が発生するため、フラグメント識別子に含めています。
2回目以降のフラグメント識別子は次のように MTGetVar タグで変数 fragment を取得するだけです。これでフラグメント識別子の最後に 「2」が表示されます。
<a href="#note<$mt:EntryID$><mt:GetVar name="fragment" />" />注2</a>
このように、フラグメント識別子を付与するテンプレートモジュールを予め用意しておくことで、フラグメント設定の手間を省くことができます。
ちなみに、リンク先も次のようにしておけば、番号の対応を気にする必要がなくなります。
<div id="<mt:SetVar name="fragment_number" value="0" />note<$mt:EntryID$><mt:GetVar name="fragment" />">注1</div>
<div id="note<$mt:EntryID$><mt:GetVar name="fragment" />">注2</div>
4.テキストも自動化する
「注n」の n の部分も、MTGetVar タグで変数 fragment_number の値を表示する手もあります。3項を例に書き直したものが以下です。
フラグメント識別子
<a href="#note<$mt:EntryID$><mt:include module="フラグメント" /><mt:GetVar name="fragment" />">注<mt:GetVar name="fragment_number" /></a>
<a href="#note<$mt:EntryID$><mt:GetVar name="fragment" />" />注<mt:GetVar name="fragment_number" /></a>
リンク先
<div id="<mt:SetVar name="fragment_number" value="0" />note<$mt:EntryID$><mt:GetVar name="fragment" />">注<mt:GetVar name="fragment_number" /></div>
<div id="note<$mt:EntryID$><mt:GetVar name="fragment" />">注<mt:GetVar name="fragment_number" /></div>
ただし、編集画面でリンク元とリンク先の対応が分かりにくくなるのが欠点です。
5.ウェブページについて
ウェブページは1つのアーカイブページに単一のウェブページしか表示しないので、ウェブページ内で id 属性が一意となっていれば大丈夫です。
特定のカテゴリーに属するブログ記事一覧を表示する(改)
Movable Type で、特定のカテゴリーに属するブログ記事一覧を表示するカスタマイズです。
MTEntries タグに category モディファイアを適用するだけでは適正に取得できないケースを、テンプレートタグのカスタマイズによって実現します。
1.MTEntries タグの category/categories モディファイアについて
MTEntries タグには category/categories モディファイアがあり、モディファイアに指定したカテゴリーのブログ記事を取得できます。
ただし、次のようなカテゴリーで、トップカテゴリーの「お知らせ」カテゴリーだけに属するブログ記事を抽出したいと仮定します。
・お知らせ
・イベントA
└ お知らせ
・イベントB
└ お知らせ
この場合、次のテンプレートタグでは、イベントAやイベントBの「お知らせ」カテゴリーに属するブログ記事も対象になってしまいます。
<mt:entries category="お知らせ">
...中略...
</mt:entries>
具体例として、前述の各「お知らせ」カテゴリーに次のブログ記事が属しているとします(●印)。
・お知らせ
●モバイルサイトオープン
●業務提携に関するお知らせ
・イベントA
└ お知らせ
●ソリューションセミナー
●Movable Type 入門セミナー
・イベントB
└ お知らせ
●オフィシャルサイトオープン
●シンポジウム2008
●ホームページリニューアル
サイドバーに表示する「最近のブログ記事」の MTEntries タグに category モディファイアを適用して「お知らせ」を設定すると、次のように表示されます。

余談ですが、イベントAの「お知らせ」カテゴリーに属するブログ記事を抽出したい場合、次のように指定しても、適正に取得できないようです。
<mt:entries category="イベントA/お知らせ">
...中略...
</mt:entries>
2.動作確認バージョン
このカスタマイズは次のバージョンで確認しています。
- Movable Type 4.2x(~4.23)
3.カスタマイズ
サイドバーに設置する場合、次のサブテンプレートを利用してください。
デフォルトテンプレート用
<mt:setVar name="category" value="取得したいブログ記事のカテゴリ名" />
<mt:if tag="blogEntryCount">
<div class="widget-recent-entries widget-archives widget">
<h3 class="widget-header">最近のブログ記事</h3>
<div class="widget-content">
<ul>
</mt:if>
<mt:entries category="$category">
<mt:setVar name="undef(list)" />
<mt:setVar name="count" value="0" />
<mt:entryCategories>
<mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
<mt:setVar name="count" op="++" />
</mt:entryCategories>
<mt:setVar name="category_flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$category">
<mt:setVar name="category_flag" value="1" />
</mt:if>
</mt:loop>
<mt:if name="category_flag">
<li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
</mt:if>
</mt:entries>
<mt:if tag="blogEntryCount">
</ul>
</div>
</div>
</mt:if>
小粋空間テンプレート用
<mt:setVar name="category" value="取得したいブログ記事のカテゴリ名" />
<mt:if tag="blogEntryCount">
<dt class="sidetitle">最近のブログ記事</dt>
<dd class="side">
<ul>
</mt:if>
<mt:entries category="$category">
<mt:setVar name="undef(list)" />
<mt:setVar name="count" value="0" />
<mt:entryCategories>
<mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
<mt:setVar name="count" op="++" />
</mt:entryCategories>
<mt:setVar name="category_flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$category">
<mt:setVar name="category_flag" value="1" />
</mt:if>
</mt:loop>
<mt:if name="category_flag">
<li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
</mt:if>
</mt:entries>
<mt:if tag="blogEntryCount">
</ul>
</dd>
</mt:if>
このサブテンプレートを利用することで、先のサンプルを次のように表示させることができます。

4.サブテンプレートの解説
上記のサブテンプレートについて、必要な部分のみ抜粋して解説します。
01:<mt:setVar name="category" value="取得したいブログ記事のカテゴリ名" />
02:<mt:if tag="blogEntryCount">
03:<ul>
04:</mt:if>
05:<mt:entries category="$category">
06: <mt:setVar name="undef(list)" />
07: <mt:setVar name="count" value="0" />
08: <mt:entryCategories>
09: <mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
10: <mt:setVar name="count" op="++" />
11: </mt:entryCategories>
12: <mt:setVar name="category_flag" value="0" />
13: <mt:loop name="list">
14: <mt:if name="__value__" eq="$category">
15: <mt:setVar name="category_flag" value="1" />
16: </mt:if>
17: </mt:loop>
18: <mt:if name="category_flag">
19: <li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
20: </mt:if>
21:</mt:entries>
22:<mt:if tag="blogEntryCount">
23:</ul>
24:</mt:if>
1行目の value モディファイアの値(赤色部分)に抽出したいカテゴリー名を設定します。冒頭のカテゴリー一覧から「お知らせ」を抽出したい場合は次のように記述します。
<mt:setVar name="category" value="お知らせ" />
サブカテゴリーを指定したい場合は、カテゴリーの区切り文字を "/" にします。例えば冒頭のカテゴリー一覧からイベントAの「お知らせ」を抽出したい場合は、次のように設定します。
<mt:setVar name="category" value="イベントA/お知らせ" />
2~4行目の MTIf タグで ul 要素の開始タグを出力します。また、22~24行目の MTIf タグで ul 要素の終了タグを出力します。
<mt:if tag="blogEntryCount">
<ul>
</mt:if>
...中略...
<mt:if tag="blogEntryCount">
</ul>
</mt:if>
本来は MTEntries タグ内に MTEntriesHeader タグ・MTEntriesFooter タグを使用して、初回の繰り返しで ul 要素の開始タグ、繰り返しの最後で ul 要素の終了タグを出力するのですが、このサブテンプレートでは MTEntriesFooter タグが正常に動作せず、初回のブログ記事の処理で実行されてしまいます。原因は MTEntries タグの中で色々なテンプレートタグを使っていて、 MTEntriesFooter タグを判定するデータが上書きされてしまっていると推測します。したがってMTEntriesFooter タグは使用せず、MTEntries タグの外側でMTIf タグで ul 要素の終了タグを出力します。それに併せて、MTEntriesHeader タグも使用していない、ということです。
5行目~21行目で MTEntries タグのループがあります。category モディファイアには、1行目で設定した変数 category を設定します。
<mt:entries category="$category">
...中略...
</mt:entries>
6~7行目で利用する変数の初期化を行います。
<mt:setVar name="undef(list)" />
<mt:setVar name="count" value="0" />
配列変数 list は、ブログ記事に属するすべてのカテゴリ名を保持するもので、count は配列変数 list のインデックス用カウンタです。いずれも処理対象のブログ記事が切り替わった時点で初期化します。配列変数 list は初期化しないと、例えば前回の処理でインデックス値 3 まで設定され、今回の処理でインデックス値 2 までしか使われなかったら、前回のインデックス値 3 が処理対象となってしまいます。
なお、undef 関数の場合、MTSetVar タグでも value モディファイアの設定は不要です。
8~11行目で、あるブログ記事が属するすべてのカテゴリーを変数 list に保持します。
<mt:entryCategories>
<mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
<mt:setVar name="count" op="++" />
</mt:entryCategories>
8行目の MTEntryCategories タグで、ブログ記事が属するすべてのカテゴリー分、繰り返し処理を行います。ブロック内でカテゴリー名を取得しますが、その時、さらに MTParentCategories タグを用いて、処理対象のカテゴリーについて、親カテゴリーからのすべてのカテゴリ名を取得します。親カテゴリーから現在のカテゴリーまでの区切り文字は glue モディファイアを使って "/" を与えます。10行目の MTSetVar タグでは、変数 count の値をインクリメントし、次のカテゴリーの処理のためにインデックス値を更新します。
12~17行目は、設定した配列変数 list に、1行目で設定したカテゴリー名と同じカテゴリー名があることをチェックします。
<mt:setVar name="category_flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$category">
<mt:setVar name="category_flag" value="1" />
</mt:if>
</mt:loop>
12行目はチェック処理で利用する変数 flag を初期化します。13~17行目の MTLoop タグで配列変数 list を指定し、14行目で配列変数の値 __value__ と変数 category を比較します。等しければ、変数 flag に 1 を設定します。
18~20行目で変数 flag を判定し、1であれば(=1行目の変数 category に設定したカテゴリーがブログ記事に設定されていれば)ブログ記事タイトルを出力します。
<mt:if name="category_flag">
<li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
</mt:if>
アップロード画像の img 要素の alt 属性・title 属性をカスタマイズする(サムネイル画像編)
以前エントリーした「アップロード画像の img 要素の alt 属性・title 属性をカスタマイズする」で、サムネイル画像への対応がもれていたので、本エントリーにて補足します。
1.概要
Movable Type のデフォルト状態では、次のようにアップロード時のオプションでサムネイル表示を設定した場合、

埋め込まれる img 要素には、title 属性が表示されません。

下に示す、2項のカスタマイズを行えば、埋め込まれる img 要素に title 属性が追加され、「ファイルオプション」の「説明」フィールドの内容が反映されます。

2.「説明」フィールドの内容を title 属性に挿入する
サムネイル画像を Movable Type の記事本文などに挿入したときに、img 要素に title 属性を追加し、「説明」フィールドの内容を title 属性の内容に反映させるカスタマイズです。
このカスタマイズでは、「アップロード画像の img 要素の alt 属性・title 属性をカスタマイズする」の2項「『説明』フィールドの内容を title 属性に挿入する」のカスタマイズも同時に行っています。
「説明」フィールドの内容を title 属性に挿入するには、次の内容をパッチとして使ってください。パッチの実施方法は下記のエントリーを参考にしてください。
--- lib/MT/Asset/Image.pm.bak Tue Aug 12 09:51:00 2008
+++ lib/MT/Asset/Image.pm Mon Nov 24 01:54:47 2008
@@ -305,8 +305,9 @@
my $link =
$thumb
? sprintf(
- '<img src="%s" %s alt="%s" %s />',
+ '<img src="%s" %s title="%s" alt="%s" %s />',
MT::Util::encode_html( $thumb->url ), $dimensions,
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->label ), $wrap_style
)
: MT->translate('View image');
@@ -322,9 +323,10 @@
else {
if ( $param->{thumb} ) {
$text = sprintf(
- '<a href="%s"><img alt="%s" src="%s" %s %s /></a>',
+ '<a href="%s"><img alt="%s" title="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
MT::Util::encode_html( $asset->label ),
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
@@ -332,8 +334,9 @@
}
else {
$text = sprintf(
- '<img alt="%s" src="%s" %s %s />',
+ '<img alt="%s" title="%s" src="%s" %s %s />',
MT::Util::encode_html( $asset->label ),
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
パッチが分からない方は、lib/MT/Asset/Image.pm をダウンロードして任意のエディタで開き、300行目あたりからの下記の部分に、青色の内容を追加してください。変更後、元のディレクトリにアップロードすれば完了です。
作業前にファイルのバックアップをとっておくと良いでしょう。
...前略...
if ( $param->{popup} && $param->{popup_asset_id} ) {
my $popup = MT::Asset->load( $param->{popup_asset_id} )
|| return $asset->error(
MT->translate(
"Can't load image #[_1]",
$param->{popup_asset_id}
)
);
my $link =
$thumb
? sprintf(
'<img src="%s" %s title="%s" alt="%s" %s />',
MT::Util::encode_html( $thumb->url ), $dimensions,
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->label ), $wrap_style
)
: MT->translate('View image');
$text = sprintf(
q|<a href="%s" onclick="window.open('%s','popup','width=%d,height=%d,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false">%s</a>|,
MT::Util::encode_html( $popup->url ),
MT::Util::encode_html( $popup->url ),
$asset->image_width,
$asset->image_height,
$link,
);
}
else {
if ( $param->{thumb} ) {
$text = sprintf(
'<a href="%s"><img alt="%s" title="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
MT::Util::encode_html( $asset->label ),
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
);
}
else {
$text = sprintf(
'<img alt="%s" title="%s" src="%s" %s %s />',
MT::Util::encode_html( $asset->label ),
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
}
}
...後略...
ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2/Movable Type 5対応)
「ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」の Movable Type 4.2 版のプラグインを公開します。
元記事の内容は Movable Type 4.1 の内容であり、Movable Type 4.2 では前後リンクが正常に表示されない場合があります。
2009.01.05 追記:Movable Type 5.0 で動作することを確認しました。
1.プラグインの概要
下の画面(元記事の再掲)のブログ記事タイトル上にある前後リンクは、分かりにくいですが、同一カテゴリーのブログ記事です。


「ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」では、元のプラグイン「Previous and next in category」を修正する形で書いてましたが、修正箇所が多いため、プラグインファイルで公開します(ファイル内に元プラグインの著者を掲載しています)。
このプラグインは Movable Type 4.1 / 4.2 / 5.0 で動作することを確認しています。
2.PreviousNextInCategory プラグインのダウンロード
下記の PreviousNextInCategory.zip をクリックして、プラグインアーカイブをダウンロード。
3.PreviousNextInCategory プラグインのアップロード・インストール
プラグインアーカイブを展開し、中にある PreviousNextInCategory フォルダごと、Movable Type のアプリケーションディレクトリの plugins ディレクトリにアップロード。
システム管理画面のプラグイン一覧で、「PreviousNextInCategory ~」が表示されればインストール完了です。

4.プライマリカテゴリーに属するブログ記事のみを表示する場合
ブログ記事アーカイブの任意の位置に下記のサブテンプレートを設定してください。
<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> |
</MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink archive_type="Category"$>"><$MTEntryCategory$></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>
ブログ記事アーカイブを再構築すれば、冒頭のように、同一カテゴリーの前後記事リンクが表示されます。
5.ブログ記事に登録されているすべてのカテゴリーに属するブログ記事を表示する場合
ブログ記事アーカイブの任意の位置に、下記のサブテンプレートを設定してください。
<MTEntryCategories>
<p>
<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> |
</MTEntryPreviousInCategory>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>
</p>
</MTEntryCategories>
ブログ記事アーカイブを再構築すれば、ブログ記事が属する全カテゴリーの前後記事リンクが表示されます。
6.元プラグインの変更点
一応、元プラグイン PreviousNextInCategory.pl の変更点を掲載しておきます。実際にはこの修正に加えて、ブログ記事が再構築されたときに同一カテゴリーの前後記事を再構築する処理も追加しています。
「ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」での変更(青色部分を追加)
sub _hdlr_entry_previous_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryPrevious');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $prev = $e->previous(1);
my $res = '';
while ($prev && !$prev->is_in_category($cat)){
$prev = $prev->previous(1);
}
if ($prev) {
my $builder = $ctx->stash('builder');
local $ctx->{__stash}->{entry} = $prev;
local $ctx->{current_timestamp} = $prev->created_on;
my %cond = %$cond;
$cond{EntryIfAllowComments} = $prev->allow_comments;
$cond{EntryIfCommentsOpen} = $prev->allow_comments eq '1';
$cond{EntryIfAllowPings} = $prev->allow_pings;
$cond{EntryIfExtended} = $prev->text_more ? 1 : 0;
my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
return $ctx->error( $builder->errstr ) unless defined $out;
$res .= $out;
}
$res;
}
sub _hdlr_entry_next_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryNext');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $next = $e->next(1);
my $res = '';
while ($next && !$next->is_in_category($cat)){
$next = $next->next(1);
}
if ($next) {
my $builder = $ctx->stash('builder');
local $ctx->{__stash}->{entry} = $next;
local $ctx->{current_timestamp} = $next->created_on;
my %cond = %$cond;
$cond{EntryIfAllowComments} = $next->allow_comments;
$cond{EntryIfCommentsOpen} = $next->allow_comments eq '1';
$cond{EntryIfAllowPings} = $next->allow_pings;
$cond{EntryIfExtended} = $next->text_more ? 1 : 0;
my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
return $ctx->error( $builder->errstr ) unless defined $out;
$res .= $out;
}
$res;
}
4.2 対応の変更(赤色が 4.1 までの追加部分で、青色部分をさらに追加)
sub _hdlr_entry_previous_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryPrevious');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $terms;
$terms->{category_id} = $cat->id;
my $prev = $e->previous(1, $terms);
my $res = '';
while ($prev && !$prev->is_in_category($cat)){
$terms->{category_id} = $cat->id;
$prev = $prev->previous(1, $terms);
}
if ($prev) {
my $builder = $ctx->stash('builder');
local $ctx->{__stash}->{entry} = $prev;
local $ctx->{current_timestamp} = $prev->created_on;
my %cond = %$cond;
$cond{EntryIfAllowComments} = $prev->allow_comments;
$cond{EntryIfCommentsOpen} = $prev->allow_comments eq '1';
$cond{EntryIfAllowPings} = $prev->allow_pings;
$cond{EntryIfExtended} = $prev->text_more ? 1 : 0;
my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
return $ctx->error( $builder->errstr ) unless defined $out;
$res .= $out;
}
$res;
}
sub _hdlr_entry_next_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryNext');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $terms;
$terms->{category_id} = $cat->id;
my $next = $e->next(1, $terms);
my $res = '';
while ($next && !$next->is_in_category($cat)){
$terms->{category_id} = $cat->id;
$next = $next->next(1, $terms);
}
if ($next) {
my $builder = $ctx->stash('builder');
local $ctx->{__stash}->{entry} = $next;
local $ctx->{current_timestamp} = $next->created_on;
my %cond = %$cond;
$cond{EntryIfAllowComments} = $next->allow_comments;
$cond{EntryIfCommentsOpen} = $next->allow_comments eq '1';
$cond{EntryIfAllowPings} = $next->allow_pings;
$cond{EntryIfExtended} = $next->text_more ? 1 : 0;
my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
return $ctx->error( $builder->errstr ) unless defined $out;
$res .= $out;
}
$res;
}
アップロード画像の img 要素の alt 属性・title 属性をカスタマイズする
Movable Type 4.2 で、ブログ記事の「画像の挿入」を使ってアップロード画像を本文や追記に埋め込む場合の、img 要素のalt 属性や title 属性の出力内容をカスタマイズする方法です。
1.「説明」フィールドの内容を alt 属性に挿入する
アップロード時の「説明」フィールドの内容を alt 属性に反映させるカスタマイズです。
デフォルトの状態では、次のようにアップロード時のオプションを設定した場合、

埋め込まれる img 要素の alt 属性には、このように「ファイルオプション」の「名前」フィールドの内容が反映されます。

下に示す、1項のカスタマイズを行えば、埋め込まれる img 要素の alt 属性には、このように「ファイルオプション」の「説明」フィールドの内容が反映されます。

ただし、デフォルトの動作(alt 属性に「名前」フィールドの内容を反映)は適切と思われます。
alt 属性の目的が画像の代替文字列を表示させるためのものであり、代替文字列に対応するのは「名前」フィールドが妥当です。つまり、「名前」フィールドを適切な内容に書き換えてアップロードすればいいわけです。「名前」フィールドを書き換えてもファイル名が変更される訳ではありません。

が、「説明」フィールドの内容を alt 属性値として使いたい場合は、後述するカスタマイズを行ってください。
次の内容をパッチとして使ってください。パッチの実施方法は下記のエントリーを参考にしてください。
--- lib/MT/Asset/Image.pm.bak Wed Aug 27 00:39:40 2008
+++ lib/MT/Asset/Image.pm Wed Aug 27 00:36:14 2008
@@ -324,7 +324,7 @@
$text = sprintf(
'<a href="%s"><img alt="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
- MT::Util::encode_html( $asset->label ),
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
@@ -333,7 +333,7 @@
else {
$text = sprintf(
'<img alt="%s" src="%s" %s %s />',
- MT::Util::encode_html( $asset->label ),
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
パッチが分からない方は、lib/MT/Asset/Image.pm をダウンロードして任意のエディタで開き、322行目あたりにある下記の赤色部分を、青色の内容に書き換えてください。変更後、元のディレクトリにアップロードすれば完了です。
作業前にファイルのバックアップをとっておくと良いでしょう。
変更前
...前略...
else {
if ( $param->{thumb} ) {
$text = sprintf(
'<a href="%s"><img alt="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
MT::Util::encode_html( $asset->label ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
);
}
else {
$text = sprintf(
'<img alt="%s" src="%s" %s %s />',
MT::Util::encode_html( $asset->label ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
}
...後略...
変更後
...前略...
else {
if ( $param->{thumb} ) {
$text = sprintf(
'<a href="%s"><img alt="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
);
}
else {
$text = sprintf(
'<img alt="%s" src="%s" %s %s />',
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
}
...後略...
2.「説明」フィールドの内容を title 属性に挿入する
画像を挿入したときに、img 要素に title 属性を追加し、「説明」フィールドの内容を title 属性の内容に反映させるカスタマイズです。

1項と同様、次の内容をパッチとして使ってください。
--- lib/MT/Asset/Image.pm.bak Wed Aug 27 00:39:40 2008
+++ lib/MT/Asset/Image.pm Wed Aug 27 01:17:48 2008
@@ -322,9 +322,10 @@
else {
if ( $param->{thumb} ) {
$text = sprintf(
- '<a href="%s"><img alt="%s" src="%s" %s %s /></a>',
+ '<a href="%s"><img alt="%s" title="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
MT::Util::encode_html( $asset->label ),
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
@@ -332,8 +333,9 @@
}
else {
$text = sprintf(
- '<img alt="%s" src="%s" %s %s />',
+ '<img alt="%s" title="%s" src="%s" %s %s />',
MT::Util::encode_html( $asset->label ),
+ MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
パッチが分からない方は、lib/MT/Asset/Image.pm をダウンロードして任意のエディタで開き、322行目あたりに、下記の青色部分の内容を追加してください。変更後、元のディレクトリにアップロードすれば完了です。
作業前にファイルのバックアップをとっておくと良いでしょう。
...前略...
else {
if ( $param->{thumb} ) {
$text = sprintf(
'<a href="%s"><img alt="%s" title="%s" src="%s" %s %s /></a>',
MT::Util::encode_html( $asset->url ),
MT::Util::encode_html( $asset->label ),
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $thumb->url ),
$dimensions,
$wrap_style,
);
}
else {
$text = sprintf(
'<img alt="%s" title="%s" src="%s" %s %s />',
MT::Util::encode_html( $asset->label ),
MT::Util::encode_html( $asset->description ),
MT::Util::encode_html( $asset->url ),
$dimensions, $wrap_style,
);
}
...後略...
以上です。
今回、プラグインが使えそうになかったので、久しぶりに力技のカスタマイズになってしまいました。エレガントな変更方法がありましたらご教示ください。
Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その2)
Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法を、2回に分けて紹介します。
「サンプルを」という要望を頂いているのですが、時間がとれないので、以下のイメージのみでお許しください。
やりたいことは、ひとつのブログ記事アーカイブを使った、カテゴリー別のブログ記事ページのデザイン(HTMLマークアップやCSS)の切り替えです。

1.MTEntryIfCategory タグブロック内のサブテンプレートをモジュール化する
ブログ記事アーカイブのデザインを変更する1つめの方法で、MTEntryIfCategory タグブロック内にサブテンプレートをベタ書きするのではなく、MTInclude タグを使います。
カテゴリー1~3
<MTEntryIfCategory name="カテゴリー1">
<$MTInclude module="カテゴリー1"$>
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー2">
<$MTInclude module="カテゴリー2"$>
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー3">
<$MTInclude module="カテゴリー3"$>
</MTEntryIfCategory>
こうすることにより、カテゴリーアーカイブ本体では「どのカテゴリーにどのテンプレートを割り当てるか」という制御に徹することができ、テンプレート全体の見通しがよくなります。
汎用的なデザインを与えたいカテゴリー4~6を新たに追加する場合は、次のようにします。
<MTEntryIfCategory name="カテゴリー1">
<$MTInclude module="カテゴリー1"$>
<MTElse>
<MTEntryIfCategory name="カテゴリー2">
<$MTInclude module="カテゴリー2"$>
<MTElse>
<MTEntryIfCategory name="カテゴリー3">
<$MTInclude module="カテゴリー3"$>
<MTElse>
<$MTInclude module="カテゴリーその他"$>
</MTEntryIfCategory>
</MTEntryIfCategory>
</MTEntryIfCategory>
最初の MTEntryIfCategory タグでカテゴリー1であるか判定をし、そうでなければ MTElse を実行して、次の MTEntryIfCategory タグでカテゴリー2であるか判定をします。その繰り返しで、最後のカテゴリー判定にマッチしなかったカテゴリーには一番最後の MTElse タグの内容、つまりデフォルトとなるデザインのテンプレートモジュールを呼び出します。
2.MTEntryIfCategory タグを除去して、モジュール化をさらに最適化する
さて、すでにお気づきの方もいらっしゃると思いますが、1項のリストは、カテゴリーを識別するキーさえ取得できれば、実は以下の1行で済みます。
<$MTInclude module="カテゴリーを識別するキー"$>
「カテゴリーを識別するためのキー」として、次のようにカテゴリー名を使ってみます。カテゴリー名は、MTInclude タグを実行する前に、MTSetVarBlock タグを使って変数に設定し、変数名をmoduleモディファイアに与えれば、ダイナミックにカテゴリー名を設定することができます。
<$MTCategoryLabel setvar="category_name$>
<$MTInclude module="$category_name"$>
これで、このアーカイブが「カテゴリー1」の再構築を行うときには変数 category_name には「カテゴリー1」が、「カテゴリー2」の再構築を行うときには変数 category_name には「カテゴリー2」...という具合に設定され、それぞれ「カテゴリー1」「カテゴリー2」...という名前のテンプレートモジュールを呼び出します。
注意するのは、変数category_nameをmoduleモディファイア(というか、nameモディファイア以外)で使う場合は、変数名の前に大抵「$」をつけておく、ということです。
3.MTIf タグを使ってデフォルトデザインの条件分岐をつける
2つめのリストのように、デフォルトのデザインと振り分けたい場合は、さらに MTIf タグと MTCategoryDescription タグで制御します。
<$MTCategoryDescription setvar="category_description$>
<mt:if name="category_description">
<$MTInclude module="$category_description"$>
<mt:else>
<$MTInclude module="デフォルト"$>
<mt:if>
このリストを使う前準備として、各カテゴリーの「カテゴリーの説明」欄に、呼び出したいモジュール名を設定しておきます。デフォルトデザインのモジュールを呼び出したいときには、「カテゴリーの説明」欄には何も設定しません。
そうすれば、MTIf タグの判定で「カテゴリーの説明」欄に記入されている場合に、「カテゴリーの説明」欄に設定された名前のテンプレートモジュールを呼び出します。「カテゴリーの説明」欄に記入していない場合は、「デフォルト」という名前のテンプレートモジュールを呼び出します。
なお、前回もお伝えしたとおり、「カテゴリーの説明」欄を使うよりも、カスタムフィールドを利用した方が妥当に思われます。
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その1)
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その2)
Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その1)
Movable Type 4 で、カテゴリー別にブログ記事ページのデザインを切り替える方法を、2回に分けて紹介します。
やりたいことは、ひとつのブログ記事アーカイブを使った、カテゴリー別のブログ記事ページのデザイン(HTMLマークアップやCSS)の切り替えです。

1.MTEntryIfCategory タグを使用する
ひとつめは、ブログ記事アーカイブテンプレートの中で MTEntryIfCategory タグを使って、カテゴリー別に処理を振り分ける方法です *1。MTEntryIfCategory タグは、処理中のブログ記事が属するカテゴリーを判定するためのタグです。このタグはブログ記事コンテキストで動作します。
MTEntryIfCategory タグの name モディファイアには、カテゴリー名が重複しないように設定します。
次のサンプルは、カテゴリー1~3に属するブログ記事のテンプレートを振り分けるサブテンプレートです。
<MTEntryIfCategory name="カテゴリー1">
:
(カテゴリー1に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー2">
:
(カテゴリー2に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー3">
:
(カテゴリー3に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
また、タグの構造を変更すれば、特定のカテゴリーに属するブログ記事に特殊なデザインを与え、そうでないものについては汎用的なデザインを適用することもできます。
例えば、冒頭のサブテンプレートに、汎用的なデザインを使いたいカテゴリー4~6を新たに追加する場合、最初に示したサブテンプレートでは、カテゴリー4~6を個別に指定する必要がありますが、次のように変更すれば、一括した指定が可能です。
<MTEntryIfCategory name="カテゴリー1">
:
(カテゴリー1に属するブログ記事アーカイブのテンプレート)
:
<MTElse>
<MTEntryIfCategory name="カテゴリー2">
:
(カテゴリー2に属するブログ記事アーカイブのテンプレート)
:
<MTElse>
<MTEntryIfCategory name="カテゴリー3">
:
(カテゴリー3に属するブログ記事アーカイブのテンプレート)
:
<MTElse>
:
(カテゴリー4~6に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
</MTEntryIfCategory>
</MTEntryIfCategory>
最初の MTEntryIfCategory タグでカテゴリー1であるかを判定し、そうでなければ MTElse を実行して、次の MTEntryIfCategory タグでカテゴリー2であるかを判定します。その繰り返しで、最後のカテゴリー判定にマッチしなかったカテゴリーのブログ記事には一番最後の MTElse タグの内容、つまりデフォルトとなるデザインを適用します。
ちなみに、次の設定は誤りです。
<MTEntryIfCategory name="カテゴリー1">
:
(カテゴリー1に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー2">
:
(カテゴリー2に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー3">
:
(カテゴリー3に属するブログ記事アーカイブのテンプレート)
:
<MTElse>
:
(カテゴリー4~6に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
理由は、「カテゴリー4~6に属するブログ記事アーカイブのテンプレート」と書かれた部分にはカテゴリー1とカテゴリー2が含まれるからです。
2.スタイルシートについて
ここでは次の方法が考えられます。
head 要素が、1項のサブテンプレートの各カテゴリー別の部分に含まれているのであれば、head 要素内にカテゴリー用のスタイルシートを呼び出す link 要素をそのまま記述します(下)。
<MTEntryIfCategory name="カテゴリー1">
<head>
<link rel="stylesheet" href="<$MTBlogURL$>[カテゴリー1に属するブログ記事のスタイルシートファイル名]" type="text/css" encode_html="1"$>" media="screen,tv" />
</head>
:
(カテゴリー1に属するブログ記事アーカイブのテンプレート)
:
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー2">
<head>
<link rel="stylesheet" href="<$MTBlogURL$>[カテゴリー2に属するブログ記事のスタイルシートファイル名]" type="text/css" encode_html="1"$>" media="screen,tv" />
</head>
:
(カテゴリー2に属するブログ記事アーカイブのテンプレート)
:
以下省略
そうではなく、ブログ記事テンプレートから「ヘッダー」テンプレートモジュール(つまり head 要素)を呼び出している場合は、ブログ記事テンプレートの先頭に、次のような MTSetVar タグを記述します。
<MTEntryIfCategory name="カテゴリー1">
<mt:setvar name="style" value="カテゴリー1に属するブログ記事のスタイルシートのファイル名">
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー2">
<mt:setvar name="style" value="カテゴリー2に属するブログ記事のスタイルシートのファイル名">
</MTEntryIfCategory>
<MTEntryIfCategory name="カテゴリー3">
<mt:setvar name="style" value="カテゴリー3に属するブログ記事のスタイルシートのファイル名">
</MTEntryIfCategory>
<$MTInclude module="ヘッダー"$>
<MTEntryIfCategory name="カテゴリー1">
:
(カテゴリー1に属するブログ記事アーカイブのテンプレート)
:
以下省略
そして、「ヘッダー」モジュールには次のように記述しておきます。
これで、上のサブテンプレートで設定した変数 style の内容、つまりCSSファイル名が、「ヘッダー」モジュールに追加した link 要素の href 属性に反映されます。
<mt:if name="entry_archive">
<link rel="stylesheet" href="<$MTBlogURL$><$mt:getvar name="style"$>" type="text/css" title="<$MTCategoryLabel encode_html="1"$>" media="screen,tv" />
</mt:if>
または、「カテゴリーの説明」欄にスタイルシートのファイル名(下のサンプルでは拡張子なし)を設定しておけば、ブログ記事アーカイブに CSS ファイル名を設定しなくても、「ヘッダー」モジュールに設定した MTCategoryDescription タグで CSS ファイルを指定できます(下)。
<mt:if name="entry_archive">
<link rel="stylesheet" href="<$MTBlogURL$><$MTCategoryDescription$>.css" type="text/css" title="<$MTCategoryLabel encode_html="1"$>" media="screen,tv" />
</mt:if>
汎用的なカテゴリー用のスタイルシートを作りたい場合は、最初のサブテンプレートを次のように変更します。
<MTEntryIfCategory name="カテゴリー1">
<mt:setvar name="style" value="カテゴリー1に属するブログ記事のスタイルシートのファイル名">
<MTElse>
<MTEntryIfCategory name="カテゴリー2">
<mt:setvar name="style" value="カテゴリー2に属するブログ記事のスタイルシートのファイル名">
<MTElse>
<MTEntryIfCategory name="カテゴリー3">
<mt:setvar name="style" value="カテゴリー3に属するブログ記事のスタイルシートのファイル名">
<MTElse>
<mt:setvar name="style" value="カテゴリー4~6に属するブログ記事のスタイルシートのファイル名">
</MTEntryIfCategory>
</MTEntryIfCategory>
</MTEntryIfCategory>
<$MTInclude module="ヘッダー"$>
<MTEntryIfCategory name="カテゴリー1">
:
(カテゴリー1に属するブログ記事アーカイブのテンプレート)
:
以下省略
異なるカテゴリーで同じデザインを適用したい場合は、MTCategoryDescription タグに該当する「カテゴリーの説明」欄に同じ名称を記述しておきます。
なお、「カテゴリーの説明」よりもカスタムフィールドを使う方が、用途が明確になってよりいいでしょう。
次回は、さらに最適化したサブテンプレートを紹介します。
*1:MTIfCategory タグでも同じ効果があります。ここではブログ記事コンテキストであることを明示するために MTEntryIfCategory タグを使用しています。逆にカテゴリーアーカイブで MTEntryIfCategory タグは使えません。カテゴリーアーカイブなどのブログ記事コンテキスト以外のコンテキストで使用する場合は、MTEntries タグで括る必要があります。
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その1)
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その2)
ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する
Movable Type で、ブログ記事の前後のブログ記事へのリンクを、直近のブログ記事ではなく、同一カテゴリーのブログ記事を表示するカスタマイズです。
2008.11.18 Movable Type 4.2 対応の記事を公開しました。
下の画面の、ブログ記事タイトル上にある前後リンクは、分かりにくいですが、同一カテゴリーのブログ記事です。

また、ブログ記事に複数カテゴリーを設定している場合は、すべてのカテゴリーの前後リンクも表示します(こんなに表示するのもどうかと思いますが...)。

以下、カスタマイズ方法です。
1.プラグインのダウンロード
Previous and next in category のサイトに進み、「PreviousNextInCategory」のリンクをクリック。
![]()
2.プラグインのインストール
ダウンロードした PreviousNextInCategory.zip を解凍して、PreviousNextInCategory.pl をpluginsディレクトリにアップロードします。
ブログ管理画面より、「システムメニュー」→「プラグイン」で「PreviousNextInCategory.pl」が表示されればインストール完了です。

3.プライマリカテゴリーに属するブログ記事のみを表示する場合
ブログ記事アーカイブの任意の位置に下記のサブテンプレートを設定してください。
<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> |
</MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink archive_type="Category"$>"><$MTEntryCategory$></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>
ブログ記事アーカイブを再構築すれば、冒頭のように、同一カテゴリーの前後記事リンクが表示されます。
4.ブログ記事に登録されているすべてのカテゴリーに属するブログ記事を表示する場合
PreviousNextInCategory.plを任意のエディタで開き、
:
sub _hdlr_entry_previous_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryPrevious');
my $cat = $e->category
or return '';
my $prev = $e->previous(1);
:
sub _hdlr_entry_next_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryNext');
my $cat = $e->category
or return '';
my $next = $e->next(1);
:
の部分に下記の青色の行を追加します。
:
sub _hdlr_entry_previous_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryPrevious');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $prev = $e->previous(1);
:
sub _hdlr_entry_next_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryNext');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $next = $e->next(1);
:
ブログ記事アーカイブの任意の位置に下記のサブテンプレートを設定してください。
<MTEntryCategories>
<p>
<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> |
</MTEntryPreviousInCategory>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>
</p>
</MTEntryCategories>
ブログ記事アーカイブを再構築すれば、ブログ記事が属する全カテゴリーの前後記事リンクが表示されます。
5.前後記事の再構築をする
上記の設定だけでは、ブログ記事投稿時に同一カテゴリーの前後記事が再構築されないという問題があります。
ということで、一応、MT4対応のプラグインを作ってみました。
元プラグインをかなり改変してしまったので、上記のファイルをダウンロードしたら、元プラグインにある、
_hdlr_entry_previous_in_category
_hdlr_entry_next_in_category
を埋め込んでください(複数カテゴリーに対応させる場合は4項のカスタマイズも行ってください)。
具体的な作業は、ダウンロードしたファイルの最後の方に簡単な説明を入れてますので、それを読んでください。
複数のカテゴリーを設定したブログ記事でも、前後リンクのブログ記事はすべて再構築されます。
なお、再構築は同じカテゴリーのブログ記事を検索するという、元記事のロジックをそのまま使わせてもらってますが、パフォーマンスの問題を解消する改善策がありましたらご教示ください。
6.参考記事
このエントリーは下記の記事を参考にさせていただきました。ありがとうございました。
ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)
「ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)」や、これまでの似たようなカスタマイズでは、次の問題あることが判明しました。
1.問題点
異なる親カテゴリーに同名のサブカテゴリーがある場合、対応できない。
具体的には、次のようなカテゴリー構成を想定します。
cat-A
├ cat-1
└ cat-2
cat-B
├ cat-1
└ cat-2
この構成で「ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)」を行うと、cat-A/cat-1 に属するブログ記事と、cat-B/cat-1 に属するブログ記事は「同一カテゴリーのブログ記事リスト」とみなされてしまいます。
2.原因
「同一カテゴリーのブログ記事リスト」のキー情報として、MTEntryCategory という、ブログ記事に属するメインカテゴリー名のみ使っており、カテゴリーの親カテゴリーまで含めた情報やID番号でサーチしていないためです。
こうなった経緯は、そもそも、Movable Type 3 の途中まで「サブカテゴリー」という概念が存在しませんでした。つまり、親カテゴリーしか作れなかったため、同名のカテゴリーの存在が許されず、これまでのサブテンプレートを使えば「同一カテゴリーのブログ記事リスト」を実現できた、という訳です。
3.対処
3.1 EntryCategoryID プラグインを使う
「EntryCategoryID プラグイン」を使い、ブログ記事のメインカテゴリーのID番号と、ブログ記事リストのカテゴリーIDを比較し、同一カテゴリーID のブログ記事のみリスティングします。
<mt:setvarblock name="entrycategoryid"><$MTEntryCategoryID$></mt:setvarblock>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTCategories>
<mt:setvarblock name="currentcategoryid"><$MTEntryCategoryID$></mt:setvarblock>
<mt:if name="currentcategoryid" eq="$entrycategoryid">
<MTEntries>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</mt:if>
</MTCategories>
</ul>
</dd>
3.2 MTParentCategories タグを使う(その1)
これは後から気がついたのですが、MTParentCategories タグを使い、ブログ記事のメインカテゴリーの親カテゴリーを取得すれば、3.1項と同じことができます。
<MTParentCategories glue="/" setvar="entrycategories"><$MTCategoryLabel$></MTParentCategories>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTCategories>
<MTParentCategories glue="/" setvar="currententrycategories"><$MTCategoryLabel$></MTParentCategories>
<mt:if name="currententrycategories" eq="$entrycategories">
<MTEntries>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</mt:if>
</MTCategories>
</ul>
</dd>
MTParentCategories のカテゴリーのセパレータには "/"、また MTSetvarBlock タグの代わりに setvar モディファイアを利用しています。
3.3 MTParentCategories タグを使う(その2)
こちらは、MTEntries タグに category モディファイアを与えて、とりあえず自カテゴリーで絞り込んでから親カテゴリーと比較します。
<mt:setvarblock name="entrycategory"><$MTEntryCategory$></mt:setvarblock>
<MTParentCategories glue="/" setvar="entrycategories"><$MTCategoryLabel$></MTParentCategories>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTEntries category="$entrycategory">
<MTParentCategories glue="/" setvar="currententrycategories"><$MTCategoryLabel$></MTParentCategories>
<mt:if name="currententrycategories" eq="$entrycategories">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</mt:if>
</MTEntries>
</ul>
</dd>
2008.02.25
3.3項を追加しました。
ブログ記事の入力フィールドに初期値を設定するプラグイン
Movable Type 4.1/MTOS で、ブログ記事の入力フィールドに初期値を設定するプラグインです。このプラグインを利用すれば、ブログ記事の新規作成時に、
- タイトル
- 本文
- 追記
- タグ
- 概要
- キーワード
の各フィールドに任意の文字列を初期値として表示することができます。
これは「『タグ』や『キーワード』等にいつも同じ内容を設定するのですが、特定の文字列を予め設定しておくことはできないでしょうか」という質問を頂いたのが作成の発端です。
1.プラグインのダウンロード
下記のリンクをクリックしてプラグインをダウンロードしてください。
- DefaultValueSetter_1_00.zip(MT5用)
- DefaultValueSetter.zip(MT4用)
2.プラグインのアップロード
ダウンロードしたプラグインを解凍し、中にある、DefaultValueSetter フォルダを plugins ディレクトリに丸ごとアップロードしてください。
ブログ管理メニューの「設定」→「プラグイン」で DefaultValueSetter が表示されればインストール完了です。

3.使用方法
ブログ別にブログ記事用の初期値を設定します。ブログ管理画面の「設定」→「プラグイン」で「DefaultValueSetter 0.01」をクリックし、さらに「設定」をクリックすると次のような設定画面が表示されます。
![]()
このような感じで設定し、一番下の「変更を保存」をクリック。
![]()
ブログの新規作成画面に設定した内容が反映されます。
4.ライセンス
デュアルライセンスです(The blog of H.Fujimoto の藤本さんのライセンス内容を勝手ながらそのまま適用させて頂いてます)。なお、プラグイン開発やサポート等にご支援・ご賛同くださる方からの寄付をお待ち申し上げます。
上記の「寄付」のリンクをクリックすると Paypal によるお支払いページにジャンプします。
4.1 MT4.1個人ライセンス/MT4.1商用ライセンスと組み合わせる場合
- 無料で利用できます。
- 改変・再配布は自由ですが、改変して再配布する場合、原作者のクレジットを必ず残してください。
4.2 MTOSと組み合わせる場合
- 無料で利用できます。
- GPLv2に従います。
トップページの最新記事に Google Adsense を貼り付ける
Movable Type 4 で、トップページの最新記事に Google Adsense を貼り付けるカスタマイズです。昨年よりご質問を頂いていたもので、本エントリーにて紹介致します。
ここでは公開テンプレートをサンプルに紹介しますが、デフォルトテンプレートでもほぼ同じです。
1.日付の前に表示する
表示位置のイメージ

ブログ管理画面より「テンプレート」→「デザイン」→「テンプレートモジュール」→「ブログ記事の概要」を開き、青色のタグを追加します。[Google Adsenseのコード] の部分にご自身の Google Adsense のコードを貼り付けてください。
<mt:if name="main_template">
<MTEntriesHeader>
<div class="adsense">
[Google Adsenseのコード]
</div>
</MTEntriesHeader>
</mt:if>
<MTDateHeader>
<p class="date"><$MTEntryDate format="%x"$></p>
</MTDateHeader>
<div class="entry">
<h2 id="a<$MTEntryID pad="1"$>" class="entry-header"><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_html="1"$></a></h2>
<div class="entry-content clearfix">
<MTIfNonEmpty tag="EntryBody">
<$MTEntryBody$>
</MTIfNonEmpty>
<MTIfNonEmpty tag="EntryMore">
<p class="entry-more"><a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle encode_html="1"$>"</a></p>
</MTIfNonEmpty>
<MTEntryIfTagged>
<$MTInclude module="タグ"$>
</MTEntryIfTagged>
</div>
<$MTInclude module="ブログ記事のメタデータ"$>
</div>
2.タイトルの前に表示する
表示位置のイメージ

ブログ管理画面より「テンプレート」→「デザイン」→「テンプレートモジュール」→「ブログ記事の概要」を開き、青色のタグを追加します。[Google Adsenseのコード] の部分にご自身の Google Adsense のコードを貼り付けてください。
<MTDateHeader>
<p class="date"><$MTEntryDate format="%x"$></p>
</MTDateHeader>
<div class="entry">
<mt:if name="main_template">
<MTEntriesHeader>
<div class="adsense">
[Google Adsenseのコード]
</div>
</MTEntriesHeader>
</mt:if>
<h2 id="a<$MTEntryID pad="1"$>" class="entry-header"><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_html="1"$></a></h2>
<div class="entry-content clearfix">
<MTIfNonEmpty tag="EntryBody">
<$MTEntryBody$>
</MTIfNonEmpty>
<MTIfNonEmpty tag="EntryMore">
<p class="entry-more"><a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle encode_html="1"$>"</a></p>
</MTIfNonEmpty>
<MTEntryIfTagged>
<$MTInclude module="タグ"$>
</MTEntryIfTagged>
</div>
<$MTInclude module="ブログ記事のメタデータ"$>
</div>
3.タイトルと本文の間に表示する
表示位置のイメージ

ブログ管理画面より「テンプレート」→「デザイン」→「テンプレートモジュール」→「ブログ記事の概要」を開き、青色のタグを追加します。[Google Adsenseのコード] の部分にご自身の Google Adsense のコードを貼り付けてください。
<MTDateHeader>
<p class="date"><$MTEntryDate format="%x"$></p>
</MTDateHeader>
<div class="entry">
<h2 id="a<$MTEntryID pad="1"$>" class="entry-header"><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_html="1"$></a></h2>
<div class="entry-content clearfix">
<mt:if name="main_template">
<MTEntriesHeader>
<div class="adsense">
[Google Adsenseのコード]
</div>
</MTEntriesHeader>
</mt:if>
<MTIfNonEmpty tag="EntryBody">
<$MTEntryBody$>
</MTIfNonEmpty>
<MTIfNonEmpty tag="EntryMore">
<p class="entry-more"><a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle encode_html="1"$>"</a></p>
</MTIfNonEmpty>
<MTEntryIfTagged>
<$MTInclude module="タグ"$>
</MTEntryIfTagged>
</div>
<$MTInclude module="ブログ記事のメタデータ"$>
</div>
4.仕組み
このカスタマイズでは MTIf タグと MTEntriesHeader タグを用いて制御しています。
MTIf タグでは、メインページテンプレートでのみブロック内を実行する制御を行っています。
MTEntriesHeader タグは、MTEntries ブロックタグ内で使用するためのブロックタグ(コンディショナルタグ)で、ブログ記事をリスト表示する初回のみ、このタグでコンテナされた内容を実行すブロックタグです。
5.他のアーカイブでも表示する
ブログ記事の概要は月別アーカイブやカテゴリアーカイブでも使われるのですが、前項の説明の通り、トップページ以外では表示されないように制御しています。
Google Adsense を月別アーカイブやカテゴリアーカイブでも表示したい場合は、
<mt:if name="main_template">
<MTEntriesHeader>
<div class="adsense">
[Google Adsenseのコード]
</div>
</MTEntriesHeader>
</mt:if>
の MTIf タグを削除して、
<MTEntriesHeader>
<div class="adsense">
[Google Adsenseのコード]
</div>
</MTEntriesHeader>
に変更してください。
6.CSS
時間の都合上、表示位置の微調整まで書ききれていないため、各自で行ってください。微調整する際は、スタイルシートに下記のセレクタを追加して、点線の部分に任意のプロパティを記述してください。
div.adsense {
:
}
ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)
Movable Type 4 で、ブログ記事アーカイブ(エントリーアーカイブ)に同一カテゴリーのブログ記事リスト(エントリーリスト)を表示するためのカスタマイズです。
質問を頂きましたので本エントリーにて解説致します。
Movable Type 3 までは、MTTagInvoke を使ったカスタマイズ「個別エントリーアーカイブに同一カテゴリーのエントリーを表示」が可能でしたが、Movable Type 4 ではこのプラグインが利用できなくなっています。
MT3 と同等のカスタマイズを行うには MTEntryCategoryEntries というプラグインがお勧めですが、ここでは、MTIf タグを使った方法を、順を追ってカスタマイズする形で紹介したいと思います。
読むのが面倒な方は、2項~4項のいずれかのサンプルを、そのままサイドバーに貼り付けてお使いください。
1.基本設定
ブログ記事に同一カテゴリーのブログ記事リストを表示する場合の基本形です。
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTEntries category="$entrycategory">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ul>
</dd>
1行目にある、
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
で、<$MTEntryCategory$> の評価内容を取得し、entrycategory という MT の変数に設定します。
そして、
<MTEntries category="$entrycategory">
で、先に設定した変数 entrycategory の値を用いてブログ記事リストを特定のカテゴリーでフィルタリングしています。MTGetVar の name 属性で変数を使用する場合は $ を付与しませんが(下)、
<MTGetVar name="entrycategory">
MTEntries タグの category 属性に用いる場合は、$ を付与して、MT の変数であることを明示します。
2.特定のアーカイブのみで表示させる
1項の状態では、サイドバーをインクルードする全てのページで表示されてしまうため、ブログ記事アーカイブのみにも適用されてしまいます。
このリストをブログ記事アーカイブだけに表示させるには、リスト全体 MTIf タグで括ります。
<MTIf name="entry_template">
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTEntries category="$entrycategory">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ul>
</dd>
</MTIf>
1行目の MTIf タグの name 属性には、ブログ記事のみで有効になる "entry_template" という値を設定します。
<MTIf name="entry_template">
これでブログ記事アーカイブ以外では、このリストは表示されなくなります。
アーカイブで使える変数値については、「予約変数一覧 for Movable Type 4(その1)」にまとめてありますので、参考になれば幸いです。
3.現在のブログ記事タイトルをリストから除外する
2項までの設定では、現在表示されているブログ記事のタイトルも表示されてしまうので、次にこれを非表示にする制御を行います。
非表示にするには、現在表示されているブログ記事ページのID番号と、リスティングされているブログ記事のID番号を比較・判定する処理(青色部分)を追加します。
<MTIf name="entry_template">
<MTSetVarBlock name="entryid"><$MTEntryID$></MTSetVarBlock>
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTEntries category="$entrycategory">
<MTSetVarBlock name="currententryid"><$MTEntryID$></MTSetVarBlock>
<MTIf name="currententryid" ne="$entryid">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTIf>
</MTEntries>
</ul>
</dd>
</MTIf>
現在表示されているブログ記事ページのID番号は、2行目の
<MTSetVarBlock name="entryid"><$MTEntryID$></MTSetVarBlock>
で取得し、リスティングされているブログ記事ページのID番号は、MTEntries タグブロック内の
<MTSetVarBlock name="currententryid"><$MTEntryID$></MTSetVarBlock>
で取得しています。これで、
entryid:現在表示されているブログ記事ページのID番号
currententryid:リスティングされているブログ記事ページのID番号
となり、あとはこれを MTIf タグで判定します。
<MTIf name="currententryid" ne="$entryid">
ne 属性で判定しているので、判定結果が「真」、つまりお互いのブログ記事IDが等しくなければ、MTIf ブロック内の行を実行します。
4.リストが1件の場合はリストを非表示にする
前項の設定を行った場合、あるカテゴリーに属するブログ記事が1件の場合、リストに何も表示されなくなってしまいます。
これを回避するため、カテゴリーに属するブログ記事が1件の場合は、リスト全体を非表示にする制御を行います。
<MTIf name="entry_template">
<MTSetVarBlock name="entryid"><$MTEntryID$></MTSetVarBlock>
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
<MTEntries category="$entrycategory">
<MTSetVarBlock name="entrycount"><$MTGetVar name="__counter__"$></MTSetVarBlock>
</MTEntries>
<MTUnless name="entrycount" eq="1">
<dt class="sidetitle">
Entries of this Category
</dt>
<dd class="side">
<ul>
<MTEntries category="$entrycategory">
<MTSetVarBlock name="currententryid"><$MTEntryID$></MTSetVarBlock>
<MTIf name="currententryid" ne="$entryid">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTIf>
</MTEntries>
</ul>
</dd>
</MTUnless>
</MTIf>
該当カテゴリーのブログ記事数のカウントには、MTEntries タグ内で __counter__ を利用することで取得しています。
ところが、__counter__ という変数は、
<$MTGetVar name="entrycount" value="__counter__"$>
では正常に値を取得できない(変数値がそのまま変数名に設定されてしまう)ので、MTSetVarBlock と MTGetVar を組み合わせて、
<MTSetVarBlock name="entrycount"><$MTGetVar name="__counter__"$></MTSetVarBlock>
としています。
そして、MTUnless タグを用いて、カウント値が "1" でない場合にブロック内を実行するように制御します。
<MTUnless name="entrycount" eq="1">
概要と本文を切り替える(Movable Type 4・デフォルトテンプレート版)
当サイトで利用している、トップページのエントリー概要とエントリー本文の表示を切り替えるカスタマイズで、以前紹介した「概要と本文を切り替える(デフォルトテンプレート版)」のMovable Type 4・デフォルトテンプレート版です。
概要に本文の先頭から指定文字数を表示する設定になっている(=概要フィールドに何も書いていない)場合、デフォルトで概要を表示し、タイトルまたは概要の末尾にあるリンクをクリックすることで、ページ遷移をせずに全文を表示することができます。
このエントリーではデフォルトテンプレートのトップページおよびカテゴリーアーカイブ/日付アーカイブに適用する例を紹介します(ブログ記事リストを使用したアーカイブにも適用されます)。
1.スクリプトのダウンロード・アップロード
下記のリンクより menufolder.js をダウンロード(本カスタマイズ用に機能追加しています)
ダウンロードしたスクリプトを、ブログの index.html と同じディレクトリにアップロードしてください。
2.script 要素の追加
「デザイン」→「テンプレート」→「テンプレートモジュール」→「ヘッダー」を開き、head 終了タグの前に下記の script 要素を追加。
<script type="text/javascript" src="<$MTBlogURL$>menufolder.js"></script>
3.エントリータイトルに折りたたみのリンクを与える
「デザイン」→「テンプレート」→「テンプレートモジュール」→「ブログ記事の概要」を開き、エントリータイトルのタグ
<h2 class="asset-name"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h2>
を下記のように変更します。a 要素を削除して h2 に id 属性を追加しています。
<h2 class="asset-name" id="content<$MTEntryID$>name"><$MTEntryTitle$></h2>
4.概要を追加する
エントリーを表示するタグ
<div class="asset-content">
<MTIfNonEmpty tag="EntryBody">
<div class="asset-body">
<$MTEntryBody$>
</div>
</MTIfNonEmpty>
<MTIfTagSearch>
<$MTInclude module="タグ"$>
</MTIfTagSearch>
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<div class="asset-more-link">
<a href="<$MTEntryPermalink$>#more"><$MTEntryTitle$></a>の続きを読む
</div>
</MTIfNonEmpty>
</div>
に対し、青色のタグを追加します。
<div class="asset-content">
<div id="content<$MTEntryID$>list2">
<p><$MTEntryExcerpt$> <a class="foldmark" href="./" onclick="FoldNavigation('content<$MTEntryID$>','chng',''); return(false);" onkeypress="FoldNavigation('idName', 'chng',''); return(false);" title="全部読む">[ all ]</a></p>
</div>
<div id="content<$MTEntryID$>list">
<MTIfNonEmpty tag="EntryBody">
<div class="asset-body">
<$MTEntryBody$>
</div>
</MTIfNonEmpty>
<MTIfTagSearch>
<$MTInclude module="タグ"$>
</MTIfTagSearch>
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<div class="asset-more-link">
<a href="<$MTEntryPermalink$>#more"><$MTEntryTitle$></a>の続きを読む
</div>
</MTIfNonEmpty>
</div>
</div>
また、同じ「ブログ記事の概要」テンプレートの一番最後(このテンプレートでは表示されていませんが、MTEntries の終了タグ直前)にスクリプト起動用の script 要素(下記)を追加します。
<script type="text/javascript">
//<![CDATA[
FoldNavigation('content<$MTEntryID$>','off',false);
//]]>
</script>
これでテンプレートを再構築すれば、概要と本文の切り替えができるようになります。
5.折りたたみ状態を保持しないようにする
このカスタマイズでは折りたたみ状態がクッキーを利用して保持されます。つまり、ブラウザをリロードした時等、直前の折りたたみ状態でページが表示されます。
折りたたみ状態を保持したくない場合は、ダウンロードした menufolder.js の中間辺りに下記の設定(赤色)
//--------------------------------------------------------
// 状態保持用設定データ
//--------------------------------------------------------
// 状態保持フラグ
// 有効にする:true
// 無効にする:false
var holdState = true;
を下のように変更してください。
//--------------------------------------------------------
// 状態保持用設定データ
//--------------------------------------------------------
// 状態保持フラグ
// 有効にする:true
// 無効にする:false
var holdState = false;
6.注意事項
概要の表示文字数より本文の文字数が少ないと効果ありません。
Movable Type で画像挿入時の form 要素について
Movable Type で画像挿入時の form 要素について、下記のエントリーを拝見して「なるほど!」と思いましたので、ご紹介させて頂きます。
MT4のブログ記事作成で画像を挿入し、テキストエリアを「リッチテキスト」以外で参照すると(あるいは最初から「リッチテキスト」以外で編集すると)画像表示用の img 要素が form 要素で括られます。
<form class="mt-enclosure mt-enclosure-image" mt:asset-id="5"><img class="mt-image-left" style="FLOAT: left; MARGIN: 0px 20px 20px 0px" height="426" alt="tea.jpg" src="http://your-domain/images/hoge.jpg" width="640" /></form>
これは MTEntryAssets タグを有効にするための裏情報になるらしいです(詳細は元記事をご覧ください)。
関連で下記の記事もありました。
この処理が行われることで、ブログ記事で挿入した画像は、MTEntryAssets タグの対象となり、ファイルアップロード機能で、アップロードしただけの画像は(当たり前ですが)MTEntryAssets タグの対象にならないということです。
上記以外の情報として、ソースコードを眺めてみると、lib/MT/Util.pm に asset_cleanup というサブルーチンがありました。
sub asset_cleanup {
my ($str) = @_;
$str =~ s/
<(?:[Ff][Oo][Rr][Mm]|[Ss][Pp][Aa][Nn])
([^>]*?)
\s
mt:asset-id="\d+"
([^>]+?>)(.*?)
<\/(?:[Ff][Oo][Rr][Mm]|[Ss][Pp][Aa][Nn])>
/
my $attr = $1 . $2;
my $inner = $3;
$attr =~ s!\s[Cc][Oo][Nn][Tt][Ee][Nn][Tt][Ee][Dd][Ii][Tt][Aa][Bb][Ll][Ee]=(['"][^'"]*?['"]|[Ff][Aa][Ll][Ss][Ee])!!;
'<span' . $attr . $inner . '<\/span>'
/gsex;
return $str;
}
このサブルーチンは、lib/MT/Template/ContextHandlers.pm 内で、MTEntryBody タグあるいは MTEntryMore タグの処理の最後で、mt:asset-id="AssetID" の文字列がある場合に起動されます。
sub _hdlr_entry_body {
:
(中略)
:
# Strip the mt:asset-id attribute from any span tags...
if ($text =~ m/\smt:asset-id="\d+"/) {
$text = asset_cleanup($text);
}
return $text;
}
ということで、勉強になりました。ありがとうございました。
何故 form タグ?というのが知りたいところです。
概要と本文を切り替える(公開テンプレート版)
当サイトで利用している、トップページのエントリー概要とエントリー本文の表示を切り替えるカスタマイズです。
概要に本文の先頭から指定文字数を表示する設定になっている(=概要フィールドに何も書いていない)場合、デフォルトで概要を表示し、タイトルまたは概要の末尾にあるリンクをクリックすることで、ページ遷移をせずに全文を表示することができます。
このエントリーでは公開テンプレートのトップページおよびカテゴリーアーカイブ/日付アーカイブに適用する例を紹介します。
なお先日紹介したデフォルトテンプレート版のカスタマイズ手順に一部誤りがありましたので修正しています(本エントリーは修正済)。
1.スクリプトのダウンロード・アップロード
下記のリンクより menufolder.js をダウンロード(本カスタマイズ用に機能追加しています)
ダウンロードしたスクリプトは、ブログの index.html と同じディレクトリにアップロードしてください。
2.script 要素の追加
カスタマイズを適用するテンプレートに下記の script 要素を追加。
<script type="text/javascript" src="<$MTBlogURL$>menufolder.js"></script>
3.エントリータイトルに折りたたみのリンクを与える
エントリータイトルのタグ
<h2 id="a<$MTEntryID pad="1"$>" class="entry-header"><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_html="1"$></a></h2>
を下記のように変更します。a 要素を削除して h2 の id 属性を書き換えます。
<h2 id="content<$MTEntryID$>name" class="entry-header"><$MTEntryTitle encode_html="1"$></h2>
4.概要を追加する
エントリーを表示するタグ
<!-- エントリー -->
<div class="entry-content">
<$MTEntryBody$>
<!-- 追記 -->
<MTIfNonEmpty tag="EntryMore">
<p class="entry-more"><a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle encode_html="1"$>"</a></p>
</MTIfNonEmpty>
に対し、青色のタグを追加します。
<!-- エントリー -->
<div class="entry-content">
<div id="content<$MTEntryID$>list2">
<p><$MTEntryExcerpt$> <a class="foldmark" href="./" onclick="FoldNavigation('content<$MTEntryID$>','chng',''); return(false);" onkeypress="FoldNavigation('idName', 'chng',''); return(false);" title="全部読む">[ all ]</a></p>
</div>
<div id="content<$MTEntryID$>list">
<$MTEntryBody$>
<!-- 追記 -->
<MTIfNonEmpty tag="EntryMore">
<p class="entry-more"><a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle encode_html="1"$>"</a></p>
</MTIfNonEmpty>
</div>
また、MTEntries の終了タグ直前にスクリプト起動用の script 要素を追加します。
<script type="text/javascript">
//<![CDATA[
FoldNavigation('content<$MTEntryID$>','off',false);
//]]>
</script>
</MTEntries>
これでテンプレートを再構築すれば、概要と本文の切り替えができるようになります。
5.注意事項
概要の表示文字数より本文の文字数が少ないと効果ありません。
カテゴリー・アーカイブのカテゴリーリストで該当カテゴリーのエントリーのみを表示する
カテゴリー・アーカイブに表示されたカテゴリーリストで、該当カテゴリーのエントリーのみを表示するカスタマイズです。
ご質問を頂きましたので本エントリーにて紹介致します。
以下のサンプルの(X)HTMLは、当サイトの「XHTML 1.0 Strict 版テンプレート」をもとにしたマークアップですので、それ以外の配布テンプレートをご利用の場合は、dt / dd をそれぞれ div に直してください。
また、本カスタマイズは MT4 でも利用可能ですが、MT4 版は別エントリーで投稿したいと思います。
1.PHP 版
カテゴリー・アーカイブテンプレートの任意の位置に、下記のカテゴリーリストを設定してください。
ブログがPHP化されていることが前提です。
<MTIfArchiveTypeEnabled archive_type="Category">
<dt class="sidetitle">
Categories
</dt>
<dd class="side">
<?php $category = '<$MTCategoryLabel encode_php="1"$>'; ?>
<div id="categories">
<MTSubCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><$MTCategoryLabel$></a> [<$MTCategoryCount$>]
<?php if ($category == '<$MTCategoryLabel encode_php="1"$>') { ?>
<ul><MTEntries><li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li></MTEntries></ul>
<?php } ?>
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse max_depth="3">
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories>
</div>
</dd>
</MTIfArchiveTypeEnabled>
2.JavaScript 版
1項と同様、カテゴリー・アーカイブテンプレートの任意の位置に、下記のカテゴリーリストを設定してください。
<MTIfArchiveTypeEnabled archive_type="Category">
<dt class="sidetitle">
Categories
</dt>
<dd class="side">
<script type="text/javascript">
//<![CDATA[
var category = '<$MTCategoryLabel encode_js="1"$>';
//]]>
</script>
<div id="categories">
<MTSubCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><$MTCategoryLabel$></a> [<$MTCategoryCount$>]
<script type="text/javascript">
//<![CDATA[
if (category == '<$MTCategoryLabel encode_js="1"$>') {
document.write('<ul><MTEntries><li><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_js="1"$></a></li></MTEntries></ul>');
}
//]]>
</script>
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse max_depth="3">
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories>
</div>
</dd>
</MTIfArchiveTypeEnabled>
概要と本文を切り替える(デフォルトテンプレート版)
当サイトで利用している、トップページのエントリー概要とエントリー本文の表示を切り替えるカスタマイズです。
注:本カスタマイズは Movable Type 3.x 用です。Movable Type 4 で利用する場合は、「概要と本文を切り替える(Movable Type 4・デフォルトテンプレート版)」をご覧ください。
概要に本文の先頭から指定文字数を表示する設定になっている(=概要フィールドに何も書いていない)場合、デフォルトで概要を表示し、タイトルまたは概要の末尾にあるリンクをクリックすることで、ページ遷移をせずに全文を表示することができます。
このエントリーではデフォルトテンプレートのトップページおよびカテゴリーアーカイブ/日付アーカイブに適用する例を紹介します。
1.スクリプトのダウンロード・アップロード
下記のリンクより menufolder.js をダウンロード(本カスタマイズ用に機能追加しています)
ダウンロードしたスクリプトは、ブログの index.html と同じディレクトリにアップロードしてください。
2.script 要素の追加
カスタマイズを適用するテンプレートに下記の script 要素を追加。
<script type="text/javascript" src="<$MTBlogURL$>menufolder.js"></script>
3.エントリータイトルに折りたたみのリンクを与える
エントリータイトルのタグ
<h3 class="entry-header"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
を下記のように変更します。a 要素を削除して h3 に id 属性を追加しています。
<h3 class="entry-header" id="content<$MTEntryID$>name"><$MTEntryTitle$></h3>
4.概要を追加する
エントリーを表示するタグ
<div class="entry-body">
<$MTEntryBody$>
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<p class="entry-more-link">
<a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle$>" »</a>
</p>
</MTIfNonEmpty>
に対し、青色のタグを追加します。
<div class="entry-body">
<div id="content<$MTEntryID$>list2">
<p><$MTEntryExcerpt$> <a class="foldmark" href="./" onclick="FoldNavigation('content<$MTEntryID$>','chng',''); return(false);" onkeypress="FoldNavigation('idName', 'chng',''); return(false);" title="全部読む">[ all ]</a></p>
</div>
<div id="content<$MTEntryID$>list">
<$MTEntryBody$>
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<p class="entry-more-link">
<a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle$>" »</a>
</p>
</MTIfNonEmpty>
</div>
また、MTEntries の終了タグ直前にスクリプト起動用の script 要素を追加します。
<script type="text/javascript">
//<![CDATA[
FoldNavigation('content<$MTEntryID$>','off',false);
//]]>
</script>
</MTEntries>
これでテンプレートを再構築すれば、概要と本文の切り替えができるようになります。
5.折りたたみ状態を保持しないようにする
このカスタマイズでは折りたたみ状態がクッキーを利用して保持されます。つまり、ブラウザをリロードした時等、直前の折りたたみ状態でページが表示されます。
折りたたみ状態を保持したくない場合は、ダウンロードした menufolder.js の中間辺りに下記の設定(赤色)
//--------------------------------------------------------
// 状態保持用設定データ
//--------------------------------------------------------
// 状態保持フラグ
// 有効にする:true
// 無効にする:false
var holdState = true;
を下のように変更してください。
//--------------------------------------------------------
// 状態保持用設定データ
//--------------------------------------------------------
// 状態保持フラグ
// 有効にする:true
// 無効にする:false
var holdState = false;
6.注意事項
概要の表示文字数より本文の文字数が少ないと効果ありません。
2007.07.31
カスタマイズ手順に誤りがありましたので修正しました。
2007.11.25
5項を追加しました。また、MT4 版へのリンクを追加しました。
Movable Type で全エントリーを表示する方法
Movable Type のエントリーリストで、全てのエントリーを表示するための Tips です。
基礎知識として、MTEntries タグに属性を何も設定せずに使用すると、管理画面の[設定]-[全般]-[表示に関する初期設定]-[表示数]に依存することになります。したがって全ての公開されたエントリーを表示するには何らかの属性を設定しなければなりません。
先日投稿した「Sitemaps 0.90 用テンプレート」でも少し紹介致しましたが、巷で紹介されているサイトマップ用テンプレートでは全エントリーリスト表示で、
<$MTEntries lastn="9999"$>
という設定を多くみかけます。
これはこれで良いのですが、MTのパワーユーザーとしては、よりスマートな設定方法を紹介したいと思った次第です。
1.lastn 属性による表示
lastn 属性は「最新のエントリーより指定された件数を表示する」場合に用いますが、属性値に "0" を設定することで全エントリーが表示されます。
<ul> <MTEntries lastn="0"> <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li> </MTEntries> </ul>- リスト1
lastn属性による表示
2.offset 属性による表示
offset 属性は「最新のエントリーの指定件数を除いて表示する」場合に用います。厳密には lastn 属性と併用して、それぞれの属性で指定された範囲のエントリーを表示します。この offset 属性値に "0" を設定することで全エントリーが表示されます。
<ul> <MTEntries offset="0"> <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li> </MTEntries> </ul>- リスト3
offset属性による表示
3.all 属性による表示
MTEntries タグにこのような属性は存在しません。ただし、このような処理されない属性を設定することで全エントリーが表示されます(とりあえず 3.33 では OK)。all="1" というのは直感的に分かりやすいと思い、例として挙げてみました。hoge でも何でもいいです。
<ul> <MTEntries all="1"> <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li> </MTEntries> </ul>- リスト3
all属性による表示
4.属性を設定しない方法
先の[設定]-[全般]-[表示に関する初期設定]-[表示数]に "0" を設定します。単位は「エントリー」「日分」のどちらでも大丈夫のようです。ただし表示数を制限すべき箇所には必ず属性を設定してください。
5.MTArchiveList による表示
上記と主旨が異なりますが、MTArchiveList タグを用いる手もあります。archive_type 属性には "Individual" を設定します。
ただし各アーカイブ共通のタグですので、使用可能な属性は lastn と sort_order に限られます。
<ul> <MTArchiveList archive_type="individual"> <li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a></li> </MTArchiveList> </ul>- リスト4
MTArchiveListによる表示
6.再構築のパフォーマンス
当サイトのエントリーで試してみたところ、ほんの僅かながら1?4、つまり MTEntries が早いようです(3秒程度で完了)。ただしタイトルのみ・リンクなしというケースでの実験ですので、実際には大差ないと思います。
Movable Type のエントリー削除でHTMLファイルも自動的に削除する
Movable Type で一旦公開したエントリーを削除した場合、対象のエントリー・アーカイブはデータベースから削除され、メインページやカテゴリー・アーカイブ/月別アーカイブに表示された記事、さらに各ページに貼られた対象エントリーへのリンクもすべて消滅しますが、Movable Type を普通にインストールしたままの状態では、エントリーを公開した時点で生成されるHTMLファイルは残ってしまいます。
したがって、対象となるエントリーの公開→削除のタイミングによっては検索ロボットにクロールされてしまい、削除したはずのエントリーが検索エンジン経由で他の方に閲覧されてしまう可能性があります。*1
これは公開したエントリーを「非公開」に変更した場合や出力ファイル名を変更した場合も同様です。
このような事態を回避したい場合、これまではFTPツール等を利用して手動で残ってしまったHTMLファイルを削除する必要がありましたが、3.3 からはオプション機能として、
- エントリー削除
- 「公開」から「非公開」への変更
- ファイル名変更
の各操作と同時に、該当のHTMLファイルも Movable Type が自動的に削除してくれるようになりました。
参考サイトは下記です。ありがとうございました。
MovableTypeで行こう!:Movable Type 3.3-jaにアップデートしました
MovableType備忘録:ブログを上手に運用する
1.設定方法
Movable Type をインストールしたディレクトリにある、mt-config.cgi に下記の1行を追加します。
DeleteFilesAtRebuild 1
さらに具体的に説明すると、サーバにアップロードしている mt-config.cgi をダウンロードして、任意のエディタで開き、リスト1のように青色の行を追加し(こういう場合のお作法として、追加した行の行末には改行をいれておきましょう)、ファイルを保存後、mt-config.cgi を元の場所に再度アップロードします。
## Movable Type configuration file ## ## ## ## This file defines system-wide settings for Movable Type ## ## In total, there are over a hundred options, but only those ## ## critical for everyone are listed below. ## ## ## ## Information on all others can be found at: ## ## http://www.sixapart.jp/movabletype/manual/config ################################################################ ##################### REQUIRED SETTINGS ######################## ################################################################ # The CGIPath is the URL to your Movable Type directory CGIPath http://www.example.com/cgi-bin/mt/ # The StaticWebPath is the URL to your mt-static directory # Note: Check the installation documentation to find out # whether this is required for your environment. If it is not, # simply remove it or comment out the line by prepending a "#". StaticWebPath http://www.example.com/mt-static #================ DATABASE SETTINGS ================== # REMOVE all sections below that refer to databases # other than the one you will be using. ##### SQLITE ##### ObjectDriver DBI::sqlite Database /path/to/sqlite/database/file DeleteFilesAtRebuild 1- リスト1 mt-config.cgi への設定例
2.各操作におけるファイル削除・リンク変更等の振る舞いについて
デフォルトテンプレートを元に、
- エントリー削除
- 「公開」から「非公開」への変更
- エントリー編集画面の「出力ファイル名」を変更
- 管理画面の「アーカイブマッピング」欄の「出力ファイル名」を変更
の各操作について、
- A.対象エントリーに対応するHTMLファイル削除
- B.対象エントリーの前後エントリーに設定された(対象エントリーの)リンクの削除または変更
- C.カテゴリー・アーカイブ/日付アーカイブの(対象エントリーの)記事の削除または変更
- D.メインページの(対象エントリーの)記事・リンクの削除または変更
が、それぞれどのようになるか実験してみました(3つのエントリーを「公開」で保存し、中間のエントリーを操作)。
実験結果は表1の通りです。
| 操作 | A | B | C | D |
|---|---|---|---|---|
| エントリー削除 | 削除 | 要再構築 | 要再構築 | 要再構築 |
| 「非公開」へ変更 | 削除 *2 | 要再構築 | 削除 | 削除 |
| 出力ファイル名変更 (エントリー編集画面) |
削除 | 変更 | 変更 | 変更 |
| 出力ファイル名変更 (管理画面) |
非削除 | 要再構築 | 要再構築 | 要再構築 |
ご覧の通り、HTMLファイル自体はどの操作でも概ね削除されます。他のページに残存したリンクは一部再構築が必要なようです。
*1:「ダイナミックパブリッシング」を利用している場合、このような事象は発生しません。
*2:エントリー一覧画面右上にあるプルダウンメニューの「非公開にする」の操作ではファイルは削除されませんでした。
Movable Type で blockquote 要素を記述する時の注意
blockquote 要素を使用した Movable Type のエントリーを、Another lint HTML Gateway でチェックすると、
9: line xx: <blockquote> を xx行目の <p>~</p> 内に書くことはできません。<blockquote>~</blockquote> 内に <p> を書くことはできます。 → 解説 43
というエラーが出る場合があります。本エントリーではその原因と対処方法について記します。
以前、このエラー発生についてのご質問を頂き、回答するお約束をしておりましたが、エントリーすることをすっかり失念しておりました。申し訳ありません。この場をお借りしてお詫び申し上げます。
また記事中に誤った認識がある場合、適宜ご指摘頂ければ幸いです。
1.blockquote 要素の仕様
XHTML文書では、blockquote 要素を p 要素の中に記述することはできません。
例えば、下記のようなマークアップは誤りです。*1 *2
<p>
<blockquote>引用</blockquote>
</p>
ちなみに blockquote が記述できる親要素は XHTMLのバージョンによって異なります。利用可能な要素を調べるには下記のページが参考になるでしょう。
2.問題点
Movable Type のエントリー編集画面下にある「改行設定」で「改行を変換する」を選択している場合、下記のような文書構造
段落1
段落2
段落3
を書くと、空行ではさまれた段落は自動的に p 要素で括られ、
<p>段落1</p>
<p>段落2</p>
<p>段落3</p>
となります。
ただし、空行の直後(あるいはエントリー開始行)が blockquote 等 *3 で開始(または終了)する場合、「p 要素で括る」という変換は行われません。
例えば、
段落1
<blockquote>引用</blockquote>
段落2
と書けば、
<p>段落1</p>
<blockquote>引用</blockquote>
<p>段落2</p>
と変換されるので、「blockquote 要素が p 要素で括られてしまう」という問題は発生しません。
問題となるのは blockquote 要素の前に空行がない場合です。
段落1
<blockquote>引用</blockquote>
段落2
という文書では、
<p>段落1
<blockquote>引用</blockquote>
段落2</p>
と、全体がひとつの段落としてみなされ、p 要素で括られてしまい、blockquote 要素に対し予期しないマークアップがされてしまうことになります。
これが冒頭に申し上げた問題です。
3.問題を回避するための対処
以下に対処方法を提示します。
3.1 blockquote 要素の開始タグの前と終了タグの後に空行を設ける
2項の説明からお分かりの通り、「改行設定」で「改行を変換する」を選択している場合、blockquote 要素の開始タグの前と終了タグの後に空行を挿入します。ただし blockquote がエントリーの先頭であれば開始タグ前の空行は不要です。
終了タグの後ろに空行を挿入する理由は、その後に続く段落に p 要素を付与するためです(p 要素が付与されないと、その箇所だけ他と異なるマークアップになる可能性があります)。
次の段落がブロックレベル要素のタグで開始するのであれば空行は不要ですが、「ブロックレベル要素の前後は空行」というお作法で統一しておいた方が良いでしょう。
3.2 手動でマークアップする
「改行設定」で「改行を変換する」を選択せずに、ご自身でマークアップをすれば想定外のマークアップをされる心配はありません。が、個人的には改行変換機能を利用して少し気をつけてエントリーを記述した方が効率的であると考えます。
4.その他の注意点
4.1 blockquote 要素で括られた文書の途中に空行を作らない
改行変換機能には「空行をみつけて p 要素を挿入するという規則があるので、blockquote 要素で括られた文書の途中に空行が存在すると、Movable Type の処理上、そこが段落の開始とみなされ、次の空行までを p 要素で括られてしまい、誤ったマークアップになります。
例えば、
段落1
<blockquote>引用
引用</blockquote>
段落2
と書くと、
<p>段落1</p>
<blockquote>引用
<p>引用</blockquote></p>
<p>段落2</p>
と、予期しない p 要素のマークアップが行われ、結果的に誤った XHTML になってしまいます。
どうしても blockquote 要素の中で空行を挿入したい場合は、
- 空行となる部分に半角空白を挿入する
- 改行変換機能を使わない
のいずれかを選択してください。
補足すると、前者は半角空白文字を本来の目的と異なった用途で使用するため、後者の方法が本来ですが、私自身は前者を用いております(ダブルスタンダードであることは認識しています。予めご容赦ください)。
4.2 blockquote 要素に改行を挿入するように修正する
blockquote 要素の前に空行を挿入することによる弊害は、blockquote 要素内の改行に br 要素が付与されなくなる、つまり blockquote 要素内で改行変換機能が効かなくなることです。
これを解消する方法については、「エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)」を参照ください。
*1:例えば、XHTML1.0 Strict では、blockquote 要素の子要素として記述できるのは、ブロックレベル要素(address / blockquote / div / dl / fieldset / form / h1 / h2 / h3 / h4 / h5 / h6 / hr / ol / p / pre /table / ul) と del 要素、ins 要素、noscript 要素、script 要素です。つまり、インライン要素や #PCDATA (意味はばけらの HTML リファレンス(未完成):構文解析対象文字データ」参照)を直接記述することはできませんが、ここでは複雑になるのを避けるため説明を省略しています。
*2:blockquote 要素には cite 属性(引用元URL)を記述することができますが、この記事の主旨から外れるので説明は省略しています。また cite 要素を記述することについても同様の理由で言及しておりません(それらを使用することが適切であることは認識しています)。
*3:h1 / h2 / h3 / h4 / h5 / h6 / table / ol / dl / ul / menu / dir / p / pre / center / form / fieldset / select / blockquote / address / div / hr
エントリー・アーカイブで親カテゴリーに含まれる全エントリーをサブカテゴリー別に表示
エントリー・アーカイブで、親カテゴリーに含まれる全エントリーをサブカテゴリー別に表示するカスタマイズです。
タイトルから機能を理解して頂くのは困難と思いますので、とりあえずサンプルで説明します。
まず、下記のようなサブカテゴリーリストを仮定します。
植物
├ バラ科
│ ├ やまぶき
│ └ ワレモコウ
├ ユリ科
│ ├ チューリップ
│ └ ヒアシンス
└ ラン科
├ サギソウ
└ カトレア
昆虫
├ コガネムシ科
│ ├ カブトムシ
│ └ スジコガネ
└ アガハチョウ科
├ キアゲハ
└ アゲハ
このサブカテゴリーリストは次の規則にもとづいています。
- メインカテゴリー:「植物」または「昆虫」
- サブカテゴリー:科目
- エントリー:科目に属する植物または昆虫の「和名」
この前提で、ブラウザに表示するエントリー・アーカイブが「チューリップ」である場合、エントリー・アーカイブには親カテゴリー(植物)が属するすべてのエントリーをサブカテゴリー別に表示、つまり、
植物
├ バラ科
│ ├ やまぶき
│ └ ワレモコウ
├ ユリ科
│ ├ チューリップ
│ └ ヒアシンス
└ ラン科
├ サギソウ
└ カトレア
を表示するというものです。
以下に、公開テンプレートを使ったサンプルを作ってみました。
エントリー・アーカイブの左上に表示されている「親カテゴリーに属する全カテゴリー」が今回紹介するリストです。
エントリー・アーカイブに同一カテゴリーのエントリーを表示する方法は「個別エントリーアーカイブに同一カテゴリーのエントリーを表示」で紹介している通り、よく知られているテクニックですが、エントリーをカテゴリー別に表示したり、同じ親カテゴリーのエントリーを表示する方法は知られていません。
ただしこのカスタマイズには下記の制約があります。
- 親カテゴリー(「植物」や「昆虫」)にエントリーが存在しないこと。
- サブカテゴリーの下にサブカテゴリーが存在しない(「バラ科」の下に「サクラ属」というサブカテゴリーが存在しない)こと。
上記のリストを表示するMTタグです。
<MTParentCategory><MTSubCategories include_current="1">
<MTSubCatIsFirst><ul></MTSubCatIsFirst><MTIfNonZero tag="MTCategoryCount"><li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><$MTCategoryLabel$></a>
<MTEntries><MTEntriesHeader><ul></MTEntriesHeader><li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li><MTEntriesFooter></ul></MTEntriesFooter></MTEntries><MTElse><li><$MTCategoryLabel$></MTElse></MTIfNonZero><MTSubCatsRecurse max_depth="3"></li><MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories></MTParentCategory>
ツリー化するには、maketree.js を利用して、下記の青色部分を追加します。
<div class="side">
<div id="parentCategoryEntries">
<MTParentCategory><MTSubCategories include_current="1">
<MTSubCatIsFirst><ul></MTSubCatIsFirst><MTIfNonZero tag="MTCategoryCount"><li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><$MTCategoryLabel$></a>
<MTEntries><MTEntriesHeader><ul></MTEntriesHeader><li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li><MTEntriesFooter></ul></MTEntriesFooter></MTEntries><MTElse><li><$MTCategoryLabel$></MTElse></MTIfNonZero><MTSubCatsRecurse max_depth="3"></li><MTSubCatIsLast></ul></MTSubCatIsLast>
</MTSubCategories></MTParentCategory>
</div>
</div>
<script type="text/javascript">
generateTreeForTreeStructure('parentCategoryEntries');
</script>
CSSは下記です。
ul.tree {
margin: 0px!important;
padding: 0px!important;
font-size: 9px;
list-style: none!important;
}
ul.tree ul {
margin-left: 10px;
padding: 0!important;
}
ul.tree li {
margin: 0;
padding: 0;
background: none;
list-style: none!important;
}
ul.tree li ul li {
margin: 0 0 0 10px;
padding-left: 13px;
background-image: url(tree_lst.gif);
background-repeat: no-repeat;
list-style: none;
}
ul.tree li ul li.end {
background-image: url(tree_end.gif);
list-style: none;
}
このカスタマイズはカテゴリー・アーカイブに適用した場合も同様の動作をします。
エントリーの文字数を表示する
|
1.プラグインのダウンロード
下記のページよりプラグインをダウンロードします。
アーカイブを解凍して、中にある mt-i18n.pl を plugins ディレクトリにアップロードします。特に設定項目はありません。
/plugins/mt-i18n.pl
2.エントリー本文の文字数を表示
下記のコードをテンプレートの <MTEntries>~</MTEntries> の間(エントリー・アーカイブはどこでもいいです)に設定します。
HTMLマークアップをカウントする場合
<MTLengthText><$MTEntryBody$></MTLengthText>
HTMLマークアップをカウントしない場合
<MTLengthText><$MTEntryBody remove_html="1"$></MTLengthText>
とします。
上記の例では記事の文字数が表示されるだけですので、
<MTLengthText><$MTEntryBody remove_html="1"$></MTLengthText>文字です。
と適当な説明をつけ加えましょう。
3.エントリータイトル・エントリー本文・追記の文字数を全て合計して表示
下記のように JavaScript を利用します。エントリータイトル・エントリー本文・追記の文字数を個別に取得し、その合計を JavaScript で表示します。
<script type="text/javascript">
var length = <MTLengthText><$MTEntryTitle remove_html="1"$></MTLengthText>+<MTLengthText><$MTEntryBody remove_html="1"$></MTLengthText>+<MTLengthText><$MTEntryMore remove_html="1"$></MTLengthText>;
document.write('この記事は ' + length + ' 文字です');
</script>
PHPを利用するのであれば
<?php
$length = <MTLengthText><$MTEntryTitle remove_html="1"$></MTLengthText>+<MTLengthText><$MTEntryBody remove_html="1"$></MTLengthText>+<MTLengthText><$MTEntryMore remove_html="1"$></MTLengthText>;
print "この記事は $length 文字です";
?>
という具合です。
エントリー・アーカイブで同一カテゴリーのトラックバックを表示する
Movable Type のエントリー・アーカイブで同一カテゴリーのトラックバックだけを表示するカスタマイズです。ご質問を頂きましたので本エントリーにて紹介致します。
基礎知識として、エントリー・アーカイブで MTPings タグを普通に利用するだけでは、該当エントリーのトラックバックしか表示されません(アーカイブページに「最近のコメント」「最近のトラックバック」を表示する参照)。そういう訳でプラグインをいくつか試してみましたが、そのまま使うことで表示を満足するものはありませんでした(あったらすいません)。
で、自分でプラグインを作成するスキルもないので、勝手ながら Ogawa::memoranda さんの Recently pinged on Plugin を下記の通り改変させて頂き、表示させることができました。
プラグイン:Recently pinged on Plugin
改変内容:エントリー・アーカイブで同一カテゴリーのトラックバックだけを表示する
プラグインのダウンロード、インストール等につきましては配布元の記事を参照ください。
1.プラグインの修正
recently-pinged-on.pl に下記のパッチをあててください。パッチ適用前にファイルのタブ文字を半角空白8文字に変換してください。
--- recently-pinged-on.pl.bak Tue May 30 01:14:15 2006
+++ recently-pinged-on.pl Tue May 30 01:16:35 2006
@@ -41,7 +41,7 @@
my $blog_id = $ctx->stash('blog_id');
my ($start, $end) = ($ctx->{current_timestamp},
$ctx->{current_timestamp_end});
- my $cat = $ctx->stash('archive_category');
+ my $cat = $ctx->{current_archive_type} eq 'Individual' ? $ctx->stash('entry')->category : $ctx->stash('archive_category');
require MT::TBPing;
my $iter = MT::TBPing->load_iter({ blog_id => $blog_id },
@@ -63,6 +63,7 @@
my $entry = MT::Entry->load($entry_id) or next;
next if $entry->status != MT::Entry::RELEASE();
+ next if !$cat && $ctx->{current_archive_type} eq 'Individual';
next if $cat && !$entry->is_in_category($cat);
next if $start && $end && ($entry->created_on < $start || $entry->created_on > $end);
パッチの利用方法が分からない方は、下記の recently-pinged-on.pl の抜粋を参考に、赤色部分を削除して青色の行を追加してください。*1
:
my $blog_id = $ctx->stash('blog_id');
my ($start, $end) = ($ctx->{current_timestamp},
$ctx->{current_timestamp_end});
my $cat = $ctx->stash('archive_category');
my $cat = $ctx->{current_archive_type} eq 'Individual' ? $ctx->stash('entry')->category : $ctx->stash('archive_category');
:
(中略)
:
require MT::Entry;
my $entry = MT::Entry->load($entry_id) or next;
next if $entry->status != MT::Entry::RELEASE();
next if !$cat && $ctx->{current_archive_type} eq 'Individual';
next if $cat && !$entry->is_in_category($cat);
next if $start && $end && ($entry->created_on < $start || $entry->created_on > $end);
:
一応確認したつもりですが、改変内容に不備(他のアーカイブで仕様通りに動作しない等)がございましたらご指摘ください。
2.テンプレートの設定
エントリー・アーカイブのサイドバーの任意の位置に「最近のトラックバック」を表示する下記のタグを設定します。これまで表示していた「最近のトラックバック」のタグは削除してください。
あまり差異はありませんが、デフォルトテンプレートと公開テンプレートの2種類を挙げておきます。
2.1 デフォルトテンプレートの場合
<div class="module-archives module">
<h2 class="module-header">Entries of this Category</h2>
<div class="module-content">
<MTEntries recently_pinged_on="5">
<a href="<$MTEntryLink$>"><$MTEntryTitle$></a>
<ul>
<MTPings lastn="5">
<li><a href="<$MTPingURL$>" rel="nofollow"><$MTPingTitle$></a><br />
[<$MTPingBlogName$>] <$MTPingDate format="%m/%d %X"$></li>
</MTPings>
</ul>
</MTEntries>
</div>
</div>
2.2 公開テンプレートの場合
<div class="sidetitle">
Recent Comments
</div>
<div class="side">
<MTEntries recently_pinged_on="5">
<a href="<$MTEntryLink$>"><$MTEntryTitle$></a>
<ul>
<MTPings lastn="5">
<li><a href="<$MTPingURL$>" rel="nofollow"><$MTPingTitle$></a><br />
[<$MTPingBlogName$>] <$MTPingDate format="%m/%d %X"$></li>
</MTPings>
</ul>
</MTEntries>
</div>
*1:色覚障害等で色が識別できない場合は、サイト右上の「Styles」メニューにある Gray Scale をクリックしてください。IEではグレースケール表示され、青色部分が下線表示、赤色部分が二重下線で表示されます。Firefox/Opera ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。
エントリー・アーカイブで同一カテゴリーのコメントを表示する
Movable Type のエントリー・アーカイブで同一カテゴリーのコメントだけを表示するカスタマイズです。ここでは MTTagInvoke プラグインを利用した方法を紹介します。
1.プラグインのインストール
下記のサイトより MTTagInvoke プラグインをダウンロードします。ダウンロードしたアーカイブを解凍して、0.9 の場合は MTTagInvoke.pl を plugins フォルダに配置(またはアップロード)、1.0の場合は MTTagInvoke フォルダごと plugins フォルダに配置(またはアップロード) します。
アップロード後、Movable Type 管理画面の
メイン・メニュー > システム・メニュー > プラグイン
でプラグインの一覧が表示されますので、その中に「MTTagInvoke」が表示されていればOKです。
MTTagInvoke の機能については、配布サイトや個別エントリーアーカイブに同一カテゴリーのエントリーを表示の後半にある説明を参照ください。
2.テンプレートの設定
エントリー・アーカイブのサイドバーの任意の位置に「最近のコメント」を表示する下記のタグを設定します。これまで表示していた「最近のコメント」のタグは削除してください。
あまり差異はありませんが、デフォルトテンプレートと公開テンプレートの2種類を挙げておきます。
注:MTTagInvoke プラグインは2006年9月7日、Movable Type 3.3 対応のため、1.0 にバージョンアップされました。これによりプラグインで使用されているMTタグの名称が下記のように変更されています。サンプルリストは 1.0 に合わせた内容に変更しましたので、もし 0.9 を使っている場合は、記事のサンプルリストをご利用になる際、適宜読み替えてください。
| 1.0(現在) | 0.9 |
|---|---|
| MTTagInvokeName | MTTagName |
| MTTagInvokeAttribute | MTTagAttribute |
| MTTagInvokeContent | MTTagContent |
2.1 デフォルトテンプレートの場合
<div class="module-archives module">
<h2 class="module-header">Entries of this Category</h2>
<div class="module-content">
<MTTagInvoke tag_name="MTEntries">
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
<MTTagInvokeContent>
<MTIfNonZero tag="MTEntryCommentCount">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
<MTComments lastn="5">
└ <a href="<$MTEntryLink$>#<$MTCommentID$>"><MTCommentAuthor></a> <$MTCommentDate format="%m/%d"$><br />
</MTComments>
</MTIfNonZero>
</MTTagInvokeContent>
</MTTagInvoke>
</div>
</div>
2.2 公開テンプレートの場合
<div class="sidetitle">
Recent Comments
</div>
<div class="side">
<MTTagInvoke tag_name="MTEntries">
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
<MTTagInvokeContent>
<MTIfNonZero tag="MTEntryCommentCount">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
<MTComments lastn="5">
└ <a href="<$MTEntryLink$>#<$MTCommentID$>"><MTCommentAuthor></a> <$MTCommentDate format="%m/%d"$><br />
</MTComments>
</MTIfNonZero>
</MTTagInvokeContent>
</MTTagInvoke>
</div>
2006.10.02 追記
MTTagInvoke 1.0 の記述を追加しました。
2006.11.23 追記
サンプルリストを MTTagInvoke 1.0 にあわせました。
CSSでエントリータイトルに画像を表示する
以下カスタマイズ方法です。なお、リスト形式(ul - li)で画像を表示する場合はリストマークの画像のずれを修正するを参照ください。 |
1.テンプレートの修正
Movable Type の公開テンプレートではエントリータイトルを下記のように設定しています(分かりやすくするために一部省略しています)。
<h3 class="entry-header">●<$MTEntryTitle$></h3>
<$MTEntryTitle$> が実際にはエントリータイトルに変換されます。「●」は私が勝手につけたもので、エントリータイトルの先頭に付与されます。
この「●」を削除して、
<h3 class="entry-header"><$MTEntryTitle$></h3>
としてください。テンプレートの修正はこれだけです。他のテンプレートをお使いの方は、エントリータイトルを囲むタグに
class="entry-header"
が設定されていればOKです。
この entry-header を利用して次項でスタイルを設定しますが、補足しておくと entry-header という class 属性は不要で、
<h3><$MTEntryTitle$></h3>
として、hx(ここでは h3)タグに直接スタイルを設定することも可能です。ここでは h3 を h2 や h1 に変更する時の利便性を考慮してこのような設定にしていますが、hx タグにスタイルを設定する手法が本来的と思われます(同じ hx に異なるスタイルを設定する場合は class 属性を与えます)。
2.CSSの修正
スタイルシートで、エントリータイトル部分のスタイルを指定する entry-header に青色のプロパティを追加します。公開テンプレートを誤使用でない方も、青色部分のプロパティ設定は同じです。
/* エントリータイトル */
.entry-header {
margin: 15px 0 0;
color: #444444;
font-size: 12px;
font-weight: bold;
padding-left: 17px;
background: url(http://hogehoge/images/image.gif) no-repeat 0px 0.2em;
}
padding-left プロパティはテキストタイトルの左側に余白を作り、そこに画像を表示させるために設定します。
background プロパティで画像を表示させます。後続の設定の意味は下記の通りです。
- url(?)
- 表示させたい画像のURL(background-image)
- no-repeat
- 画像を繰り返さない(指定しないと繰り返し表示されます)(background-repeat)
- 0px
- 画像の左端からの表示位置(background-position)
*単に"0"でもOKですが値を設定する場合を考慮して単位を付与しています - 0.2em
- 画像の上端からの表示位置(background-position)
カッコ内はプロパティを別々に設定した時に対応する名称です。
テキストタイトルのパディングと画像の表示位置は画像サイズによって変動するため、適宜調整してください。"17px" および "0.2em" という値を変えることで微調整できます。
またここでは説明を割愛しますが、画像をエントリーのテキスト全体に背景として表示させることも可能です。
3.非推奨
画像を表示する場合、img タグをテンプレートに設定して
<h3 class="entry-header"><img src="http://hogehoge/images/image.gif"><$MTEntryTitle$></h3>
とする手もありますが、ウェブスタンダード的には
- 文書構造とデザインの混在
- 転送バイト数の増加
の点からお勧めではありません。
具体的には、画像を他の画像に変更したい場合、HTMLに img タグを直接記述していると文書構造を表すHTMLを変更しなければなりません。また、エントリータイトルが同一ページに複数存在する場合、img タグがエントリー数分必要となるため転送バイト数が増加し、僅かですが表示速度のパフォーマンスに影響します。
エントリーの中でMTタグを使う
MTタグはテンプレートでの使用が前提となっており、エントリーの内容ではを使うことができません。例えば他のエントリーアーカイブページへのリンクや、画像を貼り付けてURLを記述する場合、メインページのテンプレートや各アーカイブテンプレートには、下記リストのように、
エントリーアーカイブページへのリンク
<a href="<$MTLink entry_id="678"$>">
画像のURL
<img src="<$MTBlogURL$>images/hogehoge.gif" alt="hogehoge" />
とMTタグを使った記述が可能ですが、エントリーの内容には、
エントリーアーカイブページへのリンク
<a href="http://www.koikikukan.com/archives/2005/10/24-011007.php">
画像のURL
<img src="http://www.koikikukan.com/images/hogehoge.gif" alt="hogehoge" />
と、URLを直接書かなければなりません。
もしエントリーにMTタグを直接書くことができれば、エントリーアーカイブのPHP化を行った場合にファイル名を修正する必要がありませんし、ドメインを変更した場合もエントリーに書いたURLを修正する必要がなくなり、大変便利です。
ということで、エントリー内でMTタグが利用可能になるプラグインをご紹介します。
プラグイン配布元は下記です。
Life on the Kernel:MT::Plugin::EvalTemplate
以下、設定方法です。
2009.08.11 追記:MT4.1 から mteval モディファイアが標準機能として搭載されました。
1.プラグインのダウンロードおよびアップロード
配布元にある EvalTemplate のリンクをクリックしてダウンロードします。eval-template.txt というファイルがダウンロードされますので、ファイル名を eval-template.pl に変更し、それを plugins ディレクトリ直下にアップロードします。
2.テンプレート修正
テンプレートに記述されている MTEntryBody または MTEntryMore タグに eval 属性を付与します。本文でMTタグを使いたい場合は、MTEntryBody タグを探して
<$MTEntryBody eval="1"$>
と青色部分を追加するだけです。追記で利用したい場合は、MTEntryMore タグを
<$MTEntryMore eval="1"$>
に変更します。
これで「保存」をクリックし、テンプレートを保存します。これでエントリー編集画面に冒頭に挙げたようなMTタグを書き込んでみましょう。エントリーの保存・再構築後に記述したMTタグ、例えば <$MTBlogURL$> と書いたのであれば、URLに変換されていれば成功です。
ここではエントリー本文と追記のみについて書きましたが、このプラグインは Global Filter なので他のMTタグにも適用できるようです。ただし配布元で
間違っても Comments や Trackback で有効にしないように気を付けよう。
という注意書きがあります。例えば MTCommentBody でこの機能を有効にすると、投稿内容にMTタグを記述されるととんでもないことになる、という意味だと思いますので気をつけましょう。
2005.12.08
ダウンロードのファイル名を修正しました。
2006.11.21
配布元のリンクを修正しました。
個別エントリーアーカイブに同一カテゴリーのエントリーを表示
タイトルの通り、個別エントリーアーカイブで同一カテゴリーに属するエントリーの一覧を表示するカスタマイズです。公開テンプレートのカテゴリーアーカイブで同一カテゴリーのエントリー一覧を表示していますが、本カスタマイズを行うことで同じものを個別エントリーアーカイブに表示することができます。
一番最初にこのカスタマイズを発見したのは実はかなり昔で、下の記事です。
ご近所サイトさんでは下記がありました(とりこぼしご容赦ください)。
- ぐーたら on MT:個別記事にその記事の属するカテゴリーの記事一覧を。
- Magic White:個別記事にカテゴリー内記事一覧表示
- Stupid Excuse:This Category Entries
- やむやむ:ThisCategoryEntriesですと!?
以下、カスタマイズ方法です。
1.MTTagInvoke プラグインをダウンロード
下記のサイトよりプラグインをダウンロード・解凍して、0.9 の場合は MTTagInvoke.pl を plugins フォルダに配置(またはアップロード)、1.0の場合は MTTagInvoke フォルダごと plugins フォルダに配置(またはアップロード) します。
アップロード後、Movable Type 管理画面の
メイン・メニュー > システム・メニュー > プラグイン
でプラグインの一覧が表示されますので、その中に「MTTagInvoke」が表示されていればOKです。
2.テンプレートの設定
個別エントリーアーカイブテンプレートのサイドバーに下記のタグを設定します。上記のサイトからの情報をまとめて3パターン用意してみました。緑色は公開テンプレート用の設定を示しています。
注:MTTagInvoke プラグインは2006年9月7日、Movable Type 3.3 対応のため、1.0 にバージョンアップされました。これによりプラグインで使用されているMTタグの名称が下記のように変更されています。サンプルリストは 1.0 に合わせた内容に変更しましたので、もし 0.9 を使っている場合は、記事のサンプルリストをご利用になる際、適宜読み替えてください。
| 1.0(現在) | 0.9 |
|---|---|
| MTTagInvokeName | MTTagName |
| MTTagInvokeAttribute | MTTagAttribute |
| MTTagInvokeContent | MTTagContent |
2.1 同一カテゴリーに属するエントリー一覧を表示
<div class="sidetitle">
Entries of this Category
</div>
<div class="side">
<MTTagInvoke tag_name="MTEntries">
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
<MTTagInvokeContent>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTTagInvokeContent>
</MTTagInvoke>
</div>
2.2 表示するエントリー数を指定
2.1に青色部分を追加します。サンプルは最近の5件を表示する設定です。
<div class="sidetitle">
Entries of this Category
</div>
<div class="side">
<MTTagInvoke tag_name="MTEntries">
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
<MTTagInvokeAttribute name="lastn">5</MTTagInvokeAttribute>
<MTTagInvokeContent>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTTagInvokeContent>
</MTTagInvoke>
</div>
2.3 エントリー毎にコメントを表示
2.1または2.2に青色字部分を追加します。サンプルは最近の5コメントを表示する設定です。
<div class="sidetitle">
Entries of this Category
</div>
<div class="side">
<MTTagInvoke tag_name="MTEntries">
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
<MTTagInvokeContent>
<MTIfNonZero tag="MTEntryCommentCount">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
<MTComments lastn="5">
└ <a href="<$MTEntryLink$>#<$MTCommentID$>"><MTCommentAuthor></a><br />
</MTComments>
</MTIfNonZero>
</MTTagInvokeContent>
</MTTagInvoke>
<div class="side">
2.4 ツリー化&日別表示をつける
「最近のエントリー」の日別表示を適用させてみました。サンプルは最近の10件を表示する設定になっています。lastn 指定の行を外せば全エントリーが表示されます。タグは ul -li のリスト形式になっていますのでご注意ください。
<div class="sidetitle">
Entries of this Category
</div>
<div class="side">
<MTTagInvoke tag_name="MTEntries">
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
<MTTagInvokeAttribute name="lastn">10</MTTagInvokeAttribute>
<MTTagInvokeContent>
<MTDateHeader>
<ul><$MTEntryDate format="%m/%d"$>
</MTDateHeader>
<li><a href="<$MTEntryPermalink$>" title="<$MTEntryTitle$>"><$MTEntryTitle$></a></li>
<MTDateFooter>
</ul>
</MTDateFooter>
</MTTagInvokeContent>
</MTTagInvoke>
</div>
MTTagInvoke プラグインはMTタグのタグアトリビュート(属性)に対してさらにMTタグを利用できるというものです。一番目のサンプルを例にすると、本来書きたいMTタグは
<MTEntries category="<$MTEntryCategory$>">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTEntries>
となります。これは「最近のエントリー」表示用タグで、これに赤色部分で「表示されているエントリーのカテゴリーと同じエントリーを表示」を指定しているのですが、タグアトリビュート category の指定にMT変数タグ <$MTEntryCategory$> は指定できません(再構築でエラーとなります)。そこで MTTagInvoke プラグインを用いて、MTEntries の代わりに MTタグ名の指定
<MTTagInvoke tag_name="MTEntries">
を行い、続いて「タグアトリビュート category に <$MTEntryCategory$> を使う」という指定、
<MTTagInvokeAttribute name="category"><$MTEntryCategory$></MTTagInvokeAttribute>
を行うことで、
<MTEntries category="<$MTEntryCategory$>">
と同じ効果を得ることができる訳です。ここではタグアトリビュートをひとつだけ指定していますが、複数指定することも可能です。
2006.05.25 追記
2.3項のタグで、コメントがないエントリーが表示される不具合を修正しました。
2006.10.02 追記
MTTagInvoke 1.0 の記述を追加しました。
2006.11.23 追記
サンプルリストを MTTagInvoke 1.0 にあわせました。
エントリーにpタグとbrタグが入る仕組み(その3:textareaにbrタグを挿入しない)
その2では特定のタグに対して常に改行タグを挿入する方法について述べましたが、今回は逆に改行タグを挿入しない方法について記します。
エントリーに <textarea>~</textarea> や <pre>~</pre> 等、内部情報に改行タグを挿入したくないタグを使用する場合があります。が現状の動作では、例えばpreタグは改行タグが挿入されないよう、
- lib/MT/Util.pm
の html_text_transform の条件式に
sub html_text_transform {
my $str = shift;
$str ||= '';
my @paras = split /\r?\n\r?\n/, $str;
for my $p (@paras) {
if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|blockquote|fieldset|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
}
}
join "\n\n", @paras;
}
としっかり設定(青色部分)されていますが、直前の行が空行でなければ期待する動作になりません。textareaタグは条件式に設定すらされていないので一律挿入されます。
こういう時のため(?)に、エントリー編集画面の下に「テキストフォーマット」が用意されているようで、この選択を「Convert Line Breaks」から「なし」に変更することでエントリーには改行タグが一律設定されなくなります。
しかし逆に他のテキスト行に改行タグを自前で付与しなければならず、結構面倒です。また「なし」にしなければならない設定を「Convert Line Breaks」のまま登録してしまい、textarea内をbrタグだらけにしてしまうという失敗もやらかしました。
できればどのエントリーも「Convert Line Breaks」のまま記述でき、なおかつ特定のタグに括られた部分は改行タグを挿入したくないところです。
ということで対処してみました。前回までのような鬱陶しい説明はございません(というか既に十分長い前置きですが(笑))。
先の html_text_transform の
$p = "<p>$p</p>";
の次の行に
$p =~ s!((?:\G|<textarea>)[^<]*?)<br />!$1!g;
を追加すれば <textarea>~</textarea> 間にある改行タグを削除します。条件式にも一応 "textarea" を追加おくと良いでしょう。
なお textarea タグに属性を付与する場合は上記の <textarea> にも属性を記述して、文字列が完全にマッチするように修正してください。例えば <textarea cols="50" rows="10" readonly> というタグを記述されのであれば、スクリプトを
$p =~ s!((?:\G|<textarea cols="50" rows="10" readonly>)[^<]*?)<br />!$1!g;
とする必要があります。
他のタグを追加する場合は、追加した行の "textarea" を "(" と ")" で括り、該当のタグ文字を "|" で区切って追加します(下記はpreを追加する例です)。
$p =~ s!((?:\G|<(textarea|pre)>)[^<]*?)<br />!$1!g;
なお該当のタグ内に別のタグ(というか"<")が存在する(例えば <textarea>~<hoge>~</hoge>~</textarea>)場合は正常に動作しませんので予めご容赦ください。
このシリーズは以上です。
2004.10.23 追記
3.11-ja での動作実績が下記エントリーにて報告されています。
2005.03.10 追記
textareaに属性を設定する場合の説明を追加しました。
エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)
現状の Movable Type の振る舞いでは、エントリーのblockquote開始タグの直前の行に
- 何もない(=エントリーの先頭)
- 文字がある(=段落の途中にblockquoteが存在)
- 空行が1行ある
- 空行が2行ある
という状態によってpタグおよびbrタグの与えられ方が変化します。
上記のケース順に記した下記のエントリーがあるとします。
<blockquote>あいうえお
あいうえお
あいうえお</blockquote>
←空行
かきくけこ
<blockquote>かきくけこ
かきくけこ
かきくけこ</blockquote>
←空行
<blockquote>さしすせそ
さしすせそ
さしすせそ</blockquote>
←空行
←空行
<blockquote>たちつてと
たちつてと
たちつてと</blockquote>
これを保存すると、pタグおよびbrタグは次のように付与されます。
<blockquote>あいうえお
あいうえお
あいうえお</blockquote>
←空行
<p>かきくけこ<br />
<blockquote>かきくけこ<br />
かきくけこ<br />
かきくけこ</blockquote></p>
←空行
<blockquote>さしすせそ
さしすせそ
さしすせそ</blockquote>
←空行
<p><br />
<blockquote>たちつてと<br />
たちつてと<br />
たちつてと</blockquote></p>
2と4の場合は期待する結果になりますが、1と3の場合は改行が付与されません。いずれもエントリーにpタグとbrタグが入る仕組み(その1)に記した通りの動作です。
空行が2行の場合について補足致しますと、段落は連続した改行("\n\n"または"\r\n\r\n")で区切られるため、3つめの改行は段落内の文字として認識されます。つまりblockquoteタグの前に(空の)文字が存在する状態になるため改行タグが付与されます。2行あった空行は、後の1行が段落内の文字として扱われるため1行になります。空行下の <p><br /> に変換されている部分が昔、空行だった行です。
余談ですがこのロジックでは空行が偶数であれば改行タグが一律付与され、奇数の空行の場合は(条件に記されたタグは)付与されないという現象が発生します。
Movable Type における改行タグの挿入方法は、HTMLを記述する際に「タグの直前に空行が存在する」というお作法が前提になっていますが、エントリーに挿入した改行と同じ位置に改行タグの挿入を期待するユーザにとっては混乱を招く原因になっているように思われます。
改行を挿入する方法は他のサイトでも紹介されていますが、個人的には "blockquote" を条件式から除外別の条件式を作って br タグのみ付与する方法を採っています。
具体的には、lib/MT/Util.pmのhtml_text_transform(下記)
for my $p (@paras) {
if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|blockquote|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
}
}
に青色部分の
for my $p (@paras) {
if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|blockquote|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
} elsif ($p =~ m@^</?(?:blockquote)@) {
$p =~ s!?r??n!<br />?n!g;
}
}
を追加する方法を推奨します。
blockquote タグは p タグで括ることが禁止されているブロック要素ですが、この方法であれば、p タグで括られずに br タグを付与することができます。
同様に br タグのみを付与したいタグがあれば、blckquote と同様、上記の追加コードに該当のタグ名を追加してください。同様に、brタグを一律付与したいタグは条件から外すのが手っ取り早いと思います。(つづく)
2004.10.23 追記
3.11-ja での動作実績が下記エントリーにて報告されています。
2006.08.13 追記
blockquote 改変方法を変更しました。
エントリーにpタグとbrタグが入る仕組み(その1:コード解析)
我楽さんのBlockquoteタグにデフォルトで改行が入るようにする。(のそれた話)がきっかけという訳ではないのですが、私もエントリーのblockquoteタグに改行が入ったり入らなかったりすることがあり、Movable Typeにおけるbrタグ挿入の振る舞いについて前々から調べてました(時間かかりすぎ?)。
ということで書けそうなレベルまでなんとか到達しましたので、シリーズもので書きます(単なるネタ増やしです(笑))。ほとんどPerl&正規表現メモになってしまいました。Perlプログラマの方には既知の部分しかありませんので予めご容赦ください。また認識誤り等ございましたらお許しください。「難しい」という方は最後のまとめだけお読み頂ければ幸いです。
エントリー入力画面で、下にある「テキストエリア」というセレクトボックスが「Convert Line Breaks」になっている場合、「保存」または「確認」をクリックすると改行部分には自動的に <p>~</p> または <br /> が挿入されます。
この処理を行っているのが
- lib/MT/Util.pm
の html_text_transform という下記の関数です。
1:sub html_text_transform {
2: my $str = shift;
3: $str ||= '';
4: my @paras = split /\r?\n\r?\n/, $str;
5: for my $p (@paras) {
6: if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|blockquote|address|div|hr)@) {
7: $p =~ s!\r?\n!<br />\n!g;
8: $p = "<p>$p</p>";
9: }
10: }
11: join "\n\n", @paras;
12:}
処理は行番号毎に下記のようになっています。
- 引数であるエントリー文字列をローカル変数 $str に保持(他の処理から"@_"という省略された変数で引き継いでいます)。
- $str が空き、つまりエントリーが空きでなければ取得(この文は $str = '' || $str; と同義でしょうか)。
- $str を改行二つ(つまり空行)が入っている箇所で分割します。例えばエントリーに空行が3ヶ所あれば4つの(いわゆる)段落に分割されます。分割されたものは @paras という配列に保存されます。改行文字は文字コード(Shift_JIS、EUC等)によって "\r\n" と "\n" の2種類があり、
- \r?\n\r?\n
- \r\n\r\n または \n\n
- 分割された単位で下記の処理を繰り返します。この行では @paras から一段落分ずつ取り出し、変数 $p に設定しています。
- 該当するタグ(ここではh1、h2、h3?hr)にマッチしないか判定。
まず "m@?@" という構文はパターンマッチを表しており、段落中に "?" にある文字列が含まれていれば処理結果は「真」、つまり以降の処理を実施します。パターンマッチはPerlでは、
- /正規表現/
- m@正規表現@
- "<?" または "</?"
以上をまとめると、各段落の先頭が"<h1"、あるいは"</h1"等、条件式に書かれている開始・終了タグにマッチしないことが、この行の条件となります。マッチしなければ次の行を実行します。 - 改行文字を "\n<br />\n" に変換。雰囲気で変換しているのは分かりますが先と同様、"?" を\rの直後に用いることで "\r\n" または "\n" を対象としているのが分かります。また文字列置換は、
- s/置換前の文字列/置換後の文字列/g;
- s!置換前の文字列!置換後の文字列!g;
- 段落の最初と最後に <p>~</p> を挿入
- 分割した段落を "\n\n"(空行)で結合して元に戻す
処理内容は以上です。まとめると、
- pタグ:段落の先頭と最後に挿入(空行で区切られたものが「段落」となります)
- brタグ:段落内の改行部分に挿入。ただし条件式にかかれている文字列にマッチしない場合は挿入されない
ということになります。図に単純な例を示します。文章の前後には改行はないものとします。リスト内の「←空行」は便宜上の表示ですので文章には含まれません
【変換前】
あいうえお
←空行
かきくけこ
さしすせそ
【変換後】
<p>あいうえお</p>
←空行
<p>かきくけこ<br />
さしすせそ</p>
タグを用いた例については次回に記します。(つづく)
Movable Type でエントリータイトルやエントリー本文等の文字数を表示する方法です。
エントリータイトルの先頭に画像に表示する方法を紹介します。ここでは公開テンプレート(Movable Type)を用いた説明になりますが、HTMLとCSSの設定による一般的なテクニックですので、どのようなテンプレート(あるいはHTML)でも利用可能です。
