Movable Typeのカスタムフィールドに入力した複数のブログ記事IDからブログ記事リストを出力する
Movable Typeのカスタムフィールドに入力した複数のブログ記事IDからブログ記事リストを出力するカスタマイズを紹介します。
MTQで質問がありましたので、本エントリーで情報展開します。
1.カスタマイズイメージ
カスタムフィールド「ブログ記事ID」を作成します。種類は「テキスト」、テンプレートタグは「MTEntryIDs」とします。

ブログ記事編集画面に表示されたカスタムフィールド「ブログ記事ID」に、ブログ記事ページに表示したいブログ記事のIDをカンマ区切りで設定します。

ブログ記事を保存すれば、該当のブログ記事ページに、カスタムフィールドに入力したブログ記事IDに対応するブログ記事のリストを出力します(赤枠部分)。
以下、カスタマイズ方法を順を追って解説します。
2.Splitプラグインのインストール
以下のリンクよりSplitプラグインをダウンロード・インストールします。
Splitプラグインは、Perlのsplit機能をグローバルモディファイアとして提供します。
次のサブテンプレートは、変数fooに設定した「a,b,c」という値をカンマで区切り、「a」「b」「c」を配列変数barに設定するサンプルです。
<mt:setvar name="foo" value="a,b,c" />
<mt:getVar name="foo" split="," setvar="bar">
<mt:loop name="bar">
<mt:getVar name="__value__" /><br />
</mt:loop>
このサブテンプレートの出力結果は、
a
b
c
となります。
3.テンプレートの修正
次のようなサブテンプレートをブログ記事アーカイブに追加します。
<mt:if tag="EntryIDs">
<h2>関連ブログ記事</h2>
<$mt:EntryIDs split="," setvar="entry_ids"$>
<mt:loop name="entry_ids">
<mt:if name="__first__">
<ul>
</mt:if>
<mt:Entries id="$__value__">
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
</mt:Entries>
<mt:if name="__last__">
</ul>
</mt:if>
</mt:loop>
</mt:if>
サブテンプレートの仕組みは次の通りです。
まずMTIfタグでMTEntryIDsタグの値の入力有無を判定し、入力がある場合はMTEntryIDsタグの値をsplitモディファイアで分割し、配列変数entry_idsに設定します。ブログ記事IDがひとつだけの場合も配列に設定します。
その後、MTLoopタグで、配列の値をひとつずつ取り出し、MTEntryタグのidモディファイアに設定することでブログ記事情報を取得します。
インデックステンプレートに表示したい場合は、次のように全体をMTEntriesタグで括ってください。
<mt:Entries>
…(元のブログ記事情報を出力)…
<mt:if tag="EntryIDs">
<h2>関連ブログ記事</h2>
<$mt:EntryIDs split="," setvar="entry_ids"$>
<mt:loop name="entry_ids">
<mt:if name="__first__">
<ul>
</mt:if>
<mt:Entries id="$__value__">
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
</mt:Entries>
<mt:if name="__last__">
</ul>
</mt:if>
</mt:loop>
</mt:if>
</mt:Entries>
あとはブログ記事編集画面のカスタムフィールドに、表示させたいブログ記事IDを入力してください。
4.注意事項
ブログ記事数が多く、カスタムフィールドに大量のブログ記事IDを設定すると再構築時のパフォーマンスに影響が出る場合があります。
Movable Typeのポップアップコメントにカスタムフィールドを表示する
Movable Typeのポップアップコメントにカスタムフィールドを表示するカスタマイズです。ご質問を頂きましたので本エントリーで情報展開します。
1.ポップアップコメントについて
Movable Type(現時点のバージョンは5.0x)はデフォルトでポップアップコメント(コメントフォームを別ウィンドウで表示)をサポートしていませんが、「Movable Type 5でコメント投稿フォームをポップアップする」でカスタマイズを紹介しています。
このカスタマイズを行えばコメントをポップアップ表示できます。
![]()
本エントリーでは、このポップアップしたコメントフォームにコメントカスタムフィールドの内容を表示できるようにします。下の画面では「タイトル」「地域」というカスタムフィールドを表示しています。

カスタマイズを行う前にコメントカスタムフィールドを作成しておいてください。
2.form要素の修正
まず、mt-comments-popup.cgiにあるform要素に赤色で示した2行を追加します。
…前略…
<input type="hidden" name="blog_url" value="$blog_url" />
<input type="hidden" name="cgi_path" value="$cgi_path" />
<input type="hidden" name="blog_id" value="ブログID" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
<div id="comments-open-data">
…後略…
「ブログID」の部分はポップアップコメントにしたいブログのブログIDを設定します。
次に、追加したいブログでインデックステンプレートを新規作成し、以下の内容を設定します。テンプレートはプレビューで表示された内容を利用するために使うだけで、テンプレートを保存する必要はありません。
- テンプレート名:test
- 出力ファイル名:text.txt
- テンプレートの内容:以下
<mt:CommentCustomFields>
<mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName$></mt:SetVarBlock>
<mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
<mt:SetVarBlock name="custom_field_id">profile_<$mt:CustomFieldName dirify="1"$></mt:SetVarBlock>
<$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name"$>
</mt:CommentCustomFields>
設定後、プレビューを行います。プレビューに表示された内容がポップアップコメントに挿入する(X)HTMLマークアップになるので、この内容をマウスでコピーします。
コピーした内容をmt-comments-popup.cgiにあるform要素に貼り付けます。
…前略…
<div id="comments-open-text">
<label for="comment-text">コメント</label>
<textarea id="comment-text" name="text" rows="10" cols="50" onfocus="mtCommentFormOnFocus()"></textarea>
</div>
ここにコピーした内容を貼り付ける
<div id="comments-open-captcha"></div>
…後略…
3.スタイルの追加
mt-comments-popup.cgiにあるstyle要素に、以下の内容を追加します。
.field-top-label {
margin-bottom: 0.75em;
}
これでポップアップコメントにカスタムフィールドが表示されれば完成です。
コメントカスタムフィールドの値をクッキーに保存する方法
Movable Typeのコメント投稿フォームで、コメントカスタムフィールドの値をクッキーに保存する方法を紹介します。
1.概要
Movable Typeのコメント投稿フォームは、「ログイン情報を記憶」をチェックしておくことで、投稿時に入力した名前やメールアドレスなどをクッキーに保存し、次回のコメント投稿時に利用することができます。

ただし、クッキーに保存できるのはデフォルトで用意されているフィールドのみで、カスタムフィールドで作成したフィールドは保存できません。
例えば下の画像のように、「テキストフィールド」というコメントカスタムフィールドに入力した値は、次回のコメント投稿時には反映されません。

本エントリーでは、コメントカスタムフィールドに入力した値をクッキーに保存できるようにする方法を紹介します。
カスタマイズ後のコメント投稿フォーム

