ブログ記事を「公開した日時」を自動的にカスタムフィールドで保存するカスタマイズ

Movable Type で日付に関するタグはいくつかありますが(タグ date を含むテンプレートタグ一覧)、ブログ記事を「未公開(原稿)」からはじめて「公開」にしたときの日付を表示するタグは無いようです。

そこで、ブログ記事の編集画面をカスタマイズして、カスタムフィールドに自動的に「公開した日時」を表示するカスタマイズをやってみました。

公開日時フィールド

某コミュニティにこのような内容と思われる質問があったので、自分なりにやってみました。

実装する機能

ブログ記事の公開状態を、はじめて「公開」にして「保存」したときの日時が、あらかじめ作成しておいたカスタムフィールドに自動的に保存されます。

カスタムフィールドが使えない MTOS であっても、「キーワード」フィールドなどを代用できます。

カスタマイズ方法

管理画面のカスタマイズについては以前の記事(Movable Type のブログ記事の出力ファイル名を変更する管理画面のカスタマイズMovable Type の記事投稿画面の UI をカテゴリごとに変えるカスタマイズ ( jQuery 版))でも書きましたが、『Movable Type プロフェッショナル・スタイル MT4.1対応』の Track B の「 5 ユーザー指向の管理画面をつくる」がとても参考になります。

カスタマイズするファイルの準備

今回カスタマイズするのは、ブログ記事やウェブページの編集画面用のテンプレートファイル「 edit_entry.tmpl 」です。このファイルは以下の場所にあります。

  • mt
    • tmpl
      • cms
        • edit_entry.tmpl

このファイルをローカルにコピーして同名で保存したファイルをカスタマイズします。

カスタムフィールドの作成

まず、「公開日時」を保存するためのカスタムフィールドを作成します。作成方法は割愛しますが、設定内容は次のようにします。

システムオブジェクト
ブログ記事
名前
公開日時
説明
「未公開(原稿)」からはじめて「公開」した日時
種類
テキスト
ベースネーム
publicdate
テンプレートタグ
publicdate

カスタマイズ内容

さっそくカスタマイズしてみます。

まずは「保存」ボタンをクリックしたときに「公開日時」を書き込めるように、「保存」ボタンに onclick 属性を追加します。「 edit_entry.tmpl 」の 54 ~ 60 行目付近を次のようにします。

<button
    mt:mode="save_entry"
    type="submit"
    accesskey="s"
    title="<mt:var name="submit_button_title">"
    class="primary-button"
    onclick="publicDate();"
    ><__trans phrase="Save"></button>

これで「保存」ボタンをクリックしたときに、publicDate という関数を呼び出すことになります。

次に、onclick 属性を挿入後の 906 行目の手前に、次のソースを挿入して、publicDate という JavaScript の関数を定義します。

[挿入するソース]
<mt:setvarblock name="html_head" append="1">
<script type="text/javascript">
//<![CDATA[
function digit(num) {
    if(num < 10){num = '0' + num;}
    return num;
}
function publicDate () {
    var statusValue = document.entry_form.status.value;
    var publicValue = document.entry_form.customfield_publicdate.value;
    if ((statusValue == 2) && (publicValue == '')) {
        var now = new Date();
        var publicYear = now.getFullYear();
        var publicMonth = digit(now.getMonth() + 1);
        var publicDate = digit(now.getDate());
        var publicHours = digit(now.getHours());
        var publicMinutes = digit(now.getMinutes());
        var publicSeconds = digit(now.getSeconds());
        var public = '' + publicYear + ':' + publicMonth + ':' + publicDate + ':' + publicHours + ':' + publicMinutes + ':' + publicSeconds;
        document.entry_form.customfield_publicdate.value = public;
    }
}
//]]>
</script>
</mt:setvarblock>
[906行目]
<mt:setvarblock name="html_body" append="1">

カスタマイズはこれで完了です。

カスタマイズの補足

先ほどの設定でカスタムフィールドを作成していれば、管理画面上の「公開日時」カスタムフィールドは、id 属性に「 customfield_publicdate 」をもつ input 要素になっているはずです。うまく動作しない場合は、「公開日時」カスタムフィールドの input 要素の id 属性を確認してみてください。

また、カスタムフィールドの使えない MTOS では、「キーワード」フィールドなどを代用することができると思います。「キーワード」フィールドを代用する場合は、「 customfield_publicdate 」部分( 2 箇所)を「 keywords 」に変更すればOKです。

カスタマイズしたファイルをアップロード

以上の内容に書き換えたファイルを文字コード UTF-8 で保存し、次のディレクトリにアップロードします。ファイル名は「 edit_entry.tmpl 」です。

  • mt
    • alt-tmpl
      • edit_entry.tmpl

最初に「 edit_entry.tmpl 」があったディレクトリとは別ですのでご注意ください。使用を中止したいときは、ここでアップロードしたファイルを削除すればOKです。

使い方

公開するとき

公開状態を「公開」にして保存すれば自動的に現時点での日時が「公開日時」カスタムフィールドに挿入されます。保存するフォーマットは次のようになります。

年:月:日:時:分:秒
(例)2008:11:05:12:30:30

フィールをに値が入っていると書き換えないようになっているので、後から編集して保存し直しても、この値は変更されません。値を修正したい場合は、手書きで修正するか、一度値を空にして保存し、もう一度保存すれば書き換わります。

テンプレートで表示するとき

このカスタムフィールドの値を出力するテンプレートタグは次のようになるはずです。

テンプレートタグ : <$mt:publicdate$>
出力結果の例   : 2008:11:05:12:30:30

このままでは使えないので、regex_replace モディファイアを使って出力方法を制御します。なぜこのような実用的でない形式にしているかというと、初めから整った形(2008年11月05日 12時30分30秒など)で値を保存してしまうと、後々出力方式を変更したくなったときに柔軟性に欠けると思われるためです。

さて、ここではいくつか出力の例を挙げておきます。以下の出力結果は、実際にこのブログ記事をはじめて「公開」した日時になります。

<$mt:publicdate regex_replace="/(\d+):(\d+):(\d+):(\d+):(\d+):(\d+)/","\1年\2月\3日 \4時\5分\6秒"$>
2008年11月05日 13時56分36秒
<$mt:publicdate regex_replace="/(\d+):(\d+):(\d+):(\d+):(\d+):(\d+)/","\1年\2月\3日"$>
2008年11月05日
<$mt:publicdate regex_replace="/(\d+):(\d+):(\d+):(\d+):(\d+):(\d+)/","\1-\2-\3 \4:\5:\6"$>
2008-11-05 13:56:36
<$mt:publicdate regex_replace="/(\d+):(\d+):(\d+):(\d+):(\d+):(\d+)/","\1-\2-\3"$>
2008-11-05

以上です。

※カスタマイズは自己責任でお願いします。

  • このエントリーをはてなブックマークに追加
Just a second...