Movable Type 備忘録

 

 SQLでエントリを更新された順にソートする

以前エントリを更新された順にソートするで、投稿されたエントリを更新日付順で表示するカスタマイズを紹介しました。
でも、この時使用したプラグインが既にMovableType(ムーバブルタイプ) 3.2、3.3には対応していなかったため、使用を断念しました。

その後も、わたしはどうしても追記などによる更新エントリ一覧を表示したくて、いろいろ調べた結果、今度は問題なさそうなので、そのカスタマイズを紹介します。

まだ改善すべき点はありますが、投稿された全エントリから最近更新された順にエントリを一覧表示させることができたので、報告ということでご紹介します。

- 2007.08.15 追記 -
ここで紹介してます SQL プラグインは、Movable Type 4 では使用できません。

通常、エントリの表示や一覧表示、その他すべてのデータは、データベースに保存されたデータをMovableType(ムーバブルタイプ)やプラグインが抽出した上で表示されますね。

今回もプラグインを使用するのですが、SQLプラグインといって、今までのプラグインと違い、SQLというデータベースを操作する言語を指定して、間接的にデータを抽出することができます。

わたしも詳しくは分からないのですが、データベースを扱う上で必須な言語!? なようです。
ですので、このプラグインを使用するにはSQLによるデータ抽出ができないと、まったく使いものになりません。

当然、わたしもSQLなんてよく分からないので、使いこなす...というのは激しくムズかしいわけですが、SQLが分かるようになると、いろんな形でデータをこのプラグインを通して抽出することができるようです。

とりあえずの目的だった更新日付順にエントリをソートするだけのSQLは分かったのでよかったですけど。
わたしのブログでは、メイン・インデックスのサイドバーに表示しています。
ホントは新規投稿のエントリと混在して表示したいんですけど、まだ新規エントリ/更新エントリの判断するコード作ってないので、今は別々に表示させています。

- 2006.10.22 追記 -

とりあえず、新規エントリ、更新エントリの判断には投稿日時と更新日時から判断するようにしてみました。
具体的には以下のようなPHPスクリプトを作って表示させました。

<?php
function pickup($post,$modify,$modenable=0,$days=3)
{
    $result=date("Ymd", mktime( 0,0,0,date("m") ,date("d") - $days, date("Y")));

    if ( $modify >= $result )
    {
        if ( $post >= $result )
        {
            print "<img style=\"margin:2px;\" src=\"<$MTBlogURL$>image/new.png\" alt=\"\" />";
        }
        else
        {
            if ( $modenable == 1 )
            {
                print "<img style=\"margin:2px;\" src=\"<$MTBlogURL$>image/up.png\" alt=\"\" />";
            }
        }
    }
}
?>

青い字のパラメータに投稿日時、赤い字に更新日時を渡すことで、新規/更新エントリをチェックして、該当すればイメージ表示しています。

また、投稿したエントリのちょとした誤字脱字の場合はソート対象にして欲しくない( わたし誤字脱字多いので )ので、CustomFieldsプラグインと併用することで対応しました。

SQLプラグインの入手はこちらから▼
http://www.bradchoate.com/weblog/2002/07/11/mtsql

更新日付順でソートする問題点

既に投稿されたエントリを更新する理由はいろいろあると思いますが、今回のカスタマイズの問題点は、どんな些細な修正でも更新されたということでソートされてしまうことです。

たとえば、更新しました...というお知らせをしたいエントリもあれば、誤字脱字などでちょと修正しただけのエントリもあると思います。
そんな更新されたエントリのすべてが対象となってしまいます。

SQLプラグインの使い方

上記URLから圧縮ファイルをダウンロードします。
そして、適当なフォルダに展開してください。

sql.plというファイルをmt/plugins/ディレクトリの中にアップロードしてください。
次に、mt/extlib/ディレクトリの中にbradchoateという名前でディレクトリを新規作成して、その中にsql.pmというファイルをアップロードします。

プラグインのインストールは以上です。

次にテンプレートを修正します。
ここでは、とりあえず更新日付による一覧表示を例にします。

プラグインを使って更新日付による一覧表示させるコードは以下のようになります。

<ul>
    <MTSQLEntries query="select DISTINCT entry_id from mt_category, mt_placement, mt_entry where (placement_category_id = category_id) and (placement_entry_id = entry_id) and (category_blog_id = 10) and (entry_status = 2) order by entry_modified_on desc
limit 10">
    <li><a href="<$MTEntryPermalink$>" title="e<$MTEntryID$>"><$MTEntryTitle$> <$MTEntryModifiedDate language="en" format="%m/%d"$></a></li>
    </MTSQLEntries>
</ul>

青い字の部分が先ほど説明したSQLになります。
具体的には、mt_category、mt_placement、mt_entryの各テーブルからブログID、カテゴリID、エントリIDそして、投稿済みエントリに該当するエントリを10件分抽出して...という命令みたいです。

SQL中の"DISTINCT"は、重複するデータを1つにするというお約束!? らしいです。 詳しくはネットなどで調べてください。

赤い字の部分にはブログIDを指定します。
ここには<$MTBlogID$>タグは使用できません。 直接ブログIDを指定してください。 緑の字の部分は抽出するエントリ数を指定します。

テンプレートを修正したら、保存して再構築すれば更新日付順に一覧表示されます。

わたしたちが使っているプラグインは、このように何らかの形でデータベースから必要なデータを抽出して、使いやすいようにしたものらしく、そういう意味だと、今回紹介したSQLプラグインはエントリに限らず、SQLの命令次第で自由にデータを抽出できるプラグインとなっています。
反面、わたしみたいなシロウトには、カンタンには扱えないですけどね。

SQLをまともに勉強しようとは思ってませんが、SQLの構文などはいろんなサイトで紹介してるので、単純なSQLならなんとか書けそうですよ ( ̄∇ ̄)b

 Trackback Pings(0)

No trackbacks found.

 Comments(0)

No comments found.

 Post a Comment

コメント用フィード