2.カスタマイズ
カスタマイズ対象は、コミュニティ機能を使っていない場合は、インデックステンプレートの「JavaScript」、コミュニティ機能を使っている場合はグローバルテンプレートの「GlobalJavaScript」になります。
以下に解説するサンプルは、カスタムフィールドのベースネームが「cf」で、カスタムフィールドがテキストフィールドの場合です。
2.1 mtSaveUser()の変更
まず、コメント投稿時に実行される関数mtSaveUser()に、コメント投稿フォームからカスタムフィールドの値を取得する処理(青色部分)を追加します。赤色部分の「cf」がカスタムフィールドのベースネームになります。
function mtSaveUser(f) {
// We can't reliably store the user cookie during a preview.
if (is_preview) return;
var u = mtGetUser();
if (f && (!u || u.is_anonymous)) {
if ( !u ) {
…中略…
}
if (f.customfield_cf != undefined) u.customfield_cf = f.customfield_cf.value;
if (f.author != undefined) u.name = f.author.value;
if (f.email != undefined) u.email = f.email.value;
if (f.url != undefined) u.url = f.url.value;
}
…後略…
コメント投稿フォームから取得したデータは、「u」という変数に任意の変数名、ここでは「customfield_cf」という名前で保存します。
2.2 mtBakeUserCookie()の変更
投稿者情報をクッキーに保存する関数mtBakeUserCookie()に、カスタムフィールドの値を保存する処理を追加します。
function mtBakeUserCookie(u) {
var str = "";
if (u.customfield_cf) str += "customfield_cf:'" + mtEscapeJS(u.customfield_cf) + "';";
if (u.name) str += "name:'" + mtEscapeJS(u.name) + "';";
…後略…
u.customfield_cfをクッキーに保存用フォーマットに整形し、変数strに設定します。シングルクォーテーションやダブルクォーテーションの記述位置に気をつけてください。
2.3 mtUnbakeUserCookie()の変更
クッキーから投稿者情報を取得する関数mtUnbakeUserCookie()に、カスタムフィールドデータを取得する処理を記述します。
【変更前】
function mtUnbakeUserCookie(s) {
if (!s) return;
var u = {};
var m;
while (m = s.match(/^((name|url|email|is_authenticated|profile|userpic|…後略…
…後略…
【変更後】
function mtUnbakeUserCookie(s) {
if (!s) return;
var u = {};
var m;
while (m = s.match(/^((customfield_cf|name|url|email|is_authenticated|profile|userpic|…後略…
…後略…
2.2項で設定したクッキー名「customfield_cf」をそのまま設定します。この記述をしておけば、mtUnbakeUserCookie()の処理でクッキーの値が変数uに収集されるようになっています。
2.4 mtUserOnLoad()の変更
ページロード時に実行される関数mtUserOnLoad()に、クッキーから読み出したカスタムフィールドの値を、コメント投稿フォーム反映用の変数に設定する処理を追加します。
function mtUserOnLoad() {
var u = mtGetUser();
…中略…
if (cf) {
if (u && u.is_anonymous) {
if (u.customfield_cf) cf.customfield_cf.value = u.customfield_cf;
if (u.email) cf.email.value = u.email;
if (u.name) cf.author.value = u.name;
if (u.url) cf.url.value = u.url;
…後略…
変数uに保存されているcustomfield_cfの値を、コメント投稿フォームに反映するときに利用する変数cf(comment formの略と思います)のcustomfield_cfに代入します。
3.複数のカスタムフィールドを保存する場合
複数のカスタムフィールドをクッキーに保存するには、2項の設定で、必要な分を同じように追加してください。2.1項であれば次のようになります。
function mtSaveUser(f) {
// We can't reliably store the user cookie during a preview.
if (is_preview) return;
var u = mtGetUser();
if (f && (!u || u.is_anonymous)) {
if ( !u ) {
…中略…
}
if (f.customfield_cf != undefined) u.customfield_cf = f.customfield_cf.value;
if (f.customfield_cf_2 != undefined) u.customfield_cf_2 = f.customfield_cf_2.value;
if (f.customfield_cf_3 != undefined) u.customfield_cf_3 = f.customfield_cf_3.value;
if (f.author != undefined) u.name = f.author.value;
if (f.email != undefined) u.email = f.email.value;
if (f.url != undefined) u.url = f.url.value;
}
…後略…
チェックボックス・ラジオボタン・セレクトボックスはデータの取得や設定はサンプル異なるかもしれません。通常のJavaScriptのお作法に従ってください。
コメントプレビューでカスタムフィールドの値を表示する
Movable Typeのコメントプレビュー画面でコメントのカスタムフィールドの値を引き継いで表示するカスタマイズを紹介します。
1.問題点
コメントのカスタムフィールドをコメント投稿フォームに表示する方法は次のようになっています。
<input type="hidden" name="blog_id" value="<MTBlogID>" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
<mt:CommentCustomFields>
<mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName$></mt:SetVarBlock>
<mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
<mt:SetVarBlock name="custom_field_id">profile_<$mt:CustomFieldName dirify="1"$></mt:SetVarBlock>
<$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name"$>
</mt:CommentCustomFields>
ただし、このサブテンプレートとコメントプレビューテンプレートに設定しても、ドロップダウンやラジオボタンなど、一部の形式のカスタムフィールドについては値が引き継がれないようです。
試しに、コメントカスタムフィールドのすべての種類を登録して、ブログ記事ページのコメントフォームとコメントプレビューのコメントフォームの表示を比較してみました。
ブログ記事ページのコメントフォーム

コメントプレビューのコメントフォーム

この結果、赤枠で括ったドロップダウンとラジオボタンの値が引き継がれていないことが分かりました。次項ではドロップダウンとラジオボタンの値を引き継ぐ対処方法を紹介します。
2.対処方法
まず、「CustomFieldExtensionTagsプラグイン」と「Splitプラグイン」をインストールしてください。
次に、コメントプレビューテンプレートのform要素の中に次のサブテンプレートを記述します。
<input type="hidden" name="blog_id" value="<MTBlogID>" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
ドロップダウンを表示したい場合、コメントプレビューテンプレートのform要素の中に次のサブテンプレートを記述します。
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="select">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<mt:CustomFieldOptions split="," setvar="selectdata" />
<select name="customfield_<mt:CustomFieldBasename />">
<mt:loop name="selectdata">
<mt:GetVar name="__value__" setvar="option_data" />
<option value="<mt:GetVar name="option_data" />"<mt:if tag="CommentCustomFieldValue" eq="$option_data"> selected="selected"</mt:if>><mt:GetVar name="option_data" /></option>
</mt:loop>
</select>
</mt:if>
</mt:CommentCustomFields>
ラジオボタンを表示したい場合、コメントプレビューテンプレートのform要素の中に次のサブテンプレートを記述します。
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="radio">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<mt:CustomFieldOptions split="," setvar="radiodata" />
<mt:loop name="radiodata">
<mt:GetVar name="__value__" setvar="option_data" />
<input type="radio" name="customfield_<mt:CustomFieldBasename />" value="<mt:GetVar name="option_data" />"<mt:if tag="CommentCustomFieldValue" eq="$option_data"> checked="checked"</mt:if> /><mt:GetVar name="option_data" /><br />
</mt:loop>
</mt:if>
</mt:CommentCustomFields>
3.複数のドロップダウンやラジオボタンを表示する方法
表示したいドロップダウンやラジオボタンが複数存在する場合は、前項のMTIfタグでMTCustomFieldTypeタグを判定している箇所を、MTCustomFieldBasenameタグやMTCustomFieldNameタグなど、一意になる値に置き換えて判定します。
例えば、表示したいドロップダウンのベースネームが「cf_6」の場合は、前述のサブテンプレートの2行目を次のように書き換えます(青色部分)。
<mt:CommentCustomFields>
<mt:if tag="CustomFieldBasename" eq="cf_6">
…中略…
なお、1項も含め、複数のカスタムフィールドを表示する場合は、一番外側にあるMTCommentCustomFieldsタグはひとつずつに与えるのではなく、すべてのカスタムフィールドを次のようにまとめてひと括りにしてください(青色部分)。
<mt:CommentCustomFields>
<mt:if tag="CustomFieldBasename" eq="cf_6">
…中略…
</mt:if>
<mt:if tag="CustomFieldType" eq="radio">
…中略…
</mt:if>
<mt:if tag="CustomFieldBasename" eq="cf_8">
…中略…
</mt:if>
</mt:CommentCustomFields>
4.他の種類を表示する方法
1項・2項の対処を行うことで必然的に他の種類もフォームを手作りすることになりますので、一通り掲載しておきます。
テキストの場合
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="text">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<input type="text" name="customfield_<mt:CustomFieldBasename />" id="customfield_<mt:CustomFieldBasename />" value="<mt:CommentCustomFieldValue>" />
</mt:if>
</mt:CommentCustomFields>
テキスト(複数行)の場合
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="textarea">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<textarea name="customfield_<mt:CustomFieldBasename />" id="customfield_<mt:CustomFieldBasename />"><mt:CommentCustomFieldValue></textarea>
</mt:if>
</mt:CommentCustomFields>
チェックボックスの場合
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="checkbox">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<input type="checkbox" name="customfield_<mt:CustomFieldBasename />" id="customfield_<mt:CustomFieldBasename />"<mt:if tag="CommentCustomFieldValue"> checked="checked"</mt:if> />
</mt:if>
</mt:CommentCustomFields>
URLの場合
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="url">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<input type="text" name="customfield_<mt:CustomFieldBasename />" id="customfield_<mt:CustomFieldBasename />" value="<mt:CommentCustomFieldValue>" />
</mt:if>
</mt:CommentCustomFields>
日付と時刻の場合
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="datetime">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<span class="date-time-fields">
<input type="text" name="d_customfield_<mt:CustomFieldBasename />" id="d_customfield_<mt:CustomFieldBasename />" value="<mt:CommentCustomFieldValue regex_replace="/^(\d+年\d+月\d+日).*$/","$1">" />
<input type="text" name="t_customfield_<mt:CustomFieldBasename />" id="t_customfield_<mt:CustomFieldBasename />" value="<mt:CommentCustomFieldValue regex_replace="/^.*\s(.*)$/","$1">" />
</span>
</mt:if>
</mt:CommentCustomFields>
オブジェクトの場合
<mt:CommentCustomFields>
<mt:if tag="CustomFieldType" eq="embed">
<label for="customfield_<mt:CustomFieldBasename />"><mt:CustomFieldName /></label>
<textarea name="customfield_<mt:CustomFieldBasename />" id="customfield_<mt:CustomFieldBasename />"><mt:CommentCustomFieldValue></textarea>
</mt:if>
</mt:CommentCustomFields>
Movable Typeのサインアップ画面に表示するカスタムフィールドの順序を並べ替える
Movable Typeのコミュニティ機能で、サインアップ画面に表示するカスタムフィールドの順序を並べ替えるカスタマイズです。
下は、「地域」「年齢」「趣味」という3つのカスタムフィールドを追加した後のサインアップ画面で、デフォルトはこのような順番で並んでいます。
これを次のように「年齢」「地域」「趣味」の順番に並べ替えます。
1.基本
サインアップ画面にカスタムフィールドの情報を追加するには、システム管理画面で「ユーザー」カスタムフィールドを追加するだけです。

追加したカスタムフィールドは自動的にサインアップ画面に追加表示されます。ただし、デフォルトのサインアップ画面ではカスタムフィールドの表示順序を並べ替えることはできません。
2.カスタマイズ
サインアップ画面に対応する、グローバルテンプレートの「登録フォーム」システムテンプレートを次のように変更します。
変更前
…前略…
<mt:Loop name="field_loop">
<mt:If name="__first__">
<input type="hidden" name="_type" value="author" id="obj_type" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
</mt:If>
<!-- start-customfield_<$mt:Var name="basename"$> -->
<mt:App:Setting
id="$field_id"
label="$name"
hint="$description"
shown="$show_field"
show_hint="$show_hint"
required="$required">
<$mt:Var name="field_html"$>
</mt:App:Setting>
<!-- end-customfield_<$mt:Var name="basename"$> -->
</mt:Loop>
…後略…
変更後(青色部分を赤色に入れ替え)
…前略…
<mt:Loop name="field_loop">
<mt:if name="basename" eq="cf_3">
<mt:SetVar name="index" value="0" />
<mt:elseif name="basename" eq="cf_1">
<mt:SetVar name="index" value="1" />
<mt:elseif name="basename" eq="cf_2">
<mt:SetVar name="index" value="2" />
</mt:if>
<mt:SetVarBlock name="list" index="$index">
<mt:App:Setting
id="$field_id"
label="$name"
hint="$description"
shown="$show_field"
show_hint="$show_hint"
required="$required">
<$mt:Var name="field_html"$>
</mt:App:Setting>
</mt:SetVarBlock>
</mt:Loop>
<mt:Loop name="list">
<mt:If name="__first__">
<input type="hidden" name="_type" value="author" id="obj_type" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
</mt:If>
<mt:var name="__value__" />
</mt:Loop>
…後略…
変更後のテンプレートの2行目~7行目にあるMTIf文の部分は利用している環境によって変更が必要で、この部分でカスタムフィールドの順番を決めています。MTIfタグあるいはMTElseifタグのeqモディファイアにカスタムフィールドのベースネーム、次の行にあるMTSetVarタグのindexモディファイアに表示したい順番を設定します。一番最初に表示したいカスタムフィールドのindexモディファイアには「0」を設定します。
<mt:if name="basename" eq="cf_3">
<mt:SetVar name="index" value="0" />
<mt:elseif name="basename" eq="cf_1">
<mt:SetVar name="index" value="1" />
<mt:elseif name="basename" eq="cf_2">
<mt:SetVar name="index" value="2" />
</mt:if>
この例では、ベースネーム「cf_3」のカスタムフィールドが1番、ベースネーム「cf_1」のカスタムフィールドが2番、ベースネーム「cf_2」のカスタムフィールドが3番に表示されます。
フィールドが3つ以上ある場合は、MTElseifタグとMTSetVarタグのペアを必要な分だけ足してください。なお、表示したいカスタムフィールドはすべて記述する必要があります。
3.ブログ記事作成画面のカスタムフィールドの並び替え
コミュニティブログやコミュニティ掲示板でのブログ記事作成画面のカスタムフィールドの並び替えにも応用できますが、よりよい方法は「Movable Type 5 プロフェッショナルガイド」の16章に掲載しています。宣伝でした。
コメント用カスタムフィールドの投稿フォームのカスタマイズ(その2)
「コメント用カスタムフィールドの投稿フォームのカスタマイズ(その1)」の続きです。
Includeタグで呼び出しているフォームフィールド(グローバルテンプレート)の内容は、次の通りです。
<div id="<$mt:Var name="id"$>-field" class="field-top-label field pkg <$mt:Var name="class"$>">
<div class="field-inner">
<div class="field-header">
<label type="text" id="<$mt:Var name="id"$>-label" for="<$mt:Var name="id"$>"><$mt:Var name="label"$><mt:If name="required"> *</mt:If></label>
</div>
<div class="field-content ">
<$mt:Var name="field-content"$>
</div>
</div>
</div>
この中で、変数requiredを判定しています(青色部分)が、テンプレートタグリファレンスのMTCommentCustomFieldsでは、コメント投稿フォームへのカスタムフィールドの設定に変数requiredが引き継がれていません(下)。
<input type="hidden" name="blog_id" value="<MTBlogID>" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
<mt:CommentCustomFields>
<mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName$></mt:SetVarBlock>
<mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
<mt:SetVarBlock name="custom_field_id">profile_<$mt:CustomFieldName dirify="1"$></mt:SetVarBlock>
<$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name"$>
</mt:CommentCustomFields>
変数requiredを引き継ぐには、「コメント用カスタムフィールドの投稿フォームのカスタマイズ(その1)」の修正後のサブテンプレートに、青色の変更を加えると良いでしょう。
<input type="hidden" name="blog_id" value="<MTBlogID>" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
<mt:CommentCustomFields>
<mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName$></mt:SetVarBlock>
<mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
<mt:SetVarBlock name="custom_field_id">customfield_<$mt:CustomFieldBasename$></mt:SetVarBlock>
<mt:SetVarBlock name="required"><mt:CustomFieldIsRequired>1<mt:Else>0</mt:CustomFieldIsRequired></mt:SetVarBlock>
<$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name"$>
</mt:CommentCustomFields>
コメント用カスタムフィールドの投稿フォームのカスタマイズ(その1)
Movable Typeの、コメント用カスタムフィールドの投稿フォームのカスタマイズについてのTipsです。
テンプレートタグリファレンスのMTCommentCustomFieldsでは、コメント投稿フォームへのカスタムフィールドを、次のように設定するよう解説しています。
<input type="hidden" name="blog_id" value="<MTBlogID>" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
<mt:CommentCustomFields>
<mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName$></mt:SetVarBlock>
<mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
<mt:SetVarBlock name="custom_field_id">profile_<$mt:CustomFieldName dirify="1"$></mt:SetVarBlock>
<$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name"$>
</mt:CommentCustomFields>
Includeタグで呼び出しているフォームフィールド(グローバルテンプレート)の内容は、次の通りです。
<div id="<$mt:Var name="id"$>-field" class="field-top-label field pkg <$mt:Var name="class"$>">
<div class="field-inner">
<div class="field-header">
<label type="text" id="<$mt:Var name="id"$>-label" for="<$mt:Var name="id"$>"><$mt:Var name="label"$><mt:If name="required"> *</mt:If></label>
</div>
<div class="field-content ">
<$mt:Var name="field-content"$>
</div>
</div>
</div>
変数custom_field_idの値は、「"profile_"+CustomFieldNameタグの内容」となっており(1つめのリストの赤色部分)、フォームフィールドでは変数idとして扱われ、label要素のfor属性値として使われます(2つめのリストの青色部分)。
ただし、変数field-content(CustomFieldHTMLタグの内容)で展開されるid属性は、次のように「"customfield_"+ベースネーム」となるので、
…前略…
<div class="field-content ">
<input type="text" name="customfield_cf_1" id="customfield_cf_1" value="" class="full-width ti" />
</div>
…後略…
変数custom_field_idの値は、「"customfield_"+ベースネーム」としておけば、label要素のfor属性が本来の動作が可能になります(青色部分)。
<input type="hidden" name="blog_id" value="<MTBlogID>" />
<input type="hidden" name="customfield_beacon" value="1" id="customfield_beacon" />
<mt:CommentCustomFields>
<mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName$></mt:SetVarBlock>
<mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
<mt:SetVarBlock name="custom_field_id">customfield_<$mt:CustomFieldBasename$></mt:SetVarBlock>
<$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name"$>
</mt:CommentCustomFields>
つまり、label要素のテキストをクリックしたとき、label要素のfor属性で指定したid属性のフォームがアクティブになります。
分かりにくい説明ですいませんが以上です。
コマーシャルパックで利用する管理画面の代替テンプレートパス(その2)
「コマーシャルパックで利用する管理画面の代替テンプレートパス(その1)」の続きです。
カスタムフィールドの一覧を表示するlist_field.tmplは、代替テンプレートに配置したファイルを正常に取得しないようです。
原因は、Community.pack::lib::MT::Community::list_fieldのテンプレート取得処理で、テンプレートファイルのパスを直接指定している(下記赤色部分)ためと思われます。
sub list_field {
my ($app) = @_;
my $plugin = $app->component('Commercial');
my $q = $app->param;
…中略…
return $app->listing({
terms => {
$blog_id ? ( blog_id => [ $blog_id, 0 ] ) : ()
},
args => { sort => 'name', 'direction' => 'ascend' },
no_limit => 1,
type => 'field',
code => $hasher,
template => File::Spec->catdir($plugin->path,'tmpl','list_field.tmpl'),
params => {
($blog_id ? (
blog_id => [ $blog_id, 0 ],
edit_blog_id => $blog_id,
) : ( system_overview => 1 )),
list_noncron => 1,
saved_deleted => $q->param('saved_deleted') || 0,
saved => $q->param('saved') || 0,
obj_types_loop => \@customfield_objs,
cfg_customfield => 1,
search_type => 'entry',
},
});
}
赤色部分を次のように修正すれば、代替テンプレートが取得できるようになります。
sub list_field {
my ($app) = @_;
my $plugin = $app->component('Commercial');
my $q = $app->param;
…中略…
return $app->listing({
terms => {
$blog_id ? ( blog_id => [ $blog_id, 0 ] ) : ()
},
args => { sort => 'name', 'direction' => 'ascend' },
no_limit => 1,
type => 'field',
code => $hasher,
template => 'list_field.tmpl',
params => {
($blog_id ? (
blog_id => [ $blog_id, 0 ],
edit_blog_id => $blog_id,
) : ( system_overview => 1 )),
list_noncron => 1,
saved_deleted => $q->param('saved_deleted') || 0,
saved => $q->param('saved') || 0,
obj_types_loop => \@customfield_objs,
cfg_customfield => 1,
search_type => 'entry',
},
});
}
特定のカスタムフィールドの情報を出力する(その2)
「特定のカスタムフィールドの情報を出力する」で、Movable Typeの特定のカスタムフィールドの情報を出力する方法を紹介しましたが、デフォルトで用意されているモディファイアがありましたので、本エントリーでは「その2」ということで紹介します。
1.includeモディファイアを使用する
MTXXCustomFieldsタグにincludeモディファイアを設定し、モディファイアの値にカスタムフィールドの名前を設定します。
<mt:Entries>
<mt:EntryCustomFields include="価格">
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:EntryCustomFields>
</mt:Entries>
複数のフィールドを対象にする場合は、モディファイアに設定した値をカンマで区切ります。
<mt:Entries>
<mt:EntryCustomFields include="価格,サイズ">
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:EntryCustomFields>
</mt:Entries>
2.excludeモディファイアを使用する
MTXXCustomFieldsタグにexcludeモディファイアを設定し、モディファイアの値にカスタムフィールドの名前を設定します。こちらは公式ドキュメントに掲載されています。
<mt:Entries>
<mt:EntryCustomFields exclude="価格">
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:EntryCustomFields>
</mt:Entries>
複数のフィールドを対象にする場合は、モディファイアに設定した値をカンマで区切ります。
<mt:Entries>
<mt:EntryCustomFields exclude="価格,サイズ">
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:EntryCustomFields>
</mt:Entries>
特定のカスタムフィールドの情報を出力する
Movable Typeで特定のカスタムフィールドの情報を出力するためのカスタマイズを紹介します。
ここではブログ記事に複数追加したカスタムフィールドから、次のように定義した「価格」カスタムフィールドの名前と値を出力する例で説明します。
- テンプレートタグ名:MTEntryProductPrice
- ベースネーム:cf_1
1.基本
あるシステムオブジェクト(ここではブログ記事)に複数のカスタムフィールドの情報を出力するには、MTEntryCustomFieldsタグを利用し、タグブロック内でMTCustomFieldXXタグを記述します。
<mt:Entries>
<mt:EntryCustomFields>
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:EntryCustomFields>
</mt:Entries>
ただし、この場合、ブログ記事に登録されているすべてのカスタムフィールドの情報が出力されてしまいます。
2.特定のカスタムフィールドの情報を出力する
特定のカスタムフィールドの情報を出力するには、MTEntryCustomFieldsタグブロック内で、MTIfタグを使ってMTCustomFieldBasenameタグを判定する方法があります。
<mt:Entries>
<mt:EntryCustomFields>
<mt:If tag="CustomFieldBasename" eq="cf_1">
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:If>
</mt:EntryCustomFields>
</mt:Entries>
MTCustomFieldValueタグは、MTEntryProductPriceタグでもOKです。
<mt:Entries>
<mt:EntryCustomFields>
<mt:If tag="CustomFieldBasename" eq="cf_1">
<mt:CustomFieldName />
<mt:MTEntryProductPrice />
</mt:If>
</mt:EntryCustomFields>
</mt:Entries>
もう少しきちんと書くのであれば、MTEntryProductPriceタグの値があることも判定します。
<mt:Entries>
<mt:EntryCustomFields>
<mt:If tag="CustomFieldBasename" eq="cf_1">
<mt:If tag="EntryProductPrice">
<mt:CustomFieldName />
<mt:MTEntryProductPrice />
</mt:If>
</mt:If>
</mt:EntryCustomFields>
</mt:Entries>
「CustomFieldExtensionTags プラグイン」を利用すれば、テンプレートタグ名でも判定できるようになります。
<mt:Entries>
<mt:EntryCustomFields>
<mt:If tag="CustomFieldTag" eq="EntryProductPrice">
<mt:If tag="EntryProductPrice">
<mt:CustomFieldName />
<mt:MTEntryProductPrice />
</mt:If>
</mt:If>
</mt:EntryCustomFields>
</mt:Entries>
3.失敗例
次のように、カスタムフィールドのテンプレートタグを判定する方法ではうまくいきません。
<mt:Entries>
<mt:EntryCustomFields>
<mt:If tag="EntryProductPrice">
<mt:CustomFieldName />
<mt:CustomFieldValue />
</mt:If>
</mt:EntryCustomFields>
</mt:Entries>
CustomFieldAssetDetailsHandler プラグイン v0.20
Movable Type 4.2 向けに公開していた、画像のカスタムフィールドでオプション画面を表示する「VisibleCustomFieldImage プラグイン 0.10」を、Movable Type 5対応にしました。プラグイン名も「CustomFieldAssetDetailsHandler」に変更しました。
このプラグインを用いることで、Movable Type 5のカスタムフィールドに画像を選択した場合にスキップされてしまう、アイテムの情報入力画面をハンドリングできます(下)。

なお、「ブログ記事に画像を表示」「サムネイルを利用」「ポップアップウィンドウ~」の項目は入力しても効果はありません(本文・追記のテキストエリアにカーソルをあてている状態で有効となるため)
1.価格
CustomFieldAssetDetailsHandlerプラグインの価格は次の通りです。
- 有償ライセンスによる商用利用:1050円/1サーバ
- 個人ライセンス(無償)/有償ライセンスによる非商用利用/Movable Type Open Source:無償
有償でご利用の場合、プラグインの動作確認後、下記のPayPalの「今すぐ購入」をクリックして、指定の金額をお支払いください。銀行振り込みをご希望の場合はお問い合わせからご連絡ください。折り返し振り込み口座をご連絡致します。
無償でご利用の場合も、プラグイン開発やサポート等にご支援・ご賛同くださる方からの寄付をお待ち申し上げます。下記の「寄付」のリンクをクリックすると Paypal によるお支払いページにジャンプします。
2.プラグインのダウンロード
下記のリンクをクリックしてプラグインをダウンロードします。
3.プラグインのアップロード
ダウンロードした CustomFieldAssetDetailsHandler_0_20.zip を解凍して、中にある CustomFieldAssetDetailsHandlerフォルダを plugins ディレクトリにアップロードします。システム管理画面のプラグイン一覧に「CustomFieldAssetDetailsHandler~」が表示されればOKです。

4.使い方
予め作成している、画像用カスタムフィールドの「imageを選択」をクリック。

「新しい画像をアップロード」をクリック(またはアップロード済の画像を選択して「次へ」をクリック)。

新しい画像をアップロードする場合は「参照」をクリック。

アップロードしたい画像選択後、「アップロード」をクリック。

オプション画面が表示されます(これが本プラグインの機能)。
機能はファイルアップロードのオプション画面と同じですが一応掲載しておきます。

- 名前:アイテムの名前を入力します。
- 説明:アイテムの説明を入力します。
- タグ:アイテムのタグを入力します。
「完了」をクリックすると、Movable Type の標準機能でサムネイル画像が管理画面に表示されます。なお、「ブログ記事に画像を表示」「サムネイルを利用」「ポップアップウィンドウ~」の項目は入力しても効果はありません(本文・追記のテキストエリアにカーソルをあてている状態で有効となるため)。

ブログ記事を投稿すると、予めテンプレートに設定していたカスタムフィールドのテンプレートタグ部分にサムネイル画像が表示されます。

5.注意事項
オプション画面下の「画像を記事/ページに表示」をチェックして「サムネイルを利用」や「ポップアップ~」にチェックをつけると、サムネイル画像やポップアップが生成されて、アイテムとして管理対象になります。
ただし、これらを表示するための(X)HTMLマークアップが本文・追記フィールドに埋め込まれていないため、これらのアイテムは基本的に利用できません。

利用したい場合は、本文に次のような(X)HTMLマークアップを埋め込んでください。次の例はサムネイルとポップアップファイルを組み合わせたものです。
<a href="http://user-domain/assets_c/yyyy/mm/finename-asset_id.html"
onclick="window.open('http://user-domain/assets_c/yyyy/mm/finename-asset_id.html','popup','width=asset_width,height=asset_height,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false">
<img src="http://user-domain/assets_c/yyyy/mm/thumbnail" width="thumbnail_width" height="thumbnail_height" alt="asset_label" class="mt-image-none" style="" />
</a>
赤色部分は次の内容に書き換えてください。
- user-domain:サイトURL
- yyyy:アイテムをアップロードした年
- mm:アイテムをアップロードした月
- asset_id:アイテムID
- finename:アイテムのファイル名(拡張子なし)
- thumbnail:アイテムのサムネイルファイル名
- asset_width:アイテムの幅
- asset_height:アイテムの高さ
- asset_label:アイテムの名前
- thumbnail_width:サムネイルの幅
- thumbnail_height:サムネイルの高さ
mt-csv2customfields v0.03
CSV形式のデータを Movable Type のブログ記事およびカスタムフィールドに一括読み込みさせるスクリプト mt-csv2customfields.cgi をバージョンアップしました。
追加機能は次の通りです。
- コメント受信設定とトラックバック受信設定に対応
- 出力ファイル名(ベースネーム)の設定に対応
最新版のダウンロードと使用方法は以下の記事を参照願います。なお、本スクリプトは MT5.0 で正常に動作することを確認しています。
Movable Type 5.0 のカスタムフィールドをカテゴリで振り分ける
Movable Type 5.0 では、ブログ記事投稿画面に表示するカスタムフィールドを、カテゴリで振り分けることができるようになりました。
一言で説明するのは難しいので、まず概要を図で説明します。
まず、ブログ記事用のカスタムフィールドをいくつか作成したと仮定します。カスタムフィールド作成後、カスタムフィールドとカテゴリをひもづけます。この図では、次のようにひもづけます。
- カスタムフィールドA:趣味、日記
- カスタムフィールドB:趣味、日記
- カスタムフィールドC:趣味、旅行

このひもづけを行うことで、ブログ記事投稿画面でカテゴリを選択した際、カテゴリごとに表示するカスタムフィールドを切り替えることができます。
- カテゴリから「趣味」を選択:カスタムフィールドA~Cを表示
- カテゴリから「日記」を選択:カスタムフィールドCを表示
- カテゴリから「旅行」を選択:カスタムフィールドA、Bを表示

実際の画面では次のようになります。
「趣味」選択時のカスタムフィールド
「旅行」選択時のカスタムフィールド
「日記」選択時のカスタムフィールド
複数選択しても適正に動作するようです。
2009.11.02 追記
ブログ記事のカスタムフィールドを追加すると、カテゴリ編集画面に「カスタムフィールド」というフィールドが追加され、追加したカスタムフィールドがすべて表示されます。
カスタムフィールド編集画面でひもづけたいカテゴリにチェックをすると、カテゴリ編集画面の「カスタムフィールド」に表示されたカスタムフィールドがチェックされた状態になります。
この状態であれば、本エントリーの動作になりますが、カテゴリ編集画面の「カスタムフィールド」に表示されたカスタムフィールドのチェックを外すと、ブログ記事編集画面で該当のカテゴリを選択しても、フィールドは表示されません。
ただし、上記の操作に関係なく、ブログ記事の「表示オプション」を使った表示・非表示の制御も行なえます。
カスタムフィールドの入力文字数が改善
軽ネタです。
以前、エントリーした、「カスタムフィールドの入力文字数の制限を変更する」ですが、いつのまにかオプションフィールド用のテーブルの型が mediumtext に変更されていました。

したがって、私の勘違い(いつのまにか自分で変更したとか)でなければ、4.15 以降で「カスタムフィールドの入力文字数の制限を変更する」の対処は不要です。
MT4.15ベータ2/MTOS 4.15 ベータ5Bリリースとカスタムフィールドによるブログ記事の並べ替え
MTOS 4.15 ベータ5がリリースされました。
カスタムフィールド関係で機能追加が行われ、カスタムフィールドの値を利用して記事の並べ替えやフィルタリングができるようになっています。
並べ替えは、MTForタグを使えば同じ動作を実現できますが、より簡単にできるようになりました。
1.項目の並べ替え
カスタムフィールドで、ブログ記事に対し、次のような「おすすめ度」というラジオボタンのフィールドを作成します。

各ブログ記事に「おすすめ度」を設定します。

カスタムフィールドを設定ブログ記事を作ります。デフォルトテンプレートでは次のように時系列順で並んでいます。

ブログ記事をおすすめ度順に並べ替えるには、MTEntriesタグに次のsort_byモディファイアを追加します。
<MTEntries sort_by="field:recommend">
:
</MTEntries>
recommendは、カスタムフィールドのベースネームです(テンプレートタグ名ではありません)。
これで降順に表示されるようになりました。

昇順に並べ替えるには、さらにsort_orderモディファイアを追加して次のようにします。
<MTEntries sort_by="field:recommend" sort_order="ascend">
:
</MTEntries>
これで昇順に表示されます。

2.項目のフィルタリング
1項で作成したブログ記事から「おすすめ度2」の記事だけをフィルタリングするには、次のように「field:ベースネーム」モディファイアを設定します。
<MTEntries field:recommend="2">
:
</MTEntries>
これで、「おすすめ度2」の記事だけをフィルタリングして表示します。

mt-csv2customfields v0.02
CSV形式のデータを Movable Type のカスタムフィールドに一括読み込みさせるスクリプト mt-csv2customfields.cgi をバージョンアップしました。
追加機能は次の通りです。
- CSVデータにカテゴリー名(またはサブカテゴリー名)が設定可能
- カテゴリー名が存在しない場合、トップカテゴリーとして新規作成
- CSVデータにタグが設定可能
- タグの複数指定が可能
- 既存のブログ記事タイトルを指定した場合、カスタムフィールドの内容を上書き
最新版のダウンロードと使用方法は以下の記事を参照願います。
カテゴリーリストにカスタムフィールドの画像を表示する
Movable Type のカテゴリーリストに、カスタムフィールドの画像を表示するカスタマイズです。
次のように、カテゴリー別の画像を簡単に与えることができます。

1.カスタムフィールドの作成
カテゴリーにカスタムフィールドを作成します。ここでは CategoryImage という名前のテンプレートタグにします。

2.カテゴリーに画像の追加
各カテゴリーに表示されている「Imageを選択」をクリックして、画像を追加します。

画像を選択した後、必ず保存をクリックしてください。何回か試して正常に表示されないことがあったのですが、どうも保存をクリックするのを忘れていたようです。

3.サブテンプレートの追加
冒頭のサンプルは、デフォルトテンプレートのサイドバーに下記のサブテンプレートを追加しました。階層表示でない、MTCategories タグを久しぶりに使ってみました。
青色部分がカスタムフィールド用タグです。
<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header">カテゴリ</h3>
<div class="widget-content">
<ul class="widget-list">
<mt:Categories>
<mt:ifNonZero tag="mt:CategoryCount">
<li class="widget-list-item"><MTCategoryImageAsset><img src="<$MTAssetURL$>" style="vertical-align:middle" /> </MTCategoryImageAsset><a href="<$mt:CategoryArchiveLink$>"<mt:IfNonEmpty tag="mt:CategoryDescription"> title="<$mt:CategoryDescription$>"</mt:IfNonEmpty>><$mt:CategoryLabel$> (<$mt:CategoryCount$>)</a>
<mt:else>
<li class="widget-list-item"><MTCategoryImageAsset><img src="<$MTAssetURL$>" style="vertical-align:middle" /> </MTCategoryImageAsset><$mt:CategoryLabel$>
</mt:ifNonZero>
</li>
</mt:Categories>
</ul>
</div>
</div>
</mt:IfArchiveTypeEnabled>
赤色部分は、画像の垂直方向の位置揃えのための style 属性です。サンプルでは img 要素に直接与えてしまっているので、適宜スタイルシートで設定するようにしてください。
mt-csv2customfields
「CSV形式のデータを Movable Type のカスタムフィールドに一括読み込みさせたい」という要望がかなり多いようなので、スクリプト mt-csv2customfields.cgi を作成しました。
CSVファイルを読み込み、新規ブログ記事のカスタムフィールドに登録します。
2011.07.11 より高機能なプラグイン「CSVDataImExporter」をリリースしました。
1.機能
今のところできるのは次の通りです。
- 新規ブログ記事のみ対応
- タイトルの書き込み
- 本文の書き込み
- カテゴリーまたはサブカテゴリーの書き込み。カテゴリーが存在しない場合は新規作成(トップレベルのみ)
- タグの書き込み(複数設定可能)
- 出力ファイル名の書き込み
- コメント受信設定・トラックバック受信設定の書き込み
- カスタムフィールド(テキスト形式)の書き込み
- 複数のカスタムフィールドに対応
- 既存のブログ記事タイトルを指定した場合、カスタムフィールドのみ上書き(他のフィールドの内容は無視)
CSVのフォーマット
CSVデータは次のフォーマットにしてください。
1行目:
タイトル:'title'を設定
本文:'text'を設定
カテゴリー:'category'を設定
タグ:'tags'を設定
出力ファイル名:'basename'を設定
コメント受信設定:'allow_comments'を設定(0:非許容/1:許容)
トラックバック受信設定:'allow_pings'を設定(0:非許容/1:許容)
カスタムフィールド:カスタムフィールドのベースネームを設定
2行目以降:フィールドに対応したデータ。
カテゴリーは新規のトップカテゴリー(他と重複しない名称)または既存のカテゴリー名(サブカテゴリーであればサブカテゴリー名のみ設定)。
タグは新規のタグも大丈夫で、":"で区切れば複数設定できます。
なお、CSVデータはUTF-8のものしか確認ができておりません。
3.CSVデータのサンプル
title,text,category,tags,basename,allow_comments,allow_pings,test1,test2,test3
たいとる1,てきすとの内容1,カテゴリー1,タグ1:タグ2,aaa,1,1,カスタムフィールド1の内容1,カスタムフィールド2の内容1,カスタムフィールド3の内容1
たいとる2,てきすとの内容2,カテゴリー2,タグ3:タグ4,bbb,0,0,カスタムフィールド1の内容2,カスタムフィールド2の内容2,カスタムフィールド3の内容2
たいとる3,てきすとの内容3,カテゴリー3,タグ5:タグ6,ccc,1,0,カスタムフィールド1の内容3,カスタムフィールド2の内容3,カスタムフィールド3の内容3
4.ライセンス
4.1 商用ライセンスの Movable Type で利用する場合
商用ライセンスの Movable Type で利用する場合は、有償(3000円/1サーバ)とさせて頂きます。お振込み方法につきましては、お問い合わせよりメールにてご連絡ください。
以下のPaypalからもご利用頂けます。
4.2 個人ライセンス(無償)と組み合わせる場合
個人ライセンス(無償)と組み合わせる場合は、無償でご利用ください。
5.インストール
下記のファイルをダウンロードして、展開した中にあるmt-csv2customfields.cgi をアプリケーションディレクトリにアップロードし、CGIが実行可能なパーミッションを変更してください。
たいしたスクリプトではありません。α版ということでお試しください。
修正履歴
v0.01 2008.03.24 初版
v0.02 2008.04.21 カテゴリーとタグに対応。head / body 要素の重複削除
v0.03 2009.11.17 出力ファイル名、コメント受信設定、トラックバック受信設定に対応
6.利用方法
ブラウザから mt-csv2customfields.cgi にアクセスすると、次のような画面が表示されるので、ブログのID、ユーザーIDを数字で設定し、CSVファイルを選択して送信をクリックしてください。

正常に実行できれば次のような画面が表示されます。

登録後のブログ記事編集画面です。

カスタムフィールドのテキストエリアに入力した改行をページに反映させる
Movable Type のカスタムフィールドで「テキスト(複数行)」という種類のフィールドを利用する際、テキストエリアへの入力内容に改行や空行を含めても、出力される文字列の改行や空行はすべて除去された状態で出力されてしまいます。
本エントリーでは、この事象を解消する方法を紹介します。
1.問題点
例えば、次のようなカスタムフィールドを作成します。テンプレートタグはとりあえず「EntryData」としておきます。

作成したフィールドで、次のようなテキストを入力します。

このカスタムフィールドを出力する「ブログ記事の概要」のサブテンプレートは次のようにします。
:
<div class="asset-body">
<$MTEntryBody$>
<MTIfNonEmpty tag="EntryData">
<$MTEntryData$>
</MTIfNonEmpty>
</div>
:
このテンプレートで出力されるカスタムフィールドの内容には、ご覧の通り、改行が含まれません。

2.対処方法
改行を含めるには、グローバルモディファイアである、filter モディファイアをカスタムフィールドに適用します。
:
<div class="asset-body">
<$MTEntryBody$>
<MTIfNonEmpty tag="EntryData">
<$MTEntryData filters="__default__"$>
</MTIfNonEmpty>
</div>
:
値に設定されている __default__ は、テキストフィルタとして定義されている予約変数(厳密にはMT::Util::html_text_transformをハンドリングするためのキー名)です。
このように設定することで、カスタムフォールドの出力結果に改行(br 要素や p 要素)が反映されます。

もう少し厳密に言えば、ブログ記事やウェブページの本文・追記のフォーマットで「改行を変換」を選択したものと同じ結果で出力されます。
3.参考記事
カスタムフィールドの入力文字数の制限を変更する
カスタムフィールドの入力文字数の制限を変更する方法を紹介します。
この問題は Movable Type 4.2 で改善されています。
作成したカスタムフィールドに大量の文字を入力した場合、文字数の制限にひっかかる場合があります。文字数の制限を変更すれば作成したカスタムフィールドに希望するだけの文字を入力できるようになります。
これは下記のトラックバックに触発されて書いたものです。ありがとうございました。
ということで、本エントリーにて紹介させて致します。
1.問題点
サンプルとして、トラックバック元記事と同じ、都道府県を選択するラジオボタンをブログ記事に設置したケースで話を進めます。
次のように、新しく作成したカスタムフィールドに、47都道府県をラジオボタンの選択項目として入力します。
が、ブログ記事投稿画面を表示させると、追加した都道府県がすべて表示されません。
これはオプションフィールド用のテーブルの型が varchar(255) となっており、255文字以上の入力が切り捨てられるためです。
2.対処方法
phpMyAdmin を使って、オプションフィールド用のテーブルの型を変更します。
該当のデータベースを表示します。
mt_field の「構造」のアイコンをクリックします。
field_options の「変更」のアイコンをクリックします。
テーブルの変更画面が表示されます。
「種別」を VARCHAR から TEXT に変更し、「長さ/値」を空にします。変更後、右側にある「保存する」をクリックします。
カスタムフィールドのオプション欄を入力し直して(表示されていない部分は保存されていないので)、「保存」をクリックします。
再度、ブログ記事投稿画面を表示します。カスタムフィールドのオプションがすべて表示されるようになりました。
ちなみに、MySQL の文字データには次のようなものがあります。
- varchar型:最大255文字
- text型:最大65535文字
- mediumtext型:最大16777215文字
- longtext型:最大4294967295文字
3.おまけ
都道府県一覧です。カスタムフィールドの入力にお使いください(間違ってたらすいません)。
北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,東京都,神奈川県,埼玉県,千葉県,茨城県,栃木県,群馬県,山梨県,新潟県,長野県,富山県,石川県,福井県,愛知県,岐阜県,静岡県,三重県,大阪府,兵庫県,京都府,滋賀県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県
カスタムフィールドでアップロードした画像をテンプレートタグで表示する
Movable Type 4.1 で追加されたカスタムフィールド機能で、画像(アイテム)をアップロードすると、記事中にはテキストリンクしか表示されないため「なんとかならないでしょうか?」というコメントを多く頂いてます。
その関係で、先日「カスタムフィールドによるアップロード画像をサムネイルで表示するプラグイン VisibleCustomFieldImage」を公開しましたが、Movable Type の公式サイトにテキストリンクではなく、画像を表示する方法が掲載されています。
この方法を使えば、より簡単に画像を表示することができます。
ということで、本エントリーにて具体的な設定方法を情報展開しておきます。
サンプルとして、次のようなカスタムフィールドを作成します。

ブログ記事に表示されたカスタムフィールドを使って、次の画像をアップロードします。

テンプレートモジュール「ブログ記事の概要」に、次のタグを設定します。
<MTIfNonEmpty tag="photo">
<MTphotoAsset><img src="<$MTAssetURL$>" /></MTphotoAsset>
</MTIfNonEmpty>
カスタムフィールドの作成時に指定したテンプレートタグの末尾に「Asset」を追加したテンプレートタグ名がブロックタグとして使えます。サンプルでは、「MTphoto」というタグを作ったので「MTphotoAsset」となります。
そして、このブロックタグの中では、Movable Type 標準のアイテム関連タグが利用できます。
上のタグをテンプレートモジュールの次の位置に設定します。

「てすと」というタイトルで投稿すると、次のように表示されました。
次に、MTAssetThumbnailLink タグでサムネイル指定をしてみます。
<MTIfNonEmpty tag="photo">
<MTphotoAsset><$MTAssetThumbnailLink width="150"$></MTphotoAsset>
</MTIfNonEmpty>
上のタグをテンプレートモジュールの次の位置に設定します。

「てすと」というタイトルで投稿すると、次のようにサムネイルが表示されました。
Movable Type 4.1 カスタムフィールドのデータの実体
先日、「Movable Type カスタムフィールドの DB スキーマ」というエントリーを投稿しましたが、「実体がどこにあるか分かりません」という質問を頂きましたので、本エントリーにて紹介致します。
ブログ記事/ウェブページの場合
テーブル名:mt_entry
| フィールド | フィールドの意味 | 値 | 値の意味 |
|---|---|---|---|
| entry_class | クラス | ブログ記事:entry ウェブページ:page | |
| entry_meta | カスタムフィールドデータ | BLOB型(バイナリ) |
カテゴリー/フォルダの場合
テーブル名:mt_plugindata
| フィールド | フィールドの意味 | 値 | 値の意味 |
|---|---|---|---|
| plugindata_id | プラグインデータID | 1,2… | 自動付与 |
| plugindata_data | カスタムフィールドデータ | BLOB型(バイナリ) | |
| plugindata_key | システムオブジェクトのキー情報 | ”category_1" "folder_3"等 | システムオブジェクト+ID |
| plugindata_plugin | プラグイン名 | "CustomFields"固定 |
ということで、カスタムフィールドに設定されたデータは BLOB 型で保存されるので、phpMyAdmin ではそのまま参照することはできません。
カテゴリー/フォルダの場合は次のような感じです。

参考までに、phpMyAdmin での2つのテーブル構造のスクリーンショットも載せておきます。
mt_entry
mt_plugindata
Movable Type カスタムフィールドの DB スキーマ
Movable Type 4.1 のカスタムフィールドの DB スキーマについてご質問を頂きましたので、本エントリーにて示します。
テーブル名:mt_field
| フィールド | フィールドの意味 (対応する項目) | 値 | 値の意味 (対応する項目) |
|---|---|---|---|
| field_id | mt_field内でユニークなID | 1,2... | 自動付与 |
| field_basename | ベースネーム | 名前が英数字であればそのまま利用、全角の場合は_1,_2... | |
| field_blog_id | カスタムフィールドを利用するブログID | ||
| field_default | 既定値 | ||
| field_description | 説明 | ||
| field_name | 名前 | ||
| field_obj_type | システムオブジェクト | entry | ブログ記事 |
| page | ウェブページ | ||
| category | カテゴリ | ||
| folder | フォルダ | ||
| field_options | オプション([種類]に依存) | ||
| field_required | 必須 | 0 | 必須でない |
| 1 | 必須 | ||
| field_tag | テンプレートタグ | ||
| field_type | 種類 | text | テキスト |
| textarea | テキスト(複数行) | ||
| checkbox | チェックボックス | ||
| url | URL | ||
| datetime | 日付と時刻 | ||
| select | ドロップダウン | ||
| radio | ラジオボタン | ||
| asset | アイテム | ||
| asset.audio | オーディオ | ||
| asset.video | ビデオ | ||
| asset.image | 画像 | ||
phpMyAdmin のスクリーンショットも掲載しておきます。

