📃

【Movable Type】記事一覧をjson形式で出力する

2023/12/03に公開

Movable Typeの記事一覧をjson形式で出力する方法

概要

MTのグローバル・モディファイアにencode_jsonというものがあるので、これを使用して作成します。
また、jsonファイルに不要な空行などが入ることによるエラーを防ぐため、compress modifierプラグインを使用しています。このプラグインはGitHubで公開されているほか、MTAppjQueryプラグインにも独自のモディファイアとして内包されています。

参考

json出力記述

以下、標準的なもののみ出力しています。カスタムフィールドなども同様の方法で出力可能です。
出力内容は以下です。

  • ID
  • タイトル
  • 日付
  • カテゴリ(フォルダ)ラベル
  • カテゴリ(フォルダ)ベースネーム
  • 本文

MTEntries(記事一覧)

<mt:For compress="3">

<mt:Entries lastn="0">
  <mt:EntriesHeader>[</mt:EntriesHeader>
  {
    "id": <mt:EntryID encode_json='1'>,
    "title": "<mt:EntryTitle encode_json='1'>",
    "date": "<mt:EntryDate format='%Y-%m-%d' encode_json='1'>",
    "categoryLabel": "<mt:CategoryLabel encode_json='1'>",
    "categoryBasename": "<mt:CategoryBasename encode_json='1'>",
    "description": "<mt:EntryBody encode_json='1'>"
  }<mt:Unless name="__last__">,</mt:Unless>

  <mt:EntriesFooter>]</mt:EntriesFooter>
</mt:Entries>

</mt:For>

lastn="0"で全件出力しています。

MTPages(ウェブページ一覧)

<mt:For compress="3">

<mt:pages lastn="0">
  <mt:SetVarBlock name="folder_label"><mt:PageFolder><$mt:FolderLabel$></mt:PageFolder></mt:SetVarBlock>
  <mt:SetVarBlock name="folder_basename"><mt:PageFolder><$mt:FolderBasename$></mt:PageFolder></mt:SetVarBlock>
  <mt:PagesHeader>[</mt:PagesHeader>
  {
    "id": <mt:PageID encode_json='1'>,
    "title": "<mt:PageTitle encode_json='1'>",
    "date": "<mt:PageDate format='%Y-%m-%d' encode_json='1'>",
    "folderLabel": "<mt:Var name='folder_label' encode_json='1'>",
    "folderBasename": "<mt:Var name='folder_basename' encode_json='1'>",
    "description": "<mt:PageBody encode_json='1'>"
  }<mt:Unless name="__last__">,</mt:Unless>

  <mt:PagesFooter>]</mt:PagesFooter>
</mt:pages>

</mt:For>

lastn="0"で全件出力しています。

MTContents(コンテンツタイプ一覧)

<mt:For compress="3">

<mt:Contents content_type="[コンテンツタイプ番号]">
  <mt:ContentsHeader>[</mt:ContentsHeader>
  {
    "id": <mt:ContentID encode_json='1'>,
    <mt:ContentField content_field="タイトル">"title": "<mt:ContentFieldValue encode_json='1'>",</mt:ContentField>
    "date": "<mt:ContentDate format='%Y-%m-%d' encode_json='1'>",
    <mt:ContentField content_field="区分">"category_label": "<mt:CategoryLabel encode_json='1'>",</mt:ContentField>
    <mt:ContentField content_field="区分">"category_basename": "<mt:CategoryBasename encode_json='1'>",</mt:ContentField>
    <mt:ContentField content_field="概要">"description": "<mt:ContentFieldValue encode_json='1'>"</mt:ContentField>
  }<mt:Unless name="__last__">,</mt:Unless>

  <mt:ContentsFooter>]</mt:ContentsFooter>
</mt:Contents>

</mt:For>

[コンテンツタイプ番号]には、作成したコンテンツタイプのIDを記入します。

jsonデータの用途など

jsonデータを生成することで、MTをHeadless CMSとして使用したり、外部サイトへ記事を連携するといったことがしやすくなります。

jsonファイルを生成せず、記事だけを登録してData APIを使用する方法もあるのですが、個人的にはjsonファイルを出力した方が扱いやすいので、この方法をよく使っています。

Discussion