DataAPIEntryCategoriesプラグイン

Movable Type 6.0では、新機能としてData APIが追加されます。
ただ、現時点のData APIはまだ完成形ではなく、「こんな機能があれば...」と思う点も少なくありません。

その1つとして、記事のカテゴリを操作する機能がありません。
そこで、記事のカテゴリを操作するプラグインを作りました。

1.プラグインの概要

このプラグインは、記事のカテゴリについて、Data APIで以下の3つの操作を行うことができるようにするプラグインです。

  • 記事のカテゴリの情報を取得
  • 記事にカテゴリを割り当て
  • 記事に割り当てたカテゴリをすべて削除

2.インストール

プラグインは以下からダウンロードします。

DataAPIEntryCategories_1_01.zip

ダウンロードしたZipファイルを解凍すると、「plugins」と「mt-static」の2つのフォルダができます。
これらのフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

3.エンドポイント

このプラグインをインストールすると、「http://your-host/path-to-mt/mt-data-api.cgi/v1/:site_id/entries/:entry_id/categories」のエンドポイントが追加されます。
「your-host」および「path-to-mt」の部分は、ご自分のMovable Typeのインストール先に合わせて読み替えます。
また、「:site_id」と「:entry_id」は、それぞれウェブサイト(またはブログ)のID/記事のIDに置き換えます。
エンドポイントにアクセスする際のHTTPのメソッドに応じて、以下の動作になります。

IDHTTPのメソッド動作
listCategoriesForEntryGET記事のカテゴリの情報を取得
attachCategoriesToEntryPUT記事にカテゴリを設定
detachCategoriesFromEntryDELETE記事からカテゴリを削除

attachCategoriesToEntryおよびdetachCategoriesFromEntryでは、記事を作成する権限があるユーザーとして、認証することが必要です。

attachCategoriesToEntryでは、POSTの際のリクエストボディとして、「category=カテゴリの配列を表すJSON文字列」を付加します。
配列の個々の要素は、「{"id":カテゴリのID}」のようなオブジェクトにします。
また、配列の先頭にしたカテゴリが、メインカテゴリとして設定されます。

メソッドを実行すると、以下のような構造のJSON文字列が返されます。
配列itemsの先頭のカテゴリが、メインカテゴリになります。

{
  "totalResults":カテゴリの数,
  "items": [
    カテゴリのオブジェクト,
    カテゴリのオブジェクト,
    ・・・
    カテゴリのオブジェクト
  ]
}

なお、deleteCategoriesFromEntryでは、削除する前のカテゴリの情報が、上記のJSONの形で返されます。

4.JavaScript SDK

JavaScript SDKで、記事のカテゴリを操作することも可能です。

4-1.ライブラリの読み込み

Data API本体のJavaScriptライブラリを読み込んだ後に、以下のscript要素で追加のライブラリを読み込みます。

<script type="text/javascript" src="http://your-host/path-to-mt/mt-static/plugins/DataAPIEntryCategories/extension.js"></script>

4-2.メソッドの追加

Data APIのオブジェクトを初期化した後、「FJDataAPIEntryCategories.extendEndPoints(Data APIのオブジェクト)」のような文を実行して、メソッドを追加します。
例えば、Data APIのオブジェクトを変数apiに代入するなら、初期化の処理を以下のようにします。

api = new MT.DataAPI({
  baseUrl:  'http://your-host/path-to-mt/mt-data-api.cgi',
  clientId: 'example',
});
FJDataAPIEntryCategories.extendEndPoints(api);

4-3.記事のカテゴリの情報を取得

記事のカテゴリの情報を取得するには、以下のようなコードを実行します。

api.listCategoriesForEntry(siteId, entryId, params, function(response) {
  if (response.error) {
    // エラー処理
    return;
  }
  // 成功時の処理
});

paramsを指定して、読み込むフィールドを限定したりすることができます。
paramsを指定しない場合は、省略することもできます。

4-4.記事にカテゴリを割り当て

記事にカテゴリを割り当てるには、以下のようなコードを実行します。

api.attachCategoriesToEntry(siteId, entryId, categories, function(response) {
  if (response.error) {
    // エラー処理
    return;
  }
  // 成功時の処理
});

categoriesには、「{"id":カテゴリのID}」の形式のオブジェクトを配列で指定します。
配列の先頭のカテゴリが、記事のメインカテゴリになります。

4-5.記事のカテゴリを削除

記事のカテゴリを削除するには、以下のようなコードを実行します。

api.detachCategoriesFromEntry(siteId, entryId, function(response) {
  if (response.error) {
    // エラー処理
    return;
  }
  // 成功時の処理
});