コマンドラインから特定のテンプレートをデバグできる mt-tmpl-test
コマンドラインから、Movable Type の特定のテンプレートをデバグできる mt-tmpl-test now というツールが登場しました。
Making it easier to debug and test your templates

1.概要
このツールでは次のような出力を得ることができます。
- テンプレートの出力(任意のHTMLファイル名で標準出力を保存すればブラウザから参照可)
- テンプレートによって呼び出されたすべてのテンプレートタグ
- 再構築時間・SQL発行回数
- 再構築で実行されたSQLステートメント
出力するテンプレートの指定は、テンプレート名やテンプレートID で行います。カテゴリーアーカイブテンプレートはカテゴリー名またはカテゴリーID、ブログ記事アーカイブテンプレートはブログ記事名またはブログ記事ID を指定します(指定方法は後述)。
2.の「テンプレートによって呼び出されたすべてのテンプレートタグ」では、次のような内容も併せて出力します。
- テンプレートタグ実行時間
- テンプレートタグの起動回数
- テンプレートタグが1回起動されたときの平均実行時間
- テンプレートタグごとのSQL実行回数
次のようなものを標準出力します。

2.ツール実行に必要な Perl モジュール
mt-tmpl-test を実行するには Text::SimpleTable が必要です。PPM を起動して、Text-SimpleTable をインストールしてください。
![]()
ppm コマンドを使えばコマンドラインからもインストールできます。下は Windows + ActivePerl の例です。

3.ツールの利用方法
Making it easier to debug and test your templates」のページにある「Download mt-tmpl-test now」のリンクを右クリックして「対象をファイルに保存」や「名前を付けてリンク先を保存」などを選択し、ファイルを mt-tmpl-test という名前で保存します。

保存したファイルをアプリケーションディレクトリの tools ディレクトリにアップロードして、実行できるよう、パーミッションを 705 や 755 などに変更します。
コマンドラインから次のような感じで起動します。
% cd /path/to/mt
% perl ./tools/mt-tmpl-test --blog=1 --template=1 --profile
Windows で実行する場合は、スラッシュ "/" を¥ に書き換えてください。
指定できるオプションパラメータは次の通りです。
| オプションパラメータ | 設定内容 |
|---|---|
| --blog <name> | ブログ名またはブログIDを指定 |
| --template <name> | テンプレート名またはテンプレートIDを指定 |
| --category <label> | カテゴリー名またはカテゴリーIDを指定 |
| --entry <title> | ブログ記事タイトルまたはブログ記事IDを指定 |
| --author <name> | ユーザー名またはユーザーIDを指定 |
| --archive <type> | アーカイブ種別を指定 |
| --profile | SQLやテンプレートタグのプロファイルを出力 |
| --debug <mode> | MTのデバグモードを指定 |
| --help | ヘルプを表示 |
設定例をいくつか示します。パラメータとパラメータ値の間「=」でつなぐか、半角スペースを挿入してください。各パラメータは半角空白で区切ってください。
1番目のブログ(インストール時に作成されたブログ)のメインページテンプレート(ID:10)を出力
% perl ./tools/mt-tmpl-test --blog=1 --template=10
1番目のブログのブログ記事アーカイブ(ID:15)を、3番目のブログ記事を出力
% perl ./tools/mt-tmpl-test --blog=1 --template=15 --entry=3
1番目のブログのブログ記事リストアーカイブ(ID:17)を、月別アーカイブとしてを出力
% perl ./tools/mt-tmpl-test --blog=1 --template=17 --archive=Monthly
1番目のブログ(インストール時に作成されたブログ)のメインページテンプレート(ID:10)で、プロファイルも出力
% perl ./tools/mt-tmpl-test --blog=1 --template=10 --profile
4.プロファイルの出力例
プロファイルはテンプレート出力の後に出力されます。
Template Tag Utilization:
.----------+----------------------+--------+---------+--------+--------+-------.
| Time | Tag | Calls | Avg | SQL | Hits | Miss |
+----------+----------------------+--------+---------+--------+--------+-------+
| 0.224 | include | 66 | 0.003 | 61 | 22 | 22 |
| 0.107 | entrypermalink | 50 | 0.002 | 21 | 1 | 1 |
| 0.095 | entrytrackbackdata | 10 | 0.010 | 36 | 18 | 18 |
| 0.051 | entryiftagged | 16 | 0.003 | 16 | 42 | 25 |
| 0.049 | filetemplate | 90 | 0.001 | 0 | 0 | 0 |
| 0.042 | entries | 6 | 0.007 | 6 | 36 | 11 |
| 0.037 | categorycount | 12 | 0.003 | 12 | 0 | 0 |
| 0.033 | comments | 6 | 0.006 | 6 | 19 | 14 |
| 0.030 | tags | 2 | 0.015 | 3 | 41 | 16 |
| 0.029 | link | 6 | 0.005 | 12 | 6 | 5 |
| 0.024 | entrycategories | 9 | 0.003 | 10 | 12 | 1 |
| 0.024 | else | 39 | 0.001 | 0 | 0 | 0 |
| 0.022 | archivelink | 8 | 0.003 | 9 | 0 | 0 |
| 0.022 | archivelist | 1 | 0.022 | 2 | 0 | 0 |
| 0.022 | subcatsrecurse | 9 | 0.002 | 11 | 2 | 2 |
| 0.019 | archivedate | 150 | 0.000 | 0 | 0 | 0 |
| 0.018 | tagsearchlink | 148 | 0.000 | 0 | 0 | 0 |
| 0.015 | categoryarchivelink | 15 | 0.001 | 1 | 0 | 0 |
| 0.012 | toplevelcategories | 1 | 0.012 | 2 | 7 | 4 |
| 0.011 | widgetset | 2 | 0.006 | 4 | 2 | 2 |
| 0.011 | entrytags | 6 | 0.002 | 0 | 0 | 0 |
| 0.009 | blogpingcount | 2 | 0.004 | 1 | 0 | 0 |
| 0.008 | if | 112 | 0.000 | 0 | 0 | 0 |
| 0.008 | pings | 2 | 0.004 | 2 | 6 | 3 |
| 0.005 | ifcommentsactive | 30 | 0.000 | 0 | 0 | 0 |
| 0.005 | archivefile | 67 | 0.000 | 0 | 0 | 0 |
| 0.004 | entrylink | 8 | 0.001 | 0 | 0 | 0 |
| 0.004 | ifarchivetypeenabled | 3 | 0.001 | 2 | 0 | 0 |
| 0.004 | subcategorypath | 15 | 0.000 | 0 | 0 | 0 |
| 0.003 | entrycategory | 10 | 0.000 | 1 | 0 | 0 |
| 0.003 | tagrank | 32 | 0.000 | 0 | 0 | 0 |
| 0.002 | blogcommentcount | 1 | 0.002 | 1 | 0 | 0 |
| 0.002 | tagname | 74 | 0.000 | 0 | 0 | 0 |
| 0.002 | entrybody | 19 | 0.000 | 0 | 0 | 0 |
| 0.002 | setvar | 29 | 0.000 | 0 | 0 | 0 |
| 0.001 | entrydate | 10 | 0.000 | 0 | 0 | 0 |
| 0.001 | dateheader | 10 | 0.000 | 0 | 0 | 0 |
| 0.001 | archivetitle | 8 | 0.000 | 0 | 0 | 0 |
| 0.001 | blogid | 43 | 0.000 | 0 | 0 | 0 |
| 0.001 | entryid | 39 | 0.000 | 0 | 0 | 0 |
| 0.001 | indexbasename | 23 | 0.000 | 0 | 0 | 0 |
| 0.001 | ifpingsactive | 20 | 0.000 | 0 | 0 | 0 |
| 0.001 | entrytitle | 24 | 0.000 | 0 | 0 | 0 |
| 0.001 | entrymore | 10 | 0.000 | 0 | 0 | 0 |
| 0.001 | categorylabel | 21 | 0.000 | 0 | 0 | 0 |
| 0.001 | commentdate | 5 | 0.000 | 0 | 0 | 0 |
| 0.001 | categorybasename | 15 | 0.000 | 0 | 0 | 0 |
| 0.000 | categorydescription | 15 | 0.000 | 0 | 0 | 0 |
| 0.000 | productname | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | commentauthor | 5 | 0.000 | 0 | 0 | 0 |
| 0.000 | entrycommentcount | 10 | 0.000 | 0 | 0 | 0 |
| 0.000 | archivecount | 8 | 0.000 | 0 | 0 | 0 |
| 0.000 | entrytrackbackcount | 9 | 0.000 | 0 | 0 | 0 |
| 0.000 | commentid | 10 | 0.000 | 0 | 0 | 0 |
| 0.000 | subcatisfirst | 9 | 0.000 | 0 | 0 | 0 |
| 0.000 | subcatislast | 9 | 0.000 | 0 | 0 | 0 |
| 0.000 | staticwebpath | 2 | 0.000 | 0 | 0 | 0 |
| 0.000 | unless | 2 | 0.000 | 0 | 0 | 0 |
| 0.000 | publishcharset | 2 | 0.000 | 0 | 0 | 0 |
| 0.000 | blogname | 3 | 0.000 | 0 | 0 | 0 |
| 0.000 | cgipath | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | elseif | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | getvar | 2 | 0.000 | 0 | 0 | 0 |
| 0.000 | entriesheader | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | defaultlanguage | 2 | 0.000 | 0 | 0 | 0 |
| 0.000 | archivelistheader | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | entriesfooter | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | archivelistfooter | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | blogifcclicense | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | searchscript | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | blogurl | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | searchmaxresults | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | cclicenserdf | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | blogdescription | 1 | 0.000 | 0 | 0 | 0 |
| 0.000 | version | 1 | 0.000 | 0 | 0 | 0 |
'----------+----------------------+--------+---------+--------+--------+-------'
Total Queries: 219
Total Build Time: 1.02736
.------------------------------------------------------------------+-----------.
| Query | Number |
+------------------------------------------------------------------+-----------+
| RAMCACHE_GET ? | 214 |
| RAMCACHE_ADD ? | 124 |
| SELECT templatemap_id, templatemap_archive_type, templatemap_bl- | 30 |
| og_id, templatemap_build_interval, templatemap_build_type, temp- | |
| latemap_file_template, templatemap_is_preferred, templatemap_te- | |
| mplate_id FROM mt_templatemap WHERE (templatemap_archive_type =- | |
| ?) AND (templatemap_blog_id = ?) LIMIT 1 | |
| SELECT template_id, template_blog_id, template_build_dynamic, t- | 25 |
| emplate_build_interval, template_build_type, template_created_b- | |
| y, template_created_on, template_identifier, template_linked_fi- | |
| le, template_linked_file_mtime, template_linked_file_size, temp- | |
| late_modified_by, template_modified_on, template_name, template- | |
| _outfile, template_rebuild_me, template_text, template_type FRO- | |
| M mt_template WHERE (template_id IN (?)) | |
| SELECT template_id FROM mt_template WHERE (template_name = ?) A- | 20 |
| ND (template_type = ?) AND (template_blog_id IN (?,?)) ORDER BY- | |
| template_blog_id DESC | |
| SELECT template_meta_template_id, template_meta_type, template_- | 20 |
| meta_vchar, template_meta_vchar_idx, template_meta_vdatetime, t- | |
| emplate_meta_vdatetime_idx, template_meta_vinteger, template_me- | |
| ta_vinteger_idx, template_meta_vfloat, template_meta_vfloat_idx- | |
| , template_meta_vblob, template_meta_vclob FROM mt_template_met- | |
| a WHERE (template_meta_template_id = ?) | |
| SELECT placement_id, placement_blog_id, placement_category_id, - | 19 |
| placement_entry_id, placement_is_primary FROM mt_placement WHER- | |
| E (placement_entry_id = ?) | |
| SELECT COUNT(*) FROM mt_entry, mt_placement WHERE (entry_status- | 12 |
| = ?) AND (entry_class = ?) AND (entry_blog_id = ?) AND (placem- | |
| ent_category_id = ?) AND (entry_id = placement_entry_id) | |
| SELECT DISTINCT tag_id, tag_name FROM mt_tag, mt_objecttag WHER- | 10 |
| E (objecttag_object_id = ?) AND (objecttag_object_datasource = - | |
| ?) AND (tag_id = objecttag_tag_id) ORDER BY tag_name ASC | |
| SELECT category_id FROM mt_category WHERE (category_parent = ?)- | 9 |
| AND (category_class = ?) AND (category_blog_id = ?) | |
| SELECT category_id, category_allow_pings, category_author_id, c- | 9 |
| ategory_basename, category_blog_id, category_class, category_cr- | |
| eated_by, category_created_on, category_description, category_l- | |
| abel, category_modified_by, category_modified_on, category_pare- | |
| nt, category_ping_urls FROM mt_category WHERE (category_id = ?)- | |
| LIMIT 1 | |
| SELECT trackback_id FROM mt_trackback WHERE (trackback_entry_id- | 9 |
| = ?) LIMIT 1 | |
| SELECT trackback_id, trackback_blog_id, trackback_category_id, - | 9 |
| trackback_created_by, trackback_created_on, trackback_descripti- | |
| on, trackback_entry_id, trackback_is_disabled, trackback_modifi- | |
| ed_by, trackback_modified_on, trackback_passphrase, trackback_r- | |
| ss_file, trackback_title, trackback_url FROM mt_trackback WHERE- | |
| (trackback_id IN (?)) | |
| SELECT template_id FROM mt_template WHERE (template_identifier - | 6 |
| = ?) AND (template_type = ?) AND (template_blog_id = ?) LIMIT 1 | |
| SELECT category_id, category_allow_pings, category_author_id, c- | 3 |
| ategory_basename, category_blog_id, category_class, category_cr- | |
| eated_by, category_created_on, category_description, category_l- | |
| abel, category_modified_by, category_modified_on, category_pare- | |
| nt, category_ping_urls FROM mt_category WHERE (category_id IN (- | |
| ?)) | |
| SELECT comment_id FROM mt_comment WHERE (comment_visible = ?) A- | 3 |
| ND (comment_blog_id = ?) AND (comment_entry_id = ?) ORDER BY co- | |
| mment_created_on DESC | |
| SELECT templatemap_id, templatemap_archive_type, templatemap_bl- | 3 |
| og_id, templatemap_build_interval, templatemap_build_type, temp- | |
| latemap_file_template, templatemap_is_preferred, templatemap_te- | |
| mplate_id FROM mt_templatemap WHERE (templatemap_is_preferred =- | |
| ?) AND (templatemap_archive_type = ?) AND (templatemap_blog_id- | |
| = ?) LIMIT 1 | |
| SELECT entry_id FROM mt_entry WHERE (entry_status = ?) AND (ent- | 2 |
| ry_blog_id = ?) AND (entry_class = ?) ORDER BY entry_authored_o- | |
| n DESC LIMIT 10 | |
| SELECT tag_id, tag_is_private, tag_n8d_id, tag_name FROM mt_tag- | 2 |
| WHERE (tag_id IN (?,?,?,?)) | |
| SELECT template_id FROM mt_template WHERE (template_name = ?) A- | 2 |
| ND (template_blog_id IN (?,?)) AND (template_type = ?) LIMIT 1 | |
'------------------------------------------------------------------+-----------'
「Ajax 月送りカレンダー」の表示月をブログ記事の投稿月や月別アーカイブに連動させる
「『Ajax 月送りカレンダー(MT4版)』で未来月のブログ記事を表示しない」の続きで、「Ajax 月送りカレンダー(MT4版)」をブログ記事の投稿月や日付アーカイブに連動させるためのカスタマイズです。
具体的には、
- ブログ記事アーカイブ:投稿月のカレンダーを表示
- 日別・月別アーカイブ/日別カテゴリー・月別カテゴリーアーカイブ/日別ユーザー・月別ユーザーアーカイブ:該当月のカレンダーを表示
- メインページ/カテゴリーアーカイブ/ユーザーアーカイブ:最新月(未来月を除く)のカレンダーを表示
となります。
ブログ記事アーカイブでの表示例(投稿月である9月のカレンダーを表示)

