エントリ一覧の左に写真が出たり出なかったりする件

  • 投稿日:
  • by
  • カテゴリ:

IMG_0032

MovableTypeは、写真などの、テキストではないデータを、"Asset"というオブジェクトで管理しています。このAssetが、ブログのエントリと適切に関連づけされていると、SmartBlogのテーマがこれを拾い出して、一覧の左側に出すようにしているのです。

Windows Live Writerから投稿すると、この関連づけがうまく出来ないために、画像が表示されないのだと言うことがわかりました。

画像を必ず"Asset"で管理しなければならないわけではないので、本文の表示には問題がないのですが、すっきりしすぎるほどにしてしまった一覧画面の華となる写真が無視されてしまうのはしのびありません。

まず、WIndows Live Writerは、画像のアップロードにFTPを使わないように設定します。FTP経由でアップロードしていると、それはMTのAssetにはなれないからです。

次に、MovableType 側に、アップロードされたエントリが保存されるタイミングで、テキストをスキャンして、<img>のタグにある画像ファイルがAssetに登録されているかどうかをスキャンし、登録されていたら、それをエントリに関連づけしてしまうプラグインを導入します。

展開して出てくるディレクトリごと <MTdir>/plugins の下に置くだけで、インストールは完了です。

動作としては、save処理の終わりのコールバックをフックして、img タグにある src から、Assetを検索して、

my $asset = MT::Asset::Image->load( { blog_id => $blog_id, file_path => $full_path } );

見つかったら、関連づけされていないものについては、関連づけをおこなう、

my $oa = MT::ObjectAsset->load( { asset_id => $asset->id , blog_id => $blog_id , object_id => $entry_id , object_ds => $obj->class } );
unless ($oa)
{
    _log("No association found.");
    $oa = MT::ObjectAsset->new;
    $oa->asset_id($asset->id);
    $oa->blog_id($obj->blog_id);
    $oa->object_id($obj->id);
    $oa->object_ds($obj->class);
    $oa->save;
}

という至極単純なプラグインですが、とりあえず、これで、所定の目的は達成できているのでいいことにします。