月別アーカイブでの表示例(アーカイブの月である8月のカレンダーを表示)

何人かの方から質問を頂いてますので、本エントリーで回答致します。
1.変更点(その1)
Ajax 月送りカレンダー(MT4版)の「5.2 カレンダー表示部分の設定」を次の内容に入れ替えてください。
<div id="calendar"></div>
<script type="text/javascript">
<mt:if name="archive_class" like="monthly|daily">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:archiveDate format="%Y/%m/" />");
<mt:elseIf name="archive_class" like="weekly|yearly">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:date format="%Y/%m/" />");
<mt:elseIf name="entry_archive">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:entryDate format="%Y/%m/" />");
<mt:else>
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
<mt:unless name="flag">
<mt:archiveDate format="%Y/%m" setvar="archive_date" />
<mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
<mt:setVar name="flag" value="1" />
</mt:if>
</mt:unless>
</mt:archiveList>
</mt:if>
</script>
当サイトの 4.2 対応のテンプレートでサイドバーに設置する場合は、次のように dd 要素でマークアップしてください。
<dd id="calendar"></dd>
<dd>
<script type="text/javascript">
<mt:if name="archive_class" like="monthly|daily">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:archiveDate format="%Y/%m/" />");
<mt:elseIf name="archive_class" like="weekly|yearly">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:date format="%Y/%m/" />");
<mt:elseIf name="entry_archive">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:entryDate format="%Y/%m/" />");
<mt:else>
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
<mt:unless name="flag">
<mt:archiveDate format="%Y/%m" setvar="archive_date" />
<mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
<mt:setVar name="flag" value="1" />
</mt:if>
</mt:unless>
</mt:archiveList>
</mt:if>
</script>
</dd>
年別アーカイブ・週別アーカイブ(カテゴリ・ユーザー別含む)の場合は、日別や月別と同じ制御(MTArchiveDate タグで年月を取得)では正常に表示されない場合があり、制御がやや面倒なので現在月を表示するようにしています。ちなみに正常に表示されない理由は次の通りです。
- 年別アーカイブ:その年の最初の月を表示するが、その月に投稿がないと正常に表示されない。
- 週別アーカイブ:週が2ヶ月にまたがっていると、最初の月のカレンダーを表示するが、その月に投稿がないと正常に表示されない。
2.変更点(その2)
ajaxCalendar.js をアップロードする前に(アップロードしていたらダウンロードして)、任意のエディタで開き、下記の青色部分を追加してください。この追加を行わないと、最初に表示された(または月送りした)カレンダー月がクッキーにカレンダー年月が保存され、その年月のカレンダー表示が優先されてしまいます。
...前略...
function getCalendar(blogURL, id, path) {
blogID = id;
var cookie = readCookie("AjaxCal" + id);
cookie = null;
if(cookie != null) {
if(blogURL.lastIndexOf("/") != blogURL.length - 1) {
path = blogURL + "/calendar/" + cookie + "/";
} else {
path = blogURL + "calendar/" + cookie + "/";
}
}
changeMonth(path);
}
...後略...
「Ajax 月送りカレンダー」で未来月のブログ記事を表示しない
公開中の「Ajax 月送りカレンダー(MT4版)」のデフォルト表示月は最新投稿があったブログ記事の月になるようにしていますが、未来の月に投稿があると、その月が表示されてしまいます。
「このような場合でも現在の月を表示したいのですが」というご質問を頂きましたので、本エントリーにて紹介致します。
1.変更点(その1)
Ajax 月送りカレンダー(MT4版)の「5.2 カレンダー表示部分の設定」を次のように変更してください(青色部分を追加し、赤色部分を変更)。
変更前
<div id="calendar"></div>
<script type="text/javascript">
getCalendar("<$MTBlogArchiveURL$>", "<$MTBlogID$>", "<$MTBlogArchiveURL$><MTEntries lastn="1" sort_order="descend"><$MTEntryDate format="calendar/%Y/%m/" $></MTEntries>");
</script>
変更後
<div id="calendar"></div>
<script type="text/javascript">
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
<mt:unless name="flag">
<mt:archiveDate format="%Y/%m" setvar="archive_date" />
<mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
<mt:setVar name="flag" value="1" />
</mt:if>
</mt:unless>
</mt:archiveList>
</script>
変更前は、JavaScript を起動するパラメータに、最新のブログ記事が投稿されている年月を設定していますが、変更後は、再構築年月(MTDate)を現在月とみなして、その月以前に投稿されたブログ記事がある年月を、JavaScript を起動するパラメータに設定しています。
これで未来月に投稿があっても、現在月のカレンダーを表示します。
MTDate の代わりに JavaScript でダイナミックに年月を取得すると、月が切り変わった瞬間など、存在しない月のカレンダーを取得する可能性があるため、ここでは採用していません。
当サイトの 4.2 対応のテンプレートでサイドバーに設置する場合は、次のように dd 要素でマークアップしてください。
<dd id="calendar"></dd>
<dd>
<script type="text/javascript">
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
<mt:unless name="flag">
<mt:archiveDate format="%Y/%m" setvar="archive_date" />
<mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
<mt:setVar name="flag" value="1" />
</mt:if>
</mt:unless>
</mt:archiveList>
</script>
</dd>
2.変更点(その2)
Ajax 月送りカレンダー(MT4版)の「2.カレンダーテンプレート作成」のリストを、次のように変更してください(青色部分を追加)。
変更前
...前略...
<MTArchiveNext>
<a href="javascript:void(0);" onclick="changeMonth('<$MTBlogArchiveURL$><MTArchiveDate format="calendar/%Y/%m/%i">');" >></a>
</MTArchiveNext>
...後略...
変更後
...前略...
<MTArchiveNext>
<mt:archiveDate format="%Y%m" setvar="archive_date" />
<mt:if name="archive_date" le="$current_date">
<a href="javascript:void(0);" onclick="changeMonth('<$MTBlogArchiveURL$><MTArchiveDate format="calendar/%Y/%m/%i">');" >></a>
</mt:if>
</MTArchiveNext>
...後略...
これはカレンダーの前後月のリンクで、未来月へのリンクを表示しない対処です。
3.謝辞
この手法は、WingMemo さんのブログで紹介されている、次の記事をヒントにカスタマイズさせて頂きました。ありがとうございました。
Knowledge Base Templateset プラグイン
シックス・アパートのソリューションパートナーである、株式会社ベイリーフが発売している、「Knowledge Base(ナレッジベース) Templateset プラグイン」を紹介致します。
ナレッジベースではこのような Mac 風デザインのテンプレートセットを提供しています。
1.概略
ナレッジベースは、社内での情報共有ツール、FAQ やヘルプデスクなど、情報を素早く検索する場合に有効なプラグインです。
通常のブログでも様々なリンクを表示することができますが、ページ遷移によって、表示されているリンクリストが異なったり、元のリンクリストにたどり着くためにページのスクロールが必要だったりします。
ナレッジベースでは、一番左側のペインに表示されている「最近の記事リスト」「月別リスト」「カテゴリリスト」などから、右のペインに該当リストの記事一覧を表示し、さらに右のペインに記事本文を表示させるので、各リストからの繰り返し検索が非常にスムーズに行えます。
また、ページ表示も全くストレスを感じません。
検索機能としては、具体的には次のような機能があります(マニュアルより抜粋)。ページへアクセスした履歴を表示する「アクセス履歴」や、プラグインで提供しているフラグ機能を記事に設定すれば、「フラグ付き記事」など、便利な機能もついています。
| 機能 | 説明 |
|---|---|
| 記事検索 | キーワードから記事を検索する機能 |
| タグ検索 | タグを付けた記事を検索する機能 |
| カテゴリ分類 | 記事をカテゴリ別に、一覧表示する。カテゴリの階層化、複数カテゴリにも対応 |
| 人気ランキング | コメントの多い記事順に、一覧表示する |
| フラグ付き記事 | フラグ付きの記事を一覧表示する。特定の記事にをフラグを付ける機能 |
| アクセス履歴 | アクセスした記事を、一覧表示する |
| コメント一覧 | コメントを、一覧表示する |
| データダウンロード | エントリーデータをCSV形式でダウンロードする機能 |
| 月別記事リスト | 記事の投稿された日付順に、一覧表示する |
| コメント | 投稿記事にコメントを投稿する機能 |
| Googleリンク | 記事検索結果にGoogle検索リンクを表示する |
| カスタムキーワード | キーワードを分割してテーブル表示する機能 |
まずは公式サイトのデモページで操作感を味わってみてください。
以下、Knowledge Base Templateset プラグインのインストールと設定方法を説明します。
2.KnowledgeBase プラグインのインストール
ダウンロードしたプラグインアーカイブを展開し、KnowledgeBase1.xx/plugins 配下の KnowledgeBase フォルダをアプリケーションディレクトリの plugins ディレクトリにアップロードします。また、KnowledgeBase1.xx/mt-static/plugins 配下の KnowledgeBase フォルダをスタティックディレクトリ(mt-static)の plugins ディレクトリにアップロードします。
「システム」→「プラグイン」で「Knowledge Base Templateset x.xx」が表示されればインストールOKです。

3.KnowledgeBase プラグインの設定
まず、システムのプラグイン一覧の「Knowledge Base Templateset x.xx」をクリックし、「設定」をクリックして、購入時のライセンス番号を入力します。

次に、ナレッジベースを利用したいブログの管理画面で、「ツール」→「プラグイン」を選択し、最初の検索項目として表示したい項目をチェックします。

4.KnowledgeBase テンプレートセットの切り替え
最後に、ナレッジベースを利用したいブログの管理画面で、「デザイン」→「ブログのテンプレートを初期化」をクリックし、Knowledge Base Templateset プラグインで提供しているテンプレートセットを選択します。

最後にブログ全体を再構築し、トップページを表示すれば、冒頭のようなナレッジベースの画面が表示されます。検索操作はこのトップページで行います。
検索項目に▼マークが表示されているものは、その部分を表示すればツリーの表示・非表示が切り替えられます。マークも切り替わります。
5.導入事例
QUICK SOLUTION では、FAQ としてナレッジベースを導入されています。
Movable Type 4.2 のブログ記事ページを XHTML 1.0 Strict で valid にする
Category:[JavaScript]
Tag:[JavaScript, MovableType, Template, XHTML]
Permalink
Movable Type 4.2 のテンプレートを XHTML 1.0 Strict で運用する時、ブログ記事ページおよびウェブページを valid にするカスタマイズです。
1.問題点
ブログ記事ページでは、form 要素に name 属性値が記述されているため、XHTML 1.0 Strict では valid な XHTML となりません。
下は W3C Markup Validation Service でチェックした結果です。

form 要素の name 属性値を単純に削除すると、JavaScript(mt.js)でコメントフォーム制御のために name 属性値を多用しているので、JavaScript を書き換える必要があります。
ということで、name 属性を削除した場合の JavaScript の変更差分を示します。
2.修正箇所
赤色部分を青色の内容に書き換えてください。数字は変更箇所前後のおおよその行番号を示しています。
379~384
function mtCommentSessionVerify(app_user) {
var u = mtGetUser();
var f = document['comments_form'];
if ( u && app_user && app_user.sid && ( u.sid == app_user.sid ) ) {
f.submit();
} else {
function mtCommentSessionVerify(app_user) {
var u = mtGetUser();
var f = document.forms['comments-form'];
if ( u && app_user && app_user.sid && ( u.sid == app_user.sid ) ) {
f.submit();
} else {
420~426
mtShowGreeting();
// populate anonymous comment fields if user is cookied as anonymous
var cf = document['comments_form'];
if (cf) {
if (u && u.is_anonymous) {
if (u.email) cf.email.value = u.email;
mtShowGreeting();
// populate anonymous comment fields if user is cookied as anonymous
var cf = document.forms['comments-form'];
if (cf) {
if (u && u.is_anonymous) {
if (u.email) cf.email.value = u.email;
458~463
function mtEntryOnUnload() {
if (mtRequestSubmitted) {
var cf = document['comments_form'];
if (cf) {
if (cf.post && cf.post.disabled)
cf.post.disabled = false;
function mtEntryOnUnload() {
if (mtRequestSubmitted) {
var cf = document.forms['comments-form'];
if (cf) {
if (cf.post && cf.post.disabled)
cf.post.disabled = false;
484~491
doc_url = doc_url.replace(/#.+/, '');
var url = '<$mt:SignInLink$>';
if (is_preview) {
if ( document['comments_form'] ) {
var entry_id = document['comments_form'].entry_id.value;
url += '&entry_id=' + entry_id;
} else {
url += '&return_url=<$mt:BlogURL encode_url="1"$>';
doc_url = doc_url.replace(/#.+/, '');
var url = '<$mt:SignInLink$>';
if (is_preview) {
if ( document.forms['comments-form'] ) {
var entry_id = document.forms['comments-form'].entry_id.value;
url += '&entry_id=' + entry_id;
} else {
url += '&return_url=<$mt:BlogURL encode_url="1"$>';
535~542
doc_url = doc_url.replace(/#.+/, '');
var url = '<$mt:SignOutLink$>';
if (is_preview) {
if ( document['comments_form'] ) {
var entry_id = document['comments_form'].entry_id.value;
url += '&entry_id=' + entry_id;
} else {
url += '&return_url=<$mt:BlogURL encode_url="1"$>';
doc_url = doc_url.replace(/#.+/, '');
var url = '<$mt:SignOutLink$>';
if (is_preview) {
if ( document.forms['comments-form'] ) {
var entry_id = document.forms['comments-form'].entry_id.value;
url += '&entry_id=' + entry_id;
} else {
url += '&return_url=<$mt:BlogURL encode_url="1"$>';
568~574
<mt:IfRegistrationAllowed>
var reg_reqd = <mt:IfRegistrationRequired>true<mt:Else>false</mt:IfRegistrationRequired>;
var cf = document['comments_form'];
if (!cf) return;
var el = document.getElementById('comment-greeting');
<mt:IfRegistrationAllowed>
var reg_reqd = <mt:IfRegistrationRequired>true<mt:Else>false</mt:IfRegistrationRequired>;
var cf = document.forms['comments-form'];
if (!cf) return;
var el = document.getElementById('comment-greeting');
3.その他
XHTML 1.0 Transitional の場合、この修正を行わなくても valid になりますが、Another HTML-lint gateway では次のようなエラーが出力されます。
<form> の name 属性の値 `comments_form` と id 属性の値 `comments-form` は、同一タグ中では同じでなければなりません。
HTML 4.01 では必ず同じ値になっている必要があります。
XHTML 1.1 では name 属性自体が廃止されています。
4.配布テンプレートについて
この修正を行ったテンプレート(v1.10)を配布しています。
5.参考記事
参考記事は下記です。ありがとうございました。
Movable Type 4.2 検索結果ページのカスタマイズ:ナビゲーションを検索結果の上下に表示する
Movable Type 4.2 の検索結果ページのカスタマイズで、4回目は「ナビゲーションを検索結果の上下に表示する」を紹介します。
その4:ナビゲーションを検索結果の上下に表示する
デフォルトテンプレートでは、ナビゲーションがページの下にしか表示されません。

カスタマイズ後はこのようにページ上部に表示します。ナビゲーションを上部に表示しておけば、ページ送りをスクロールせずに行えるようになります。

上部に表示するには、既存と同じナビゲーションのサブテンプレートを追加します。
デフォルトテンプレートの場合
<h1 id="page-title" class="search-results-header">
<mt:IfStraightSearch>
「<$mt:SearchString$>」と一致するもの
</mt:IfStraightSearch>
<mt:IfTagSearch>
タグ「<$mt:SearchString$>」が付けられているもの
</mt:IfTagSearch>
</h1>
<div class="content-nav">
<mt:IfPreviousResults><a href="<$mt:PreviousLink$>" rel="prev" onclick="return swapContent(-1);">< 前</a> </mt:IfPreviousResults><mt:PagerBlock><mt:IfCurrentPage><$mt:Var name="__value__"$><mt:Else><a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a></mt:IfCurrentPage><mt:Unless name="__last__"> </mt:Unless></mt:PagerBlock><mt:IfMoreResults> <a href="<$mt:NextLink$>" rel="next" onclick="return swapContent();">次 ></a></mt:IfMoreResults>
</div>
<div class="search-results-container autopagerize_page_element">
配布テンプレートの場合(設定済み)
<div id="search-results">
<span id="current-page" style="display:none"><mt:currentPage /></span>
<h2 class="search-results-header">
<mt:ifStraightSearch>
「<mt:searchString />」
</mt:ifStraightSearch>
<mt:ifTagSearch>
タグ「<mt:searchString />」
</mt:ifTagSearch>
の検索結果(<mt:currentPage>/<mt:totalPages />)
</h2>
<mt:pagerBlock>
<mt:getVar name="__value__" setvar="result_number" />
</mt:pagerBlock>
<mt:unless name="result_number" eq="1">
<div class="content-nav">
<mt:ifPreviousResults>
<a href="<mt:previousLink />" rel="prev" onclick="return swapContent(-1);">< 前</a>
</mt:ifPreviousResults>
<mt:pagerBlock>
<mt:ifCurrentPage>
<mt:getVar name="__value__" />
<mt:else>
<a href="<mt:pagerLink />"><mt:getVar name="__value__" /></a>
</mt:ifCurrentPage>
<mt:unless name="__last__"> </mt:Unless>
</mt:pagerBlock>
<mt:ifMoreResults>
<a href="<mt:nextLink />" rel="next" onclick="return swapContent();">次 ></a>
</mt:ifMoreResults>
</div>
</mt:unless>
</mt:searchResultsHeader>
関連記事
WordPress の title 要素に表示される「»」を変更・削除する
WordPress の title 要素の表示に wp_title() を使用していると、デフォルトの区切り文字として「»」が表示されます。
この区切り文字を削除・変更する方法について本エントリーにて紹介致します。
なお、配布中の WordPress テーマで、wp_title() を用いているため、記事ページの title 要素の先頭に「»」が表示されてしまいます。ご質問を頂きましたので、後半はこれを削除する方法も併せて紹介します。
1.wp_title() について
wp_title() は表示中の記事タイトルなどを出力するタグです。
- 第1パラメータ:区切り文字
- 第2パラメータ:表示方法
- 第3パラメータ:区切り文字表示位置
第1パラメータ:区切り文字
パラメータを省略すると「»」が区切り文字となります。空の文字列「''」を設定すれば区切り文字は表示されません。
第2パラメータ:表示方法
true を設定すると、記事タイトルなどを echo で出力します。
false を設定すると、記事タイトルなどを関数の返却値として返します。
説明が難しいので、PHP のコードが読める方は下のコードを参照してください。パラメータ $display の処理は関数の最後の方で判定に用いられます。
function wp_title($sep = '»', $display = true, $seplocation = '') {
...ばっさり略...
// Send it out
if ( $display )
echo $title;
else
return $title;
}
第3パラメータ:区切り文字表示位置
パラメータに 'right' を設定すると、記事タイトルなどの右側に表示します。デフォルトでは左側に表示します。
設定例
各パラメータを次のように設定すれば、title 要素を「ブログ記事名 - ブログ名」にできます。
- 第1パラメータ:' - '
- 第2パラメータ:true
- 第3パラメータ:'right'
<title>
<?php if ( is_single() ) { ?><?php wp_title(' - ', true, 'right'); ?>: <?php } ?><?php bloginfo('name'); ?>
</title>

the_title() を使用する
記事ページについては、wp_title() の代わりに the_title() を利用する手もあります。the_title() は区切り文字を表示する代わりに、タイトルの前後に指定した文字列を出力できます。
function the_title($before = '', $after = '', $echo = true) {
$title = get_the_title();
if ( strlen($title) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
2.配布テーマの変更方法
現状の配布テーマでは、記事ページで次のように先頭に「»」が表示されてしまいます。

これを解消するには「ヘッダー」テンプレートを次の「その1」「その2」いずれかの変更を行ってください。「その1」は wp_title() を、「その2」は the_title() を使用しています。
なお、配布テーマは 2008/10/25 に修正済みです。
変更前
<title>
<?php if ( is_single() ) { ?><?php wp_title(); ?>: <?php } ?><?php bloginfo('name'); ?></title>
変更後(その1)
<title>
<?php if ( is_single() ) { ?><?php wp_title(''); ?>: <?php } ?><?php bloginfo('name'); ?></title>
変更後(その2)
<title>
<?php if ( is_single() ) { ?><?php the_title(); ?>: <?php } ?><?php bloginfo('name'); ?></title>
たどり着いた
サインイン後のページ遷移でコメント投稿フォームを表示する
Movable Type のブログ記事ページやウェブページでの認証コメントでは、コメントフォームにサインインした後、ブログ記事ページのトップに戻ってしまいます。
例として、Movable Type のあるブログ記事にサインインします。

サインイン後は、サインインしたページの先頭に戻ってしまいます。

ファイルサイズが小さいページであれば、少しスクロールすればコメントフォームを表示できますが、大量のコメントの下にコメントフォームがある場合など、再びコメントフォームに移動するのは結構面倒です。
本エントリーでは、サインイン後に表示されるブログ記事ページ(またはウェブページ)でコメントフォームの位置までスクロールして表示するカスタマイズを紹介します。
このカスタマイズを行えば、サインイン後に、次のようにコメントフォームの位置までスクロールした状態で表示します。

このブログでも少し前からこのカスタマイズを適用していますので、動作を知りたい方はとりあえずコメントフォームにサインインしてみてください。
1.Movable Type 4.2 デフォルトテンプレート「既定のブログ」の場合
「コメント」テンプレートモジュールの h2 要素に id 属性「_login」を追加します。
変更前
...前略...
<mt:IfCommentsAccepted>
<div class="comments-open" id="comments-open">
<h2 class="comments-open-header">コメントする</h2>
<div class="comments-open-content">
...後略...
変更後
...前略...
<mt:IfCommentsAccepted>
<div class="comments-open" id="comments-open">
<h2 id="_login" class="comments-open-header">コメントする</h2>
<div class="comments-open-content">
...後略...
2.当ブログの Movable Type 4.2 配布テンプレートの場合
「コメント入力フォーム」テンプレートモジュールの h2 要素に id 属性「_login」を追加します。
変更前
<mt:entryIfCommentsOpen>
<div class="comments-open" id="comments-open">
<h2 class="comments-open-header">コメントする</h2>
<div class="comments-open-content">
..後略...
変更後
<mt:entryIfCommentsOpen>
<div class="comments-open" id="comments-open">
<h2 id="_login" class="comments-open-header">コメントする</h2>
<div class="comments-open-content">
..後略...
3.スクロール表示できる仕組み
大体お分かりだと思いますが、サインイン後にリダイレクトされた URL の末尾に「#_login」が付与されます。これをフラグメントとして利用している訳です。
なお、ブログ管理者がブログ管理画面などにログインしているブラウザと同じブラウザで、ブログ記事のコメントフォームにサインインしても、このカスタマイズのようなスクロールは行われません。
4.マークアップの妥当性について
XHTML では id 属性値が "_" で開始しても問題ありません。ただし、HTML4.01 では違反ですので気をつけてください。
5.name 属性によるフラグメントについて
4項では id 属性を用いたフラグメント方法を紹介しましたが、name 属性を用いたフラグメント、例えば、
<a name="_login"></a>
という方法については、
- XHTML では id 属性によるフラグメントに変更(name 属性自体が XHTML 1.1 で廃止)
- Movable Type デフォルトテンプレート・配布テンプレートはXHTML
という理由で紹介をしておりません。ただし、HTML4.01 でマークアップをしている場合は name 属性によるフラグメントを行ってください。
なお、XHTML 1.0 で、id 属性によるフラグメントをサポートしていないブラウザに対応させたい場合は、1項または2項の変更で id 属性と name 属性を併記してください。
<h2 id="_login" name="_login" class="comments-open-header">コメントする</h2>
最近の主なブラウザ(IE/Firefox/Opera/Safari/Google Chrome)では id 属性によるフラグメントが可能です。
2008.10.24
5項を追加しました。
CSS ネガティブマージンで重なった要素のリンクをクリックできるようにする
CSS レイアウトでネガティブマージンを使っていると、一部のモダンブラウザでリンクがクリックできなかったり、マウスでテキストを選択できない状態になる場合があります。
配布中の Movable Type 4.2 テンプレートをご利用の方からご指摘を頂きましたが、ネガティブマージンを使った CSS レイアウト全般で有効な対処方法と思われるので、備忘録として残しておきます。
1.問題点
次のように、左サイドバーの「Movable Type 入門セミナー」にマウスをポイントしてもリンクがアクティブになりません。

なお、この問題に関する、Windows XP での各ブラウザの動作状況は次の通りでした。
- FireFox3.0.3:NG
- Safari3.1.2:NG
- Opera9.5.2:OK
- Google Chrome:NG
- IE6:OK
- IF7:OK
2.原因
中央カラムにネガティブマージンを設定しているのですが、左サイドバーのマークアップが中央カラムより後方にあるため、左サイドバーのボックスが(ネガティブマージンにより)中央カラムの下に重なってしまっていたようです。
3.対処方法
クリックできないボックスに、次のようなプロパティを与えます。
#links-left {
position: relative;
z-index: 2;
}
z-index はボックスの重なりの順序を指定する際に使用します。値は 0 を基準とし、値が大きいものが上に重なります。ここでは 2 を指定して中央カラムのボックス(z-index 指定なし)より上に重なるようにしています。
なお、z-index はpositionプロパティでstatic以外の値が指定されている要素に適用されるので、position プロパティを併せて設定しています。
これでテキスト選択やリンクがアクティブになります。

配布中の Movable Type テンプレートも修正致しました。3カラムリキッドレイアウト(フッタつき)をご利用の方は最新版をご利用ください。
4.参考サイト
Movable Type 4.2 検索結果ページのカスタマイズ:検索結果が1ページだけのときに「1」という表示をなくす
Movable Type 4.2 の検索結果ページのカスタマイズで、3回目は「検索結果が1ページだけのときに「1」という表示をなくす」を紹介します。
その3:検索結果が1ページだけのときに「1」という表示をなくす
デフォルトテンプレートでは、ページ分割を行わない場合、ページ下のナビゲーション部分に「1」という数字が表示されます。

カスタマイズ後はこのように非表示にすることができます。

非表示にするには、次のようなサブテンプレートを MTSearchResults タグブロック内に追加します。
デフォルトテンプレートの場合
<mt:pagerBlock>
<mt:getVar name="__value__" setvar="result_number" />
</mt:pagerBlock>
<mt:unless name="result_number" eq="1">
<div class="content-nav">
<mt:IfPreviousResults><a href="<$mt:PreviousLink$>" rel="prev" onclick="return swapContent(-1);">< 前</a> </mt:IfPreviousResults><mt:PagerBlock><mt:IfCurrentPage><$mt:Var name="__value__"$><mt:Else><a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a></mt:IfCurrentPage><mt:Unless name="__last__"> </mt:Unless></mt:PagerBlock><mt:IfMoreResults> <a href="<$mt:NextLink$>" rel="next" onclick="return swapContent();">次 ></a></mt:IfMoreResults>
</div>
</mt:unless>
配布テンプレートの場合(設定済み)
<mt:pagerBlock>
<mt:getVar name="__value__" setvar="result_number" />
</mt:pagerBlock>
<mt:unless name="result_number" eq="1">
<div class="content-nav">
<mt:ifPreviousResults>
<a href="<mt:previousLink />" rel="prev" onclick="return swapContent(-1);">< 前</a>
</mt:ifPreviousResults>
<mt:pagerBlock>
<mt:ifCurrentPage>
<mt:getVar name="__value__" />
<mt:else>
<a href="<mt:pagerLink />"><mt:getVar name="__value__" /></a>
</mt:ifCurrentPage>
<mt:unless name="__last__"> </mt:Unless>
</mt:pagerBlock>
<mt:ifMoreResults>
<a href="<mt:nextLink />" rel="next" onclick="return swapContent();">次 ></a>
</mt:ifMoreResults>
</div>
</mt:unless>
関連記事
Web Directions East
「Web Directions」は、ウェブ制作業界において世界的に著名なトップエキスパートがその豊富な知識やアイデアを披露し、直接革新的な技術について指導を受けられることで知られる、世界最高峰のカンファレンスとして注目されています。
これまで北米、オーストラリアでしか実施されなかった Web Directions ですが、この秋、アジア初のウェブデザイナー・ウェブ開発者向けカンファレンス Web Directions East として、日本(東京)で開催されることになりました。
Web Directions East は11月7日から11月9日の3日間の開催です。
- カンファレンス:11月7日
- ワークショップ:11月8日~9日
以下、公式サイトからの抜粋です。
1.カンファレンスについて
ここ数年注目されている『ユーザーに優しいウェブサイトの提供』をコンセプトにWeb制作者と始め、Web担当者などWebに関わる全ての方に参加してほしいカンファレンスです。
- ブラウザの多様化でみる最良のウェブ開発:Eric Meyer(エリック・メイヤー)
- 最適なユーザーエクスペリエンスのための情報設計:Jeffrey Veen(ジェフリー・ヴィーン)
- あらゆるデバイスに対応できるウェブデザインの考え方:Dan Cederholm(ダン・セダーホルム)
- 使い勝手と見やすさを両立するAjaxを使ったサイト設計:Jeremy Keith(ジェレミー・キース)
- 高効率・低コストで行うユーザビリティテストの仕組み:Andy Budd(アンディ・バド)
技術的な内容を取り扱いながらもWeb担当者の方にも仕事で役立つ内容を取り入れ、半年先にみる現実のWebテクノロジーを紹介します。
2.ワークショップについて
「XHTML、CSS」「Ajax」「ユーザーエクスペリエンス」の最高峰エキスパートによるパソコンを用いた実習講座です。
- 11月8日開催ワークショップ
- 講座名『効率よく最適化するためのCSS上流講座』:Eric Meyer (エリック・メイヤー)
- 11月9 日開催ワークショップ
- 講座名『仕組みから学ぶアクセシブルAjax講座』:Jeremy Keith(ジェレミー・キース)
- 講座名『高効率ユーザービリティテスティング』:Andy Budd(アンディ・バド)
各ワークショップには同時通訳を設け、日本語・英語を話すサポートスタッフが常駐するので、日本語での質問ができ安心して参加できます。
ワークショップは計3つあります。申し込みは1講座ごとの申し込みになり、同日に行われる講座への横断はできません。つまり、11月9日はいずれかひとつです。
3.参加費用について
カンファレンスは、10月24日までに申し込めば、「早割り60」の割引が適用されます(¥39,900(税込¥41,895))。10月25日~11月06日に申し込めば「早割り30」の割引が適用されます(¥44,900(税込¥47,145))。
ワークショップは、カンファレンス/日程の違うワークショップと同時に申込むことで、10,000円割引となります。ワークショップを両日申込むと、両日とも10,000円割引の¥39,000(税込¥40,950)×2日間の料金となります。ただし、同時申込み割引は同一本人のみ有効です。
要するに、全日参加すれば約8万円くらいです。
LogDeleteSelector プラグイン
LogDeleteSelector は、Movable Type のログを選択削除できるようにするプラグインです。
1.概要
Movable Type のログは、標準機能では一括削除しかできません。
具体的には、ログ一覧の上にある「ログを消去」をクリックすると、全てのログが消去されます。厳密には、ブログ管理画面のログ一覧でログを消去した場合は、そのブログに関連するすべてのログを、システム管理画面のログ一覧でログを消去した場合は、すべてのログを消去します。

これは「すべてのログレコードを表示」の右側にある「絞込み」を行っても同じです。

例えば、次のようにエラーレベルのログだけに絞り込んでも、「ログを消去」をクリックすると、非表示になっているログを含め、すべて消去されます。

このプラグインを利用すれば、各ログの左側にチェックボックスを表示します。

次のようにチェックボックスで選択したログだけを削除できるようになります。

一番上のチェックボックスをチェックすれば、そのページに表示されているすべてのログを選択状態にできます(ブログ記事一覧やコメント一覧など、他の一覧ページと同じ操作)。絞込みを行ってから全体を選択すれば特定の種類のログを効率的に削除できます。

システムログも同じようにチェック形式になります。

ということで、必要なログだけを残しておきたい場合などに便利なプラグインです。
3.対応バージョン
2008年10月20日現在の動作確認バージョンは次の通りです。
- Movable Type 4.1x
- Movable Type 4.2x(4.22まで)
4.プラグインのダウンロード
下記のリンクからプラグインアーカイブをダウンロードし、任意のフォルダに保存してください。
5.インストール
プラグインアーカイブを解凍し、中にある LogDeleteSelector フォルダを plugins ディレクトリにアップロードしてください。
ブログ管理画面より「システム」→「プラグイン」でプラグイン一覧を表示し、次のように表示されればOKです。

これでログ一覧にチェックボックスが表示されます。
Movable Type 4.21 から 4.22 へのアップグレード
当ブログを、Movable Type 4.21 から 4.22 へアップグレードしました。変更されているファイルが少ない場合は特定のファイルだけを上書きするのですが、今回は変更ファイルが多かったので、通常のアップグレード手順を紹介します。

アップグレードは個人の責任で行ってください。正常にアップグレードできなかった場合、申し訳ありませんが当ブログに質問を頂いても解決するお手伝いをすることはできません。作業前には1項に示すバックアップ作業などを行い、ブログのバックアップを行ってください。
なお、4.1x から 4.22 にアップグレードされる場合、4.1x と 4.2x のバックアップファイルは互換性がありませんので、ご注意ください。
1.ブログのバックアップ
4.21 の状態でブログのバックアップを取得します。
バックアップした後、正しくバックアップされているかどうか、バックアップファイルを確認した方が良いでしょう。圧縮ファイルでバックアップした場合、バックアップファイルを解凍すれば、XMLファイルなどがテキストエディタで確認できます。
またはバックアップを2回繰り返し、同じサイズになっていれば、経験上大丈夫だと思います。
バックアップはこれ以外にも方法があります。SQLiteであれば、mt-config.cgi に指定してる DBファイルを丸ごとダウンロードしておけば良いでしょう。MySQL であれば、コマンドラインからバックアップを実行するか、phpMyAdmin によるバックアップが可能です。
バックアップはアップグレード前だけでなく、定期的に行いましょう。
2.アプリケーションディレクトリのリネーム
「アプリケーションディレクトリ」は、mt.cgi などがあるディレクトリです。このアプリケーションディレクトリ自体を FTP ツールでリネームして、プログラムを上書きしないようにしています。
例えば、アプリケーションディレクトリ名が
mt
であれば、
mt--
などに変更します。
なお、アプリケーションディレクトリ名を変更した後、一時的にブログ管理画面にアクセスできなくなりますので、注意してください。
3.アプリケーションディレクトリ作成
リネーム前と同じディレクトリを FTP ツールで(同じ位置に)作成します。上の例では、
mt
というディレクトリを作成します。
4.Movable Type 4.22 のアップロード
Movable Type 4.22 のプログラム一式を、アプリケーションディレクトリ配下にアップロードします。
スタティックディレクトリをアプリケーションディレクトリと別のディレクトリに配置している場合は、スタティックディレクトリも手順2~3と同じ要領でディレクトリを作成すると良いでしょう。
5.mt-config.cgi のコピー
旧アプリケーションディレクトリ(mt--)にある mt-config.cgi をFTPツールで一旦ローカルPCにダウンロードし、新アプリケーションディレクトリ(mt)にアップロードします。
この作業を行わずに、うっかり mt.cgi にアクセスすると、新規インストールの動作になってしまう場合があるので注意してください。間違ってアクセスしても、6項のパーミッション変更が行われていなければエラーになります。正常にアクセスできた場合も、ブラウザの操作をそれ以上行わなければ問題ありません。
6.SQLiteのデータベースをコピー(データベースにSQLite/SQLite2を使用している場合)
SQLite を使用していて、データベースファイルが旧アプリケーションディレクトリ(mt--)配下にある場合は、FTP ツールで一旦ローカル PC にダウンロードし、新アプリケーションディレクトリ(mt)配下の同じディレクトリにアップロードします。
SQLite のデータベースファイルがどれか分からない場合は、mt-config.cgi を任意のエディタで開き、Database という項目の右側に書かれている内容が SQLite のデータベースへのパスとファイル名になります。
7.CGIファイルの属性変更
5項でアップロードした、アプリケーションディレクトリ直下にある、各CGIファイル(.cgi)の属性を 644 から 755 や 705 などに変更します。属性が分からない場合は、旧アプリケーションディレクトリの CGI ファイルを参照してください。
8.ブラウザから mt.cgi にアクセス
mt.cgi にアクセスするとアップグレードが開始します。「アップグレード開始」をクリック。

サインインします。

アップグレードを実行します。完了したら「Movable Typeに戻る」をクリック。

アップグレードが完了しました。これでブログ管理画面にアクセスできれば完了です。

9.プラグインファイルのコピー
旧アプリケーションディレクトリから必要なプラグインをコピーします。外部のテンプレートセットを利用していた場合は、必ず新しい plugins ディレクトリに外部テンプレートセットのディレクトリを、plugins ディレクトリにコピーしてください。場合によっては mt-static/plugins ディレクトリからのコピーも必要です。
4.1 からアップグレードした場合、下記の2つのプラグインはコア機能に統合されたので、旧ディレクトリからコピーしないでください(4.1からブログを開始した場合、Template Refresh プラグインは含まれていません)。
- Widget Manager
- Template Refresh
以上です。
このキーボード
ブログの単位・ブログ記事の単位
ブログの単位および、ブログ記事の単位についてご質問を頂きましたので、本エントリーで回答します。「私はこう使っている」という意見がありましたら、本エントリーまたは下記のエントリーにコメント・トラックバックしてやってください。
頂いた質問の内容は次の通りです。
- ブログ記事の正しい単位について(候補「×件」「×記事」「×本」「×エントリー」など)
- ブログの正しい単位について(候補「×ブログ」「×サイト」「×個」など)
- ブログ記事・ブログの単位は決まっているか
以下、個人的な見解を示します。
1.ブログ記事の単位について
ブログ記事の単位は、私自身は「件」を使います。例えばカスタマイズ記事では、
- 「ブログ記事を10件表示します」
という具合です。
「ブログ記事」という名称は、「新聞記事」「特集記事」などと同じ使い方だと思うので、要するに「記事」の単位をそのまま当てはめれば良いのではないでしょうか。つまり「件」が相応しいように思います。次の候補としては「本」。単順に「1つ、2つ...」でもいいと思います。
「エントリー」は、Movable Type に限って言えば、バージョン3までは「ブログ記事」という表現の前身でしたので、このサイトでは単位ではなく名詞として使っています。つまり、
- 「ブログ記事を10エントリー表示します」
ではなく、
- 「エントリーを10件表示します」
という具合です。
と書いておきながら、以下の記事では単位として使ってました。

要するに、文脈や前後で使っている単語で自然に使い分けているようです。
ただし、個人的には「本」と「記事」は単位として使った記憶はありません。
2.ブログの単位について
ブログについては、ウェブサイトと同じ意味で使う場合は「サイト」を使います。
- 「下記の3サイトを参考にさせていただきました」
という具合です。ただし、ブログと通常のウェブサイトとの区別がつかないために、このように使っているだけかもしれません。
Movable Type のカスタマイズで説明する場合などは、単純に「1つ」「2つ」と書いてます。
- 「ポータルブログは3つのブログの情報を集約します」
という感じです。
ただ、「つ」では9までしか数えられないので、そう考えると「個」の方が相応しいようにも思います。
3.ブログ記事・ブログの単位は決まっているか
ということで、ブログ記事・ブログの単位は特に決めて使っていません。何の根拠もなく飛躍して結論すると、世間的にも決まっていないと思います。
ちなみに総務省の次の資料の3~5ページの図表では、それぞれ次の単位を使っています。
- ブログ:ブログ
- ブログ記事:件
「最近のコメント一覧のページ」を作りました
「サイドバーの『Recent Comments(最近のコメント)』より、さらに過去の履歴を見たいのですが」というご要望がありました(頂いたご要望がコメントかメールか失念してしまいました...)ので、「最近のコメント一覧のページ」を作ってみました。
再構築のコストを考えて、今のところ最新500件のコメントを表示しています。
また、各ページの左サイドバーにある「Recent Comments」の一番下に、最新のコメント一覧のページにジャンプするリンク(下)を追加しました。

これに伴い、100件表示していた「Recent Comments」の表示件数を減らしました。
Movable Type 4.22 リリース
Movable Type 4.22 がリリースされました。
公式サイトのニュースでは「セキュリティアップデート」となっていますが、4.21 との差分を確認した限りでは多くのバグフィックスが含まれているようです。
[重要] セキュリティアップデート Movable Type 4.22 の提供を開始
Movable Type の管理画面において、クロスサイトスクリプティングによる脆弱性が確認されました。この問題に対処するため、Movable Type の修正バージョンを公開致します。脆弱性の修正バージョンとなりますので、アップデートを強く推奨致します。
次のバージョンが修正版としてリリースされています。
- Movable Type 4.22 (Open Source)
- Movable Type 4.22 (Professional Pack, Community Pack を同梱)
- Movable Type Commercial 4.22 (Professional Pack を同梱)
- Movable Type Enterprise 4.22
それぞれの最新版は下記のリンクからダウンロードできます。
Movable Type Pro の 4.21-ja と 4.22-ja の差分ファイルは次の通りです。ファイルの差し替えではなく、通常の手順にもとづいた Movable Type のアップグレードを推奨します。
- addons/Commercial.pack/config.yaml
- addons/Commercial.pack/lib/CustomFields/App/CMS.pm
- addons/Commercial.pack/lib/CustomFields/Template/ContextHandlers.pm
- addons/Commercial.pack/lib/CustomFields/Util.pm
- addons/Commercial.pack/lib/MT/Commercial/L10N/ja.pm
- addons/Commercial.pack/lib/MT/Commercial/Util.pm
- addons/Commercial.pack/tmpl/list_field.tmpl
- addons/Community.pack/config.yaml
- addons/Community.pack/lib/MT/App/Community.pm
- addons/Community.pack/lib/MT/Community/CMS.pm
- addons/Community.pack/lib/MT/Community/Tags.pm
- addons/Community.pack/lib/MT/Community/Util.pm
- addons/Community.pack/templates/global/javascript.mtml
- addons/Community.pack/templates/global/signin.mtml
- addons/Community.pack/tmpl/widget/most_popular_entries.mtml
- addons/Community.pack/tmpl/widget/recent_submissions.mtml
- addons/Community.pack/tmpl/widget/recently_scored.mtml
- lib/MT/App/ActivityFeeds.pm
- lib/MT/App/CMS.pm
- lib/MT/App/Comments.pm
- lib/MT/App/Search.pm
- lib/MT/App.pm
- lib/MT/Asset/Image.pm
- lib/MT/Blog.pm
- lib/MT/CMS/Asset.pm
- lib/MT/CMS/Blog.pm
- lib/MT/CMS/Common.pm
- lib/MT/CMS/Dashboard.pm
- lib/MT/CMS/Entry.pm
- lib/MT/CMS/Search.pm
- lib/MT/CMS/Tools.pm
- lib/MT/CMS/TrackBack.pm
- lib/MT/ImportExport.pm
- lib/MT/L10N/ja.pm
- lib/MT/Memcached.pm
- lib/MT/Object.pm
- lib/MT/ObjectDriver/Driver/DBI.pm
- lib/MT/Permission.pm
- lib/MT/Sanitize.pm
- lib/MT/Tag.pm
- lib/MT/Template/Context.pm
- lib/MT/Template/ContextHandlers.pm
- lib/MT/Template.pm
- lib/MT/TemplateMap.pm
- lib/MT/Upgrade.pm
- lib/MT/WeblogPublisher.pm
- lib/MT.pm
- mt-check.cgi
- mt-static/js/archetype_editor.js
- mt-static/mt_de.js
- mt-static/mt_es.js
- mt-static/mt_fr.js
- mt-static/mt_ja.js
- mt-static/mt_nl.js
- php/lib/function.mtauthorbasename.php(追加)
- php/lib/function.mtentrybasename.php
- php/lib/function.mtfiletemplate.php
- php/lib/function.mtvar.php
- php/lib/modifier.setvar.php
- php/lib/MTUtil.php
- php/lib/sanitize_lib.php
- php/lib/thumbnail_lib.php
- php/mt.php
- plugins/Cloner/cloner.pl
- plugins/StyleCatcher/lib/StyleCatcher/CMS.pm
- tmpl/cms/cfg_archives.tmpl
- tmpl/cms/dialog/comment_reply.tmpl
- tmpl/cms/edit_asset.tmpl
- tmpl/cms/edit_commenter.tmpl
- tmpl/cms/edit_entry.tmpl
- tmpl/cms/edit_role.tmpl
- tmpl/cms/error.tmpl
- tmpl/cms/include/asset_table.tmpl
- tmpl/cms/include/comment_detail.tmpl
- tmpl/cms/include/entry_table.tmpl
- tmpl/cms/include/header.tmpl
- tmpl/cms/include/import_start.tmpl
- tmpl/cms/include/list_associations/page_title.tmpl
- tmpl/cms/include/listing_panel.tmpl
- tmpl/cms/include/log_table.tmpl
- tmpl/cms/include/template_table.tmpl
- tmpl/cms/list_comment.tmpl
- tmpl/cms/list_ping.tmpl
- tmpl/cms/list_role.tmpl
- tmpl/cms/list_template.tmpl
- tmpl/cms/popup/rebuild_confirm.tmpl
- tmpl/cms/popup/rebuilt.tmpl
- tmpl/cms/rebuilding.tmpl
- tmpl/cms/widget/blog_stats_comment.tmpl
- tmpl/cms/widget/blog_stats_entry.tmpl
- tmpl/cms/widget/blog_stats_tag_cloud.tmpl
- tmpl/cms/widget/this_is_you.tmpl
記事タイトルを番号順に並べる for Movable Type 4.2
Movable Type 4.2 で、ランダムに作成したブログ記事やウェブページのタイトルの先頭に「1、2、3...」という番号を割り当てている場合、番号順に記事タイトルを並べるカスタマイズです。
次のように、ランダムに作成したウェブページがあると仮定します。

これらのウェブページを、次のようにタイトルに付与した番号順に並べて表示することを想定します。
- ウェブページA
- ウェブページB
- ウェブページC
- ウェブページD
- ウェブページE
- ウェブページF
- ウェブページG
- ウェブページH
- ウェブページI
- ウェブページJ
- ウェブページK
- ウェブページL
並び替える方法として、次のようなサブテンプレートが思いつくでしょう。
<mt:pages sort_by="title" sort_order="ascend">
<mt:pagesHeader>
<ul>
</mt:pagesHeader>
<li><a href="<mt:pagePermalink />" title="<mt:pageTitle escape="html" />"><mt:pageTitle escape="html" /></a></li>
<mt:pagesFooter>
</ul>
</mt:pagesFooter>
</mt:pages>
MTPages タグに sort_order モディファイアに title を設定することで title でソートします。また sort_order モディファイアに ascend を設定することで昇順表示します。
しかしながら、出力結果から、大きな番号のものが正常にソートされないことが分かります。

そこで次のサブテンプレートを利用します。
<mt:pages>
<mt:if tag="pageTitle" like="^\d\..*">
<mt:setVarBlock name="key"><mt:pageTitle escape="html" regex_replace="/^(\d)\..*/","0$1" /></mt:setVarBlock>
<mt:elseIf tag="pageTitle" like="^\d+\..*">
<mt:setVarBlock name="key"><mt:pageTitle escape="html" /></mt:setVarBlock>
</mt:if>
<mt:setVarBlock name="val"><li><a href="<mt:pagePermalink />" title="<mt:pageTitle escape="html" />"><mt:pageTitle escape="html" /></a></li></mt:setVarBlock>
<mt:setVar name="title_data{$key}" value="$val" />
</mt:pages>
<mt:loop name="title_data" sort_by="key numeric">
<mt:if name="__first__">
<ul>
</mt:if>
<mt:getVar name="__value__" />
<mt:if name="__last__">
</ul>
</mt:if>
</mt:loop>
複雑に見えますが、やりたいことは「記事タイトルの項番が1桁のときに、項番の頭に『0』を付与して、その値でソート」です。つまり、「1、2、3...」という項番を「01、02、03...」に変換し、桁数を統一します。そして、変換した記事タイトルでソートします。
2行目の MTIf タグの like モディファイアで、記事タイトルの先頭に1桁の番号とピリオドがついているものだけをフィルタリングし、ブロック内で変数 key にウェブページタイトルを設定します。そのとき regex_replace モディファイアで、1桁の項番の前に「0」を付与しています。
4行目では記事タイトルの先頭に2桁の番号とピリオドがついているものだけをフィルタリングし、ブロック内で変数 key にウェブページタイトルを設定します。ここでは何も加工しません。
7行目の setVarBlock タグでは、実際の出力に使うウェブページタイトル(マークアップつき)を、変数 val に取得します。
そして、8行目の setVar タグで、ハッシュ変数 title_data に、キーが変数 key、値に変数 val を設定します。これでウェブページタイトルをソートする準備ができました。
後は、11行目の MTLoop タグで、変数 title_data を読み込ませ、sort_by モディファイアで、ハッシュのキーを数値によりソートします。念のため、1~8行目の桁合わせの処理をせずに MTLoop タグの数値によるソートを行ってみましたが、期待通りの結果にはなりませんでした。
これで次のような出力を得ることができます。

なお、インデックステンプレートを利用してウェブページ全体を出力するには、次のように lastn モディファイアに件数を指定する必要があるかもしれません。
<mt:blogPageCount setvar="page_count">
<mt:pages lastn="$page_count">
...後略...
ブログ記事で利用する場合は、サブテンプレートの「mt:pages」や「mt:pageXX」を、「mt:entries」「mt:entryxx」に置き換えてください。
本エントリーでは、テンプレートタグだけで並べ替えを実現する方法を紹介しましたが、番号順に並べる方法は色々あります。例えば、記事タイトルを最初から「01、02、03...」と設定しておき、出力時に先頭の 0 を削除する方法でも構いません。あるいは、概要フィールドにソート用の数値を設定しておき、MTPages タグで sort_by="excerpt" を設定するのも良いでしょう。カスタムフィールドを利用する手もあります。
2008.12.21
ハッシュ変数名に「title」という名称を用いるとエラーになるため、ハッシュ変数名を変更しました。
Movable Type 4.2 検索結果ページのカスタマイズ:検索結果の見出しに(現在のページ/総ページ数)を表示する
Movable Type 4.2 の検索結果ページのカスタマイズで、2回目は「検索結果の見出しに(現在のページ/総ページ数)を表示する」を紹介します。
その2:検索結果の見出しに「現在のページ/総ページ数」を表示する
デフォルトテンプレートでは検索結果がページ分割された場合、「現在のページ/全体のページ数」が表示されないので、現在表示しているページが何ページ目かがちょっと分かりにくいです。

カスタマイズ後はこのように「現在のページ/全体のページ数」を表示します。

表示するには、次のようなサブテンプレートを MTSearchResults タグブロック内の MTSearchResultsHeader タグにある見出し用要素に追加します。
デフォルトテンプレートの場合
<div id="search-results">
<span id="current-page" class="hidden"><$mt:CurrentPage$></span>
<h1 id="page-title" class="search-results-header">
<mt:IfStraightSearch>
「<$mt:SearchString$>」と一致するもの
</mt:IfStraightSearch>
<mt:IfTagSearch>
タグ「<$mt:SearchString$>」が付けられているもの
</mt:IfTagSearch>
(<mt:currentPage>/<mt:totalPages />)
</h1>
配布テンプレートの場合(設定済み)
<h2 class="search-results-header">
<mt:ifStraightSearch>
「<mt:searchString />」
</mt:ifStraightSearch>
<mt:ifTagSearch>
タグ「<mt:searchString />」
</mt:ifTagSearch>
の検索結果(<mt:currentPage>/<mt:totalPages />)
</h2>
補足ですが、検索結果テンプレートは、ブログ検索・タグ検索で共通なので、見出し要素の内容は、ブログ検索・タグ検索のいずれかで出力内容を振り分けています。したがって、「現在のページ/総ページ数」を表示するタグは、ブログ検索・タグ検索の振り分けに依存しないよう、見出し要素の終了タグの直前に設定しています。
ページ分割しないときは表示しない
上記の設定では、検索結果でページ分割しないときも、次のように(1/1)という表示が出力されてしまいます。

ページ分割がないときに「現在のページ/全体のページ数」を表示したくない場合は、追加したタグを MTIf タグで括ると良いでしょう。
<h2 class="search-results-header">
<mt:ifStraightSearch>
「<mt:searchString />」
</mt:ifStraightSearch>
<mt:ifTagSearch>
タグ「<mt:searchString />」
</mt:ifTagSearch>
の検索結果<mt:if tag="totalPages" ne="1">(<mt:currentPage>/<mt:totalPages />)</mt:if>
</h2>
関連記事
ブログ論壇の誕生 - 佐々木俊尚が選んだ著名ブロガーリストのOPML
本書は、佐々木俊尚氏が文芸春秋の月刊誌「諸君!」に連載しているものを主に元にして、全面的に改稿し、書籍化したものです。
![]() | ブログ論壇の誕生 (文春新書 (657)) 佐々木 俊尚 文芸春秋 2008-09 売り上げランキング : 4678 Amazonで詳しく見る by G-Tools |
現在のネット界で起こっている数々の問題を、佐々木俊尚氏の鋭い語り口でまとめられていて、大変興味深く読ませていただきました。
- Ⅰ ブログ論壇はマスコミを揺さぶる
- 第1章 毎日新聞低俗記事事件
- 「非対象戦争」
- 日本人女性を貶めた『毎日デイリーニューズ』
- 世代間対立とマスメディア-インターネット対立
- 『毎日jp』から広告が消滅
- 誰に謝っていいのかわからない
- 第2章 あらたにす
- 朝日・読売・日経の三紙合同ポータルサイト
- ネット世界のさんざんな評価
- マスメディアのプレゼンス低下
- ルパート・マードックの嗅覚
- ブログは新聞を凌駕するか
- 第3章 ウィキペディア
- 「ウィキスキャナー」が暴露した"修正"
- 利用者のIPアドレスが自動記録
- 北海道庁からの書き足し
- 紙一重の「情報操作」と「公平な書き込み」
- 可視化された社会システム
- Ⅱ ブログ論壇は政治を動かす
- 第4章 チベット問題で激突するウヨとサヨ
- 「人権団体」への攻撃
- 左右党派のドグマに呑み込まれる危惧
- 左派の反応
- 倫理は首尾一貫しているべきではないか
- インターネット空間に馴染まない"党派性"
- 第5章 「小沢の走狗」となったニコニコ動画
- 参院選公示直前に小沢代表が登場
- 動画は情念をベースとした新たな圏域
- 荒れまくったニコニコ動画
- 善意か悪意か
- 加藤紘一氏の牧歌的な思い込み
- すべてが見えてしまう空間
- 第6章 志井和夫の国会質問
- ユーチューブで三万回、ニコニコ動画で一万回の閲覧
- 雇用格差問題一点に絞った質問
- 「CGJ(志位グッジョブ)」
- ブログ論壇的追求スタイル
- 落ち着いた議論の場になりうるか
- 日本型「世間」的公共圏への可能性
- 第7章 安部の窮地に暗躍した広告ロボット
- 自民党の広報戦略か
- アフィリエイト広告モデルで配信
- 売れた分だけ広告費を支払う
- 中身の薄いブログが増えるのはなぜか
- 集合知を脅かす「機械戦術」
- 「言論」vs.「機械言論」
- Ⅲ ブログ論壇は格差社会に苦悩する
- 第8章 辛抱を説く団塊への猛反発
- 官僚出身教授に対する猛反発
- 「われわれ若者を育ててほしい」
- 激烈な世代間対立
- 「希望は、戦争。」
- 第9章 トリアージ
- 「かわいそうだ」
- 「全体や組織から見た最適」
- 「普通にかわいそうなんですが」
- 「あっけらかんとトリアージを語ることは不可能」
- 第10章 承認という問題
- 秋葉原連続殺傷犯「自分はもてない」「彼女がいない」
- 「自分は承認されていない」
- 「血族・地域集団が承認を与える時代を終えた」
- 無条件の承認は得られないのだろうか
- 第11章 ケータイが生み出す新たなネット論壇世界
- 「みんながパソコンから逃げ出してる」
- 「ケータイ世代」
- 親密で暖かいプライベート空間
- パソコンからは見られない『モバゲータウン』
- ケータイは「つながり」のメディア
- 「地元にいれば仲間はいる」
- ホーボー化する若者たち
- 社会との細いつながり
- ケータイ小説は感情でつながる
- Ⅳ ブログ論壇はどこへ向かうのか
- 第12章 『JJ』モデルブログ
- 「ブログに感想を書けば謝礼も支払われます」
- ライブドア事件報道に異を唱えた「専門家ブロガー」
- 民俗学者・柳田國男の指弾
- 信用されなくなったマス広告
- 「巨大な貯め池」「サラダボウル」
- なぜ彼女のブログは炎上したのか
- 第13章 光市「1.5人」発言-ブログの言論責任は誰にあるのか
- 青山学院大学学長が謝罪
- 訴えられたお茶ノ水女子大学
- 「いったい誰が言論の責任を負うべきなのか」
- 「おまえの属している共同体に連帯責任を取らせろ」
- 首をつって自殺した連合赤軍幹部の父
- 第14章 青少年ネット規制法
- 「ネットを規制すべきだ」の大合唱
- 霞ヶ関・永田町連合vs.総インターネット
- 「有害情報」「その他不適切情報」の線引きは可能か
- 「有害情報」は利用者の事情で変わる
- 無意味に新法が成立
- 第15章 「ブログ限界論」を超えて
- 「最近ブログがつまらなくないですか?」
- ブログからSNS、ケータイへ
- 集中砲火
- アーキテクチャが社会を変える
- 「やがてまた二〇〇五年のような局面が生じてくるはずだ」
- 情報を絞り込む毎日新聞への苛立ち
- 対等に渡り合う枠組み作り
「佐々木俊尚が選んだ著名ブロガーリスト」のOPMLを作りましたので、以下のリンクからご自由に持っていってください。
フィードが配信されていないサイトは除外しています。
チャレンジ! Movable TypeをCMSとして使ってみよう!(第5回 head要素の中身を作る/グローバルナビゲーションを作る)
またまた遅くなりましたが、フリーランスWebデザイナー・黒野明子さんの gihyo.jp で Movable Type の連載第5回が公開されています。
チャレンジ! Movable TypeをCMSとして使ってみよう!- 第5回 head要素の中身を作る/グローバルナビゲーションを作る
第5回は「head要素の中身を作る/グローバルナビゲーションを作る」です。
今回は、テンプレートモジュールを利用したキーワードの meta 要素の keywords への反映、カスタムフィールドを利用して「カテゴリ用キーワード」を作成し、入力した内容を meta 要素の description への反映、テンプレートモジュールを利用したグローバルナビゲーションの表示を行っています。
いつものように、「ほげ山くん」と「くれま先輩」が会話形式で進めます。
お詫び
今回の記事では、メインページを判定する変数 main_index と検索結果を判定する変数 search_results は予めシステムで設定されているという説明がありまして、私も気がついておりませんでした。この件については拙著「Movable Type 4.2 パーフェクトガイド」に反映されていませんでしたので、この場をお借りしてお詫び申し上げます。
で、ちょっと調べてみたところ、変数 search_results は 4.2 からシステム内部で設定されたのですが、変数 main_index については、厳密にはテンプレートセットで記述した値が利用されるようです。
「既定のブログ」であれば、lib/MT/DefaultTemplates.pm の設定(下記の青色)が反映されます。
...前略...
BEGIN {
$templates = {
'index' => {
'main_index' => {
label => 'Main Index',
outfile => 'index.html',
rebuild_me => 1,
...後略...
青色部分はテンプレートの「テンプレートの種類(identifier)」に該当するのですが、各インデックステンプレートの再構築時点でこの「テンプレートの種類」が、lib/MT/Template.pm の下記の青色の行で変数として設定されます。
sub build {
my $tmpl = shift;
my($ctx, $cond) = @_;
$ctx ||= $tmpl->context;
my $timer = MT->get_timer();
local $timer->{elapsed} = 0 if $timer;
local $ctx->{__stash}{template} = $tmpl;
my $tokens = $tmpl->tokens
or return;
my $build = $ctx->{__stash}{builder} || MT::Builder->new;
my $page_layout;
if (my $blog_id = $tmpl->blog_id) {
$ctx->stash('blog_id', $blog_id);
my $blog = $ctx->stash('blog');
unless ($blog) {
$blog = MT::Blog->load($blog_id) or
return $tmpl->error(MT->translate(
"Load of blog '[_1]' failed: [_2]", $blog_id, MT::Blog->errstr ));
$ctx->stash('blog', $blog);
} else {
$ctx->stash('blog_id', $blog->id);
}
MT->config->TimeOffset($blog->server_offset);
$page_layout = $blog->page_layout;
}
$page_layout = $tmpl->page_layout if $tmpl->page_layout;
$ctx->var( 'page_layout', $page_layout )
unless $ctx->var('page_layout');
if (my $layout = $ctx->var('page_layout')) {
my $columns = {
'layout-wt' => 2,
'layout-tw' => 2,
'layout-wm' => 2,
'layout-mw' => 2,
'layout-wtt' => 3,
'layout-twt' => 3,
}->{$layout};
$ctx->var( 'page_columns', $columns ) if $columns;
}
$ctx->var( $tmpl->identifier, 1 ) if defined $tmpl->identifier;
$timer->pause_partial if $timer;
my $res = $build->build($ctx, $tokens, $cond);
if ($timer) {
$timer->mark("MT::Template::build[" . ($tmpl->name || $tmpl->{__file} || "?").']');
}
unless (defined($res)) {
return $tmpl->error(MT->translate(
"Publish error in template '[_1]': [_2]",
$tmpl->name || $tmpl->{__file}, $build->errstr));
}
$res =~ s/^\s*//;
return $res;
}
つまり外部のテンプレートセットに入れ替えて利用する場合は、外部テンプレートセットの identifier の設定に依存するので、次のような config.xml であれば、メインページで設定される変数が main_index でない可能性もあります。
...前略...
'index' => {
'top_page' => {
label => 'Main Index',
outfile => 'index.html',
rebuild_me => 1,
...後略...
ということで、指摘をされた方への指摘ですが、デフォルトテンプレートをカスタマイズするのであれば、変数 main_index が利用でき、そうでない場合は、テンプレートセットの設定(またはテンプレート編集画面の「テンプレートの種類」)から利用可能な変数を確認する、というのが正しい解釈です。
社務所は
Movable Type 4.2 検索結果ページのカスタマイズ:1ページに表示する件数を変更する
Movable Type 4.2 では検索結果ページをページ分割する機能が追加されました。
ということで、Movable Type 4.2 の検索結果ページのカスタマイズについて何回かに分けて紹介したいと思います。
今のところ、以下のようなカスタマイズを予定しています。思いついたら随時追加します。
- 1ページに表示数する件数を変更する
- 検索結果の見出しに「現在のページ/総ページ数」という表示を設定する
- 検索結果が1ページだけのときに「1」という表示をなくす
- ナビゲーションを検索結果の上下に表示する
- ページ遷移をプルダウンメニューにする
- ナビゲーションで表示する前後ページを制限する
その1:1ページに表示数する件数を変更する
サンプルとして、test というキーワードで検索した結果、次の5件がヒットしたとします。

これを、1ページに表示する件数を3件に変更して、4件目以降はページ分割するというカスタマイズが可能です。

ちなみに、デフォルト状態では1ページに20件まで表示し、検索結果が20件を超えるとページ分割を行います。
1ページに表示数する件数を変更するには、mt-config.cgi に環境変数 SearchMaxResults を追加します。例えば、1ページに表示する件数を10件にする場合は次のように記述します。
SearchMaxResults 10
この追加を行った後、再構築を行うと、検索フォームにある次の MTSearchMaxResults タグに値が反映されます。
<input type="hidden" name="limit" value="<$mt:SearchMaxResults$>" />
言い換えると、環境変数の変更を行っただけでは検索フォームに設定が反映されないので注意が必要です。
類似した環境変数で MaxResults がありますが、これは 4.15 以前で使用する環境変数です(4.2 で設定しても SearchMaxResults と同じ動作にはなるようです)。
環境変数 SearchMaxResults は「Movable Type 4.2 パーフェクトガイド」の 347 ページに掲載しています。
![]() | Movable Type 4.2 パーフェクトガイド 荒木 勇次郎 毎日コミュニケーションズ 2008-07-31 売り上げランキング : 2552 Amazonで詳しく見る by G-Tools |
Movable Type 4.2 配布テンプレートセット修正(検索結果ページ)
配布中の Movable Type 4.2 テンプレートをバージョンアップしました。変更内容は、検索結果画面について、4.2 の検索結果ページのページ分割機能への対応です。

テンプレートをご利用中で検索結果機能を利用したい場合は、下記のリンクから最新版のテンプレートセットをダウンロードしてください。
ダウンロードしたテンプレートセットを plugins ディレクトリにアップロードして、下記のテンプレートを初期化すればOKです。
- インデックステンプレート:スタイルシート
- システムテンプレート:検索結果
- ウィジェット:検索
変更箇所は次の通りです。テンプレートを初期化したくない場合は、該当する内容を追加または変更してください。ただし、システムテンプレートの「検索結果」は全面的に作り直しているため、初期化をお願い致します。
1.インデックステンプレート:スタイルシート
下記のセレクタを追加してください。
.search-results-header {
margin: 8px 0 15px;
font-size: 120%;
}
2.ウィジェット:検索
下記の青色部分を追加してください。
<dt class="sidetitle">
Search this site
</dt>
<dd class="side">
<form method="get" action="<mt:CGIPath /><mt:SearchScript />">
<fieldset>
<input type="hidden" name="IncludeBlogs" value="<mt:blogID />" />
<input type="hidden" name="limit" value="<mt:searchMaxResults />" />
<input id="search" tabindex="8" accesskey="t" name="search" size="20" value="" />
<input type="submit" tabindex="9" accesskey="s" value="Search" />
</fieldset>
</form>
</dd>
XAMPP for Windows で FastCGI を利用する
Category:[自宅サーバ]
Tag:[Apache, FastCGI, MovableType, Performance, Windows]
Permalink
XAMPP for Windows で FastCGI を利用する方法を紹介します。利用する CGI は特定していませんが、説明の最後で Movable Type 4 で利用する手順を説明します。
FastCGI は CGI の実行プロセスをメモリに常駐させることで、プロセス起動にかかる時間を削減
し、CGI の動作速度を向上させるものです。CGI の実行速度は体感できるほど劇的に向上します。ローカル環境で Movable Type 4 を動作させる場合などにおすすめです。
かなり以前に紹介した「Windows XP 自宅サーバで FastCGI を利用する for Movable Type 3.34」から若干設定内容が変わっていますので、改めて書き直してみました。
今回は次の環境で動作を確認しています。
- Windows XP / Windows Vista
- XAMPP 1.6.6a(Apache 2.2.8)+ Perl 5.8.8(XAMPP Perl または ActivePerl)
最新の XAMPP 1.6.8 では動作を確認できていません(1.6.7では動作しませんでした)。
1.FastCGI モジュールのダウンロード
Apache モジュールの FastCGI をダウンロードします。
FastCGI のサイトへ行き、グローバルナビゲーションの FastCGI Servers をクリック。
![]()
Apache の Current: の横にある download のリンクをクリック。
![]()
mod_fastcgi-2.4.6-AP22.dll をクリック(2008年9月現在のバージョン)
![]()
ダウンロードが開始するので、C:¥xampp¥apache¥modules に保存。
過去のバージョンを取得したい場合は、一覧の一番上に表示されている old をクリックします。
2.httpd.conf の修正
Apache の設定ファイル C:¥xampp¥apache¥conf¥httpd.conf を任意のエディタで開いて編集します。
まず、
#LoadModule rewrite_module modules/mod_rewrite.so
を探し、行頭の # を削除して
LoadModule rewrite_module modules/mod_rewrite.so
に変更します。
次に、LoadModule が並んでいる一番最後に下記の1行を追加します。
LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll
mod_fastcgi-2.4.6-AP22.dll の部分は、ダウンロードした FastCGI モジュールのファイル名と一致するようにしてください。
その下に次の内容を追加します。
<IfModule mod_fastcgi.c>
FastCGIConfig -autoUpdate -idle-timeout 120 -killInterval 3600 -maxClassProcesses 3 -maxProcesses 15 -startDelay 30
AddHandler fastcgi-script .fcgi
</IfModule>
追加後の httpd.conf(関連部分を抜粋) は次のようになります。
![]()
FastCgiConfig の設定については、下記のサイトの詳しい解説を参考にさせて頂きました。ありがとうございました。
3.Apache 再起動
XAMPP のコントロールパネルを開き、Apache を再起動します。具体的には「停止中」をクリック。

開始をクリック。

これで左側に緑色の「起動」が表示されればOKです。

「開始」をクリックして10秒以上待っても起動しない場合は、もう一度クリックしてみてください。
何回クリックしても Apache が起動しない場合は、httpd.conf で設定した FastCGI のファイル名が存在しない/httpd.conf に追加した設定内容が誤っている/XAMPP for Windows の不具合、のいずれかの可能性があります。
4.Perl モジュールのインストール
FastCGI を Perl で利用するために、FCGI モジュールをインストールします。
4.1 PPM GUI でインストール
ActivePerl をインストールしている場合は、「すべてのプログラム」→「ActivePerl 5.8.8~」→「Perl Package Manager」を選択して、PPM GUI を起動します。XAMPP Perl の場合は ¥xampp¥perl¥bin¥ppm.bat をダブルクリックすれば(多分)起動します。
一番左のアイコンがクリックされている状態で、上部の検索フィールドに FCGI を入力します。これで FCGI が表示されます。
FCGI をクリックして、検索フィールド右のアイコンをクリック。これでインストール対象になります。
もうひとつ右のアイコンをクリックするとインストール実行の確認ダイアログを表示します。
OK をクリックすればインストールが開始します。しばらく待ちましょう。
これで FCGI のインストールが完了しました。PPM GUI を終了してください。
![]()
4.2 コマンドプロンプトからインストール
コマンドプロンプトを起動して、ppm install FCGI を入力すれば、FCGI をインストールできます。
![]()
xampp Perl を利用している場合は、ppm コマンドにパスが通っていない可能性があるので、cd コマンドで C:¥xampp¥perl¥bin に移動してから ppm コマンドを実行しましょう。
5.Movable Type で FastCGI を利用する
5.1 CGI ファイル名の変更
Movable Type の CGI が FastCGI で動作するよう、ファイル名を変更(またはコピーしてリネーム)します。
次の CGI ファイルの拡張子を .cgi から .fcgi に変更します。
mt.cgimt-comments.cgimt-tb.cgimt-search.cgi
変更後のファイル名は次のようになります。
mt.fcgimt-comments.fcgimt-tb.fcgimt-search.fcgi
5.2 環境設定ファイルの変更
mt-config.cgi を任意のエディタで開き、次の項目を追加します。
AdminScript mt.fcgi
CommentScript mt-comments.fcgi
TrackbackScript mt-tb.fcgi
SearchScript mt-search.fcgi
なお、MT3.x で設定していた下記の項目は、mt-view.cgi はなくなったため、設定の必要はありません。
ViewScript mt-view.fcgi
これで、ブラウザから mt.fcgi にアクセスすれば、Movable Type を FastCGI で動作させることができます。初回アクセスは多少時間がかかりますが、常駐された2回目以降のアクセスは FastCGI の効果を体感できると思います。
5.3 注意事項
後で追加したプラグインは動作しない場合があります。
2008.10.08
pp.bat → ppm.bat に修正しました。
休日表示付リアルタイムカレンダー(横型) for FC2ブログ
FC2 ブログの横型カレンダーに土・日・休日・本日を表示するカスタマイズです。
以前ご質問を頂いたもので、本エントリーにて紹介します。

テーブル型のカレンダーに休日表示を行う場合は「休日表示付リアルタイムカレンダー for FC2ブログ」を参照してください。
1.休日表示用カレンダースクリプトのダウンロード
下記の download を右クリックして「対象をファイルに保存」または「名前をつけてリンク先を保存」を選択し、休日表示用カレンダースクリプトをダウンロードします。ファイル名は dayChecker.js で保存してください。
2.スクリプトのアップロード
ダウンロードした dayChecker.js をFC2ブログの「ツール」→「ファイルのアップロード」機能を使ってアップロードしてください。アップロードした URL は後の手順で利用しますj。
3.テンプレートの修正1(スクリプトのインクルード)
テンプレートの <head>~</head> の間に下記の設定を追加してください。
<script type="text/javascript" src="dayChecker.js アップロードしたURL" charset="utf-8"></script>
dayChecker.js の文字コードは utf-8 で作成していますが、FC2ブログの文字コード(EUC)に変更してアップロードする場合、上記のタグは charset 属性を省いた形で設定してください。
4.テンプレートの修正2(カレンダーの追加)
カレンダーを表示したい部分に、下記のカレンダー表示タグを追加してください。
当ブログで配布している「FC2 ブログテンプレート」のHTML(横型カレンダー版)を使用している場合、このタグは設定済みなので、新たに設定する必要はありません。
<div id="globalnavi">
<a href="<%prev_month_link>" title="<%prev_month>月のページへ"><</a>
<%now_year>年<%now_month>月 |
<!--calender2-->
<span class="day2"><%days></span>
<!--/calender2-->
<a href="<%next_month_link>" title="<%next_month>月のページへ">></a>
</div>
5.テンプレートの修正2(休日表示用スクリプトの追加)
4項のタグより下(またはbody 終了タグの直前)に、下記の休日表示用スクリプトを追加してください。
<script type="text/javascript">
<!--
function setWeekendAndHoliday() {
var element = document.getElementById("globalnavi");
var elements = element.getElementsByTagName("a");
var href = elements[0].getAttribute("href");
href.match(/blog-date-(\w\w\w\w)(\w\w)\.html/);
var year = RegExp.$1;
var month = parseInt(RegExp.$2,10) + 1;
if (month == 13) {
month = 1;
year++;
}
var spans = element.getElementsByTagName("span");
var day;
for (i = 0; i < spans.length; i++) {
if (spans[i].className == "day2") {
if(spans[i].innerHTML.indexOf("href") != -1){
day = spans[i].getElementsByTagName("a")[0].innerHTML;
} else {
day = spans[i].innerHTML;
}
if (dc.isHoliday(year, month, day)) {
if (dc.isToday(year, month, day)) {
spans[i].className = 'day2 tholiday';
} else {
spans[i].className = 'day2 holiday';
}
} else if(dc.isSaturday(year, month, day)) {
if (dc.isToday(year, month, day)) {
spans[i].className = 'day2 tsaturday';
} else {
spans[i].className = 'day2 saturday';
}
}
if(dc.isToday(year, month, day)) {
spans[i].className = 'day2 today';
}
}
}
}
var dc = new dayChecker();
setWeekendAndHoliday();
//-->
</script>
6.CSS修正
下記のセレクタをスタイルシートに追加してください。
.holiday,
.holiday a:link {
color: #e50003;
}
.saturday,
.saturday a:link {
color: #0000ff;
}
.tholiday {
border: 1px solid #444444;
color: #e50003;
}
.tholiday a:link {
color: #e50003;
}
.tsaturday {
border: 1px solid #444444;
color: #0000ff;
}
.tsaturday a:link {
color: #0000ff;
}
.today {
display: inline;
color: #444444;
border: 1px solid #444444;
}
当ブログの「FC2 ブログテンプレート」をご利用の場合は、既存の下記の設定を削除してください。
.today {
display: block;
text-align: center;
color: #444444;
border: 1px solid #444444;
}
削除しないと、当日の表示枠が横いっぱいにひろがってしまいます。下は10月6日が当日の例です。左右をトリミングしていますが、10月6日を囲んでいる枠が左右にひろがってしまっています。

以上です。
世界最古の Movable Type サイト
ふと思い立って、「一番古いバージョンの Movable Type を使っている(厳密にはアクセス可能なページとして残っている)サイト」をネットで探してみました。タイトルはちょっと意味が違うかもしれませんが語感で決めました。
ということで、Movable Type のクレジットをキーに Google でヒットしたサイトを紹介します。「世界最古」と書いておきながら、国内最古の Movable Type サイトも紹介しています。更新の有無は条件にしていません。
国内ではバージョン 2.5 のサイトが2つ、海外ではメジャーバージョン1.x のサイトを見つけた分だけ、証拠のクレジットとサイトのトップ画面を掲載しておきます。国内については、2.661 で運用しているサイトを含めると結構な数になりそうなので、このエントリーでは対象外にしています。すいません。
他にもご存知のサイトがありましたらご連絡ください。
1.国内のサイト
Movable Type 2.5
Lisu in Japan

No-techblog

2.海外のサイト
3位:Movable Type 1.2(1サイト)
funk~station

2位:Movable Type 1.1(2サイト)
Harvest Moon

Robert J. Berghausen

1位:Movable Type 1.0(2サイト)
C-Uracing

Volo Libero

ジューシーな感じを
Amazon 2008年9月の注文ランキング
2008 年 9 月の Amazon 注文ランキングです。今月は Movable Type 4.2 の書籍が多くランクインしています。
1位:Movable Type 4.2 パーフェクトガイド
![]() | Movable Type 4.2 パーフェクトガイド 荒木 勇次郎 毎日コミュニケーションズ 2008-07-31 売り上げランキング : 1457 Amazonで詳しく見る by G-Tools |
2位:CMSとして使うMovable Typeガイドブック
![]() | CMSとして使うMovable Typeガイドブック 黒野 明子 翔泳社 2008-03-14 売り上げランキング : 6429 Amazonで詳しく見る by G-Tools |
3位:Movable Type 4.x 本格的CMSサイトを構築するためのMTスーパーテクニック クリエイターが身につけておくべき新・100の法則。
![]() | Movable Type 4.x 本格的CMSサイトを構築するためのMTスーパーテクニック クリエイターが身につけておくべき新・100の法則。 加藤 善規 インプレスジャパン 2008-09-12 売り上げランキング : 3547 Amazonで詳しく見る by G-Tools |
4位:基本からしっかりわかる Movable Type 4.2 カスタマイズブック(Web Designing Books)
![]() | 基本からしっかりわかる Movable Type 4.2 カスタマイズブック(Web Designing Books) 大藤 幹 毎日コミュニケーションズ 2008-09-20 売り上げランキング : 4142 Amazonで詳しく見る by G-Tools |
5位:ブログ簡単パワーアップ Movable Type4 スーパーカスタマイズテクニック
![]() | ブログ簡単パワーアップ Movable Type4 スーパーカスタマイズテクニック 藤本 壱 技術評論社 2008-07-02 売り上げランキング : 59953 Amazonで詳しく見る by G-Tools |
6位:WordPress逆引きデザイン事典[2.X対応]
![]() | WordPress逆引きデザイン事典[2.X対応] 高山 一登 翔泳社 2008-09-11 売り上げランキング : 18190 Amazonで詳しく見る by G-Tools |
7位:GriffinTechnology iTalk Pro GRI-IP-000063
![]() | GriffinTechnology iTalk Pro GRI-IP-000063 Griffin Technology 2006-11-10 売り上げランキング : 314 Amazonで詳しく見る by G-Tools |
7位:エアーパッドプロ究極セットIII(エアーパッドソール付)大
![]() | エアーパッドプロ究極セットIII(エアーパッドソール付)大 パワーサポート 2006-10-16 売り上げランキング : 1134 Amazonで詳しく見る by G-Tools |
7位:AjaxとPHPによる MovableType高速&最強システム構築法
![]() | AjaxとPHPによる MovableType高速&最強システム構築法 藤本 壱 技術評論社 2007-07-04 売り上げランキング : 274950 Amazonで詳しく見る by G-Tools |
7位:Movable Type プロフェッショナル・スタイル MT4.1対応
![]() | Movable Type プロフェッショナル・スタイル MT4.1対応 CSS Nite 毎日コミュニケーションズ 2008-04-08 売り上げランキング : 2676 Amazonで詳しく見る by G-Tools |
7位:WORDPRESS2.6 標準ガイドブック
![]() | WORDPRESS2.6 標準ガイドブック マクラケン直子 毎日コミュニケーションズ 2008-08-29 売り上げランキング : 2325 Amazonで詳しく見る by G-Tools |
TemplateSetNameViewer プラグイン
Category:[管理画面, 管理画面]
Tag:[MovableType, Plugin, TemplateSetNameViewer]
Permalink
Movable Type 4 で利用しているテンプレートセット名を、ブログ管理画面のテンプレート一覧画面やテンプレート編集画面に表示するプラグインです。

1.プラグイン作成の経緯
実験サイトで頻繁にテンプレートセットを切り替えるため、時間が経って管理画面にログインすると、使っていたテンプレートセットが何だったのか分からなくなることがほとんどです。そういう訳で一覧画面に表示されているテンプレート名から推測したり、ブログのトップページを表示したりしていたのですが、作業効率の改善を目指して作りました。
このプラグインを用いれば、利用中のテンプレートセットが即座に分かります。自画自賛ですが、なかなかナイスなプラグインかと(笑)。
このプラグインの動作は Movable Type 4.21 で確認しています。
余談ですが、当初 MTBlogTemplateSetID タグを管理画面に埋め込んで表示してみたところ、テンプレートセットのキーしか表示されない(=和名が表示されない)ことに気づき、テンプレート初期化画面でテンプレートセット名を表示するロジックを流用して和名を表示するようにしてみました。
外部のテンプレートセットも和名で表示されます。

2.プラグインのダウンロード
下記のリンクからプラグインアーカイブをダウンロードし、任意のフォルダに保存してください。
3.インストール
プラグインアーカイブを解凍し、中にある TemplateSetNameViewer フォルダを plugins ディレクトリにアップロードしてください。
ブログ管理画面より「システム」→「プラグイン」でプラグイン一覧を表示し、次のように表示されればOKです。

4.テンプレートセット名が表示される画面
とりあえず以下の画面で表示されることと、グローバルテンプレートで表示されないことを確認しています。
テンプレート一覧画面

テンプレート編集画面

ウィジェット一覧画面

ウィジェット編集画面

バックアップ画面

ウィジェットセットでの表示は別途。
基本からしっかりわかる Movable Type 4.2 カスタマイズブック
「基本からしっかりわかる Movable Type 4.1 カスタマイズブック Movable Type 4.1/MTOS 4.1対応 (Web Designing BOOKS)」の 4.2 改訂版が出版されました。
![]() | 基本からしっかりわかる Movable Type 4.2 カスタマイズブック(Web Designing Books) 大藤 幹 毎日コミュニケーションズ 2008-09-20 売り上げランキング : 2131 Amazonで詳しく見る by G-Tools |
「基本からしっかりわかる Movable Type 4.1 カスタマイズブック Movable Type 4.1/MTOS 4.1対応 (Web Designing BOOKS)」が発売されてから間もなく 4.2 がリリースされたため、4.2 対応の本書を執筆されたという印象ですが、全面的に 4.2 のデフォルトテンプレート(既定のブログ)に沿った内容に改訂されています。
フルカラーでかなり読みやすい内容です。デフォルトテンプレートをがっつりカスタマイズしたい方にお勧めの1冊です。
目次は次の通りです。
- イントロダクション MTOS 4.2のインストール
- 第1章 MTOS・MT4.2の基本構造
- 1-1 デザインの選択
- 1-2 デザインの種類とXHTMLの構造
- 1-3 Cityscapeの基本構造
- 1-4 Hillsの基本構造
- 1-5 Minimalistの基本構造
- 1-6 Unityの基本構造
- 1-7 Unstyledの基本構造
- 1-8 メインページのXHTML
- 1-9 ブログ記事ページのXHTML
- 第2章 スタイルシート適用の仕組み
- 2-1 外部スタイルシートの構成と役割
- 2-2 スタイル・レイアウト切り替えの仕組み
- 2-3 6パターンの段組みの実現方法
- 第3章 スタイルシートの指定内容を理解する
- 3-1 掲載するソースコードについて
- 3-2 styles.cssの指定内容
- 3-3 blog.cssの指定内容
- 3-4 screen.cssの指定内容(Minimalist Red)
- 3-5 screen.cssの指定内容(Cityscape Portland)
- 3-6 screen.cssの指定内容(Unstyled)
- 第4章 スタイルシートのカスタマイズ
- 4-1 ローカルでCSSの試行錯誤ができるようにする
- 4-2 カスタマイズしたCSSをアップロードする
- 4-3 ヘッダの背景画像を変更する1(Cityscape)
- 4-4 ヘッダの背景画像を変更する2(Cityscape)
- 4-5 基調色を変更する1(Minimalist)
- 4-6 基調色を変更する2(Minimalist)
- 4-7 横幅を変更する1(Minimalist)
- 4-8 横幅を変更する2(Cityscape)
- 4-9 サイドバーの見出しに背景をつける(Minimalist)
- 4-10 タグクラウドの色を段階的に変える(Minimalist)
- 第5章 テンプレートの構成
- 5-1 テンプレートとは?
- 5-2 テンプレートの種類
- 5-3 テンプレートの構成例
- 5-4 バージョン4.1との違い
- 5-5 テンプレートタグについて
- 第6章 テンプレートの内容を理解する
- 6-1 掲載するテンプレートについて
- 6-2 メインページ(インデックステンプレート)
- 6-3 アーカイブインデックス(インデックステンプレート)
- 6-4 ブログ記事(アーカイブテンプレート)
- 6-5 ウェブページ(アーカイブテンプレート)
- 6-6 月別ブログ記事リスト(アーカイブテンプレート)
- 6-7 カテゴリ別ブログ記事リスト(アーカイブテンプレート)
- 6-8 HTMLヘッダー(テンプレートモジュール)
- 6-9 バナーヘッダー(テンプレートモジュール)
- 6-10 バナーフッター(テンプレートモジュール)
- 6-11 ブログ記事の概要(テンプレートモジュール)
- 6-12 サイドバー(テンプレートモジュール)
- 6-13 コメント(テンプレートモジュール)
- 6-14 トラックバック(テンプレートモジュール)
- 6-15 ホームページウィジェットグループ(ウィジェットテンプレート)
- 6-16 アーカイブウィジェットグループ(ウィジェットテンプレート)
- 6-17 最近のコメント(ウィジェットテンプレート)
- 6-18 最近のブログ記事(ウィジェットテンプレート)
- 6-19 アイテム(ウィジェットテンプレート)
- 6-20 タグクラウド(ウィジェットテンプレート)
- 6-21 カテゴリ月別アーカイブ(ウィジェットテンプレート)
- 6-22 カテゴリアーカイブ(ウィジェットテンプレート)
- 6-23 月別アーカイブ(ウィジェットテンプレート)
- 6-24 検索(ウィジェットテンプレート)
- 6-25 カレンダー(ウィジェットテンプレート)
- 6-26 Powere By(ウィジェットテンプレート)
- 第7章 テンプレートのカスタマイズ
- 7-1 テンプレートタグの調べ方
- 7-2 ウィジェットの見出しのテキストを変更する
- 7-3 投稿者の名前を削除する
- 7-4 日付と時間の表示形式を変更する
- 7-5 「続きを読む:○○○」の表示形式を変更する
- 7-6 「最近のコメント」の表示形式を変更する
- 7-7 前後の記事へのリンクを追加する
- 7-8 ページによって2段組・3段組を切り替える
- 7-9 プロフィール画像を表示させる
- 7-10 IE対策用の専用外部スタイルシートを用意する
- 付録 スタイル一覧
Movable Type 4 を始める前に設定しておきたい 10 の項目
Movable Type 4 を始める前に設定しておきたい 10 の項目を紹介します。
このエントリーは、バージョン3 の時代に投稿した「Movable Type を始める前に設定しておきたい 10 の項目」のMovable Type 4 版です。今でもそちらのエントリーにトラックバックやブックマークが寄せられ、大変嬉しいのですが、バージョン3 から Movable Type の機能が大幅に拡張・改善され、画面構成も変更されており、以前の記事では対応できなくなってしまったので、全ての記述をこのエントリーで見直すことにしました。Movable Type 4 を利用する場合の参考になれば幸いです。
設定が重要と思われるものから順番に並べています。前回同様「全てが必須」という意味ではありません。不要と思われる項目はスキップしてください。
また、項目によっては運営中に設定するものもあります(2項後半、3項など)。
1.アーカイブパス・アーカイブURLを作成する
Movable Type では、メインページやアーカイブインデックスの他、各アーカイブページ(カテゴリー・アーカイブ/月別アーカイブ/ブログ記事アーカイブ等)を出力します。これらのページはブログディレクトリの配下にディレクトリが作られ、その下に出力されます。
例えば 2008年10月の月別アーカイブページは
- ブログディレクトリ/2008/10/index.html
となります。
以前の記事では、ディレクトリの整理を目的に archives というディレクトリを作成することをお勧めしていましたが、SEO 等を優先したい場合など、目的に応じた名称やドメインのアーカイブURLを作成すると良いでしょう。
アーカイブURL、アーカイブパスは、ブログ管理画面の「設定」→「公開」の「アーカイブをサイトパスとは別のパスで公開する」をチェックすれば設定できます。Movable Type がファイルを出力できるパスであれば、サブドメインや、サイトURL と異なるドメインを設定することも可能です。
![]()
2.ブログ記事アーカイブページのパスを変更する
ブログ記事アーカイブページは検索対象や外部からのリンク先となることが多いため、パス(拡張子含む)は運用の早い段階で確定させておくと良いでしょう。
ただし、運用の途中で「PHP 化を行いたい」という要望が出てくるかもしれません。
そのような状況に対処するために、ブログ記事アーカイブページのパスを以下のように変更することをお勧めします。
ブログ管理画面より「デザイン」→「テンプレート」をクリックして、アーカイブテンプレートの「ブログ記事」をクリック。

一番下の「テンプレートの設定」をクリック。

「パス」のセレクトボックスより yyyy/mm/entry-basename/index.html を選択(または表示項目の末尾が ~/index.html となっているものを選択)。

変更されたことを確認して「保存」をクリック。保存後、ブログ全体を再構築してください。

この設定を行っておけば、「最近のブログ記事」のリンクリストやフィードなどに表示されるブログ記事のURLの末尾がスラッシュになる(ファイル名が設定されない)ので、外部ユーザーが該当の記事をブックマークをしても拡張子を意識しなくなります。つまり運用途中でもPHP化などの変更が可能になります。
なお、月別アーカイブやカテゴリアーカイブは、デフォルトの状態でURLの末尾がスラッシュになってますので、これらの設定は特に変更する必要はありません。
さらに、ブログ記事アーカイブのURLの末尾のパスは、各ブログ記事の「出力ファイル名」が反映されます。この出力ファイル名はブログ記事タイトルの半角英数、半角英数がなければ post-xx という汎用的な名称になるので、SEO を考慮したい場合は任意の内容に変更すると良いでしょう。ただし全角文字(日本語)は許容されません。
変更方法は、ブログ記事投稿画面の右側にある「公開」欄の「出力ファイル名」の鍵マークのアイコンをクリック。

クリックすると出力ファイル名を入力できるようになります。なお、入力後にブログ記事タイトルに半角英数を入力すると出力ファイル名が書き換えられてしまうので、ブログ記事タイトルが確定した後に書き換えると良いでしょう。公開後に変更するとURLが変更されてしまうので注意してください。

3.カテゴリのパスを変更する
カテゴリアーカイブのパス(ディレクトリ)は、日本語のカテゴリ名を作成した場合、デフォルトでは cat1、cat2... という文字列が付与されます(その配下にカテゴリーアーカイブページの実体となる index.html が出力されます)。カテゴリを半角英数で作成すると、その内容がパスの名称に反映されます。いずれにしても、SEO を考慮した名称に変更したい場合は、カテゴリ作成と同時にパス名を変更すると良いでしょう。
パス名の変更方法は、カテゴリ作成後のカテゴリ編集画面の右側にある「公開」欄の「出力ファイル名」の鍵マークのアイコンをクリック。
![]()
クリックするとカテゴリのパス名が入力できるようになります。設定後、このカテゴリーを利用するか、すでに利用中であれば全体を再構築してください。
![]()
4.更新通知を設定する
更新通知は、ブログ記事を新たに投稿した時に「ブログを更新しました」というお知らせ(更新 Ping)を外部に通知するための仕組みです。
Google 等の検索でもサイトを訪問される方はいますが、検索結果に反映されるまでにはタイムラグがあります。この更新通知を使った通知を行うことで、より迅速にあなたのブログの更新が外部に知らされ、他の方の目に触れる機会が増えることでしょう。
更新通知先については、ネットで検索すると一覧を掲載しているブログがありますが、閉鎖されている更新通知サーバが少なくないため、個人的には、Pingoo! などの一括送信サービスを利用し、そのURLを「その他」のテキストエリアに追加すれば、一ヶ所に更新通知を送信するだけで複数の更新通知サーバに配信してくれます。Pingoo に登録されていない他のサーバへ通知したい場合は、さらにそのURLを設定します(下の画面では設定していませんが、設定してください)。
![]()
ちなみに、無闇に更新通知先を追加すると、ブログ記事投稿で更新通知の応答が遅延すると、ブログ記事投稿時間に影響します(応答待ちとなるため)。
5.テンプレートセットを選択する
Movable Type 4.2 では 3種類のダウンロードアーカイブがあります。名称と、選択可能なテンプレートセットは次の通りです。
| 名称 | 選択可能なテンプレートセット |
|---|---|
| Movable Type Pro コミュニティ機能付き | 既定のブログ プロフェッショナルウェブサイト コミュニティブログ コミュニティ掲示板 |
| Movable Type Pro コミュニティ機能なし | 既定のブログ プロフェッショナルウェブサイト |
| Movable Type(MTOS) | 既定のブログ |
それぞれのテンプレートセットの機能は次の通りです。
| テンプレートセット | 機能 |
|---|---|
| 既定のブログ | 通常のブログ |
| プロフェッショナルウェブサイト | 「既定のブログ」のブログ(デザインは異なります)に、ウェブサイト形式のトップページ(これがサイトのトップページになります)・About・お問い合わせのページを組み合わせたもの |
| コミュニティブログ | ウェブサイトの購読者がブログのユーザーとして参加可能になるもの。登録ユーザーはプロフィールの掲載やブログ記事の投稿が可能になります(システム管理者が権限を付与した場合) |
| コミュニティ掲示板 | 掲示板形式のウェブサイト。フォーラムを作り、フォーラムの話題(トピック)内でウェブサイトの購読者がブログのユーザーとして参加可能になるもの(コミュニティブログのように、登録ユーザーがブログ記事を投稿することはできません)。 |
このようにテンプレートセットの選択肢がひろがったのですが、Movable Type Pro(コミュニティ機能付き)では、インストール時のテンプレートセットが「コミュニティブログ」になっているため、通常のブログを開設したいビギナーの方などは、テンプレートセットの機能を分からないまま「コミュニティブログ」を選択してしまう可能性があります。

初めて Movable Type を利用される方は、上記の説明を参考に、インストール時に利用するテンプレートセットを選択すると良いでしょう。

参考までに、バージョン 4.1 までの Movable Type はコミュニティ機能が同梱されていなかったので、ほとんどのブロガーは「既定のブログ」またはバージョン 4.1 で追加された「プロフェッショナルウェブサイト(4.2 以前は「汎用ウェブサイト」という名称)」を利用しています。
なお、インストールしてしまった後でも、テンプレートセットは変更可能です。変更方法は、ブログ管理画面の「デザイン」→「テンプレート」で開いたページの右側にある「ブログのテンプレートを初期化」をクリック。

「新しいテンプレートセットを適用」を選択し、プルダウンメニューで利用したいテンプレートセットを選択し、「次へ」をクリック。

次の画面で「確認」をクリックすればテンプレートセットが切り替わります。以前使っていたテンプレートセットはテンプレート一覧から削除されるので注意してください。

6.インデックステンプレートの再構築を設定する
ブログ記事の投稿やコメント投稿を行うと、メインページやアーカイブインデックスなどのインデックス・テンプレートは、デフォルトの設定では自動的に再構築されるようになっています。
再構築するインデックステンプレートには、ブログ記事やコメント投稿の更新を反映させる必要がない、他のインデックステンプレート(スタイルシートや JavaScript など)も含まれます。
これらのインデックステンプレートは基本的にブログ記事やコメント投稿と連動して再構築する必要はありません(ただし1度は必ず再構築し、物理的なファイルを生成してください)。
これらのインデックステンプレートの自動再構築を無効にすることで Movable Type の再構築にかかるコストを僅かながら削減できます。
スタイルシートの再構築を無効にするには、ブログ管理画面の「デザイン」→「テンプレート」で開いたページの「スタイルシート」をクリックします。

一番下の「テンプレートの設定」をクリック。

「公開」のプルダウンメニューから「手動」を選択します。これで、このテンプレートはブログ記事投稿やコメント投稿では再構築対象ではなくなります。

再構築するには、再構築画面からのインデックステンプレート再構築やテンプレート一覧画面からの「公開」、または該当のテンプレート編集画面での「保存と再構築」のクリックなどで再構築されます。
なお、JavaScript(mt.js)は、ブログ管理画面でコメントの設定を変更すると、それに連動して再構築が必要な場合があるため、運用でのコメントの設定内容が確定してから「手動」に変更してください。
上記の話とは別に、ブログ全体をダイナミックパブリッシングなどに変更する場合は、「公開プロファイルを設定」から設定します。

公開プロファイルの詳細は下記のドキュメントを参照してください。
7.ユーザー登録を設定する
ブログでコメント投稿を有効にしている場合、インストール直後の状態では、ユーザーが中途半端にユーザー登録してしまう可能性があります。
具体的には、コメント設定をインストール直後の状態のまま運用すると、コメント投稿フォームにある「サインイン」をクリックして、表示されたサインイン認証画面の右下に「アカウントがないときはサインアップしてください。」というリンクが表示されます。

ユーザーがこのリンクをクリックすると次のような画面が表示されます。

各項目に適切な内容を入力して「登録する」をクリックすると、登録されたメッセージが表示されます。

この操作を行うと、システム管理画面の「ユーザー」→「一覧」に承認待ちのユーザーが登録されてしまいます(画面では yujiro が追加)。

ユーザー登録の設定は完全に行われていないので、この作業を行っても、登録ユーザーにはメールは送信されません。つまり、お互いに中途半端な状態になってしまう訳です。
ブログに対し、このような意図しないユーザー登録を行いたくない場合、ブログ管理画面の「設定」→「登録/認証」の「ユーザー登録」のチェックを外しておくと良いでしょう。

これでサインイン画面から「アカウントがないときはサインアップしてください。」というリンクが表示されなくなります。

逆に、ユーザー登録を有効にしたい場合は、以下の記事を参考に設定を行ってください(事前にメール機能の設定を行っておくことが条件です)。
8.コメント/トラックバックの受信設定
Movable Type の機能のひとつに、コメント・トラックバックがありますが、Movable Type をインストールした直後は、投稿コメント・受信トラックバックは、ブログの管理者が承認しないと公開されない状態になっています。
その設定は、ブログ管理画面の「設定」→「コメント」の「コメントポリシー」で、「ブログで承認されたコメント投稿者のみ」となっている部分です。

運用開始前にコメント投稿の動作を確認したい場合や、承認せずに公開したいという場合は、一旦「すべて自動的に公開する」を選択すると良いでしょう。

ちなみに、デフォルト状態でコメントを投稿すると、コメント投稿者は承認待ち画面にジャンプします。

承認待ちのコメントは、コメント一覧画面上、黄色いアイコンでマークされます。

保留コメントを公開するには、保留中コメントのチェックボックスをチェックして「公開」をクリックします。メールでコメント投稿があったことを通知する設定にしていれば、メール(に掲載されたURL経由)で承認を行うこともできます。
トラックバックについては、ブログ管理画面の「設定」→「トラックバック」の「トラックバックポリシー」で「事前確認」のチェックを外します。

この設定はどちらでも構いませんが、デフォルトの設定のまま運用するのであれば、「投稿したコメントが表示されない」「送信したトラックバックが表示されない」という原因が、コメント・トラックバックの承認待ちになっていることを認識していることが必要です。
9.認証方式の選択
コメント認証方式は、インストール直後の状態では
- Movable Type(自ブログの登録ユーザーのみ)
- LiveJournal
- Vox
の3種類がコメント投稿の認証方式として選択されていますが、できるだけ多くの認証方式を選択しておいた方が、コメント投稿者の認証方式の選択肢が増えます。個人的には、後述する TypeKey を含め、すべての方式をチェックしておくと良いと思います。

コメント投稿者の幅をひろげたい場合は、上記のように「認証なしコメント」もチェックします。「メールアドレスを要求」のチェックは任意です。認証なしコメントを利用する場合は、画像認証の CAPTCHA を併用すると良いでしょう(利用が可能であれば)。
CAPTCHA の設定は、ブログ管理画面の「設定」→「コメント」の「CAPTCHAプロバイダ」で「Movable Type 既定」を選択し、保存します。なお、CAPTHCAが利用できない場合は、このメニューが選択できない状態になっています。

下記の mixiComment プラグインをインストールすれば、mixi アカウントを利用したサインインも可能になります。
TypeKey はコメント投稿におけるオンライン認証システムです。Movable Type のコメント投稿でこのオンライン認証を有効にして、コメント投稿者をTypeLey 認証者だけに制限すれば、スパムコメントを防ぐことも可能です。
TypeKey を設定するには、「TypeKeyの設定」をクリック。

「TypeKeyのトークンを取得」をクリック。

すでに TypeKey のアカウントをもっていればログイン。もっていなければ、「無料のアカウントを新規に作成」をクリックして、アカウントを作成します。

いずれの場合も次の画面に遷移するので、「return to Movable Type」をクリック。

リターン先は管理画面ではありませんので、その画面は閉じて、3つ前の画面の「TypeKeyのトークン」に文字列が設定されていればOKなので、画面下の「変更を保存」をクリック。

これで TypeKey トークンが有効になりました。設定はまだ続きます。

ブログ管理画面の「設定」→「登録/認証」に戻ると、TypeKey がチェックできる状態になっているので、チェックします。チェックすると「TypeKey経由のコメントにメールアドレスを要求する」が表示されるので適宜チェックして、保存してください。

これでコメント投稿時のサインイン画面に TypeKey が表示されました。

10.コメント投稿後の画面を設定する
インストール直後の状態では、コメント投稿後、コメントを投稿したページに戻る前に、「コメントを投稿しました」というページに遷移します。

この「コメント投稿完了画面」ではなく、即時にコメント投稿ページに戻したい場合は、ブログ管理画面の「設定」→「コメント」の一番下にある、「コメント確認のページ」のチェックを外してください。

他に設定が必要な項目があれば適宜追加します。








![WordPress逆引きデザイン事典[2.X対応]](http://ecx.images-amazon.com/images/I/51wvZ9nbUSL._SL160_.jpg)





