2023/12/9

MTAppjQuery を使って MT の任意のテンプレートを再構築する #MovableType #MTAppjQuery

この記事は「Movable Type Advent Calendar 2023」9日目の記事です。

MTをつかってサイト構築する際には、記事やページ、コンテンツデータの更新とテンプレート類の再構築を考える必要がある。

コンテンツデータなどの更新にあわせて再構築するといった再構築トリガーも設定出来るが、少し足りないときがあったりする。

MTAppjQuery を使っている場合、 mtapp.rebuildTemplate() というメソッドがあるので、これを使う事でもう少し自由にテンプレートの再構築が出来る。

mtapp.rebuildTemplate() | MTAppjQuery v3 ユーザーマニュアル | MTAppjQuery サポートサイト
https://support.bit-part.net/m...

このメソッド自体の使い方はシンプルで

mtapp.rebuildTemplate({
    siteId: mtappVars.blog_id,
    templateId: 111
});

こんな感じになるので、あとは user.js でどういう条件の時に実行するかを判定・分岐して使っていく。

mtapp.rebuildTemplate() は 2.6.6 以降で利用可能。

MTAppjQuery v2.6.6 リリース - mtapp.rebuildTemplate()を追加、MTAppJSONTable のバグフィックス、オプション拡充 | bit part 合同会社
https://bit-part.net/news/2021...

MTAppjQuery ( user.js )は管理画面のカスタマイズなので、今回の内容は管理画面上での操作が基準となる。
公開予約した記事が公開された時に再構築する、みたいなことには使えない。

利用サンプル

あるサイトのコンテンツデータを作成・編集・保存したときに、そのコンテンツデータを表示させているカテゴリアーカイブ(ID 68)を更新したいと考える。

user.js に書く内容としてはこんな感じになる。

if (
    mtappVars.params.__mode === "view"
    && mtappVars.params._type === "content_data"
    && mtappVars.params.blog_id === "4"
    && mtappVars.params.content_type_id === "7"
    // 新規保存または更新時のパラメータ
    && (mtappVars.params.saved_added === "1" || mtappVars.params.saved_changes === "1")
    ) {
	mtapp.rebuildTemplate({
	    siteId: mtappVars.blog_id,
	    templateId: 68
	});
}

公開したときに限定するなら status を分岐につけてもよい。
status の分岐が無いと保存時に毎回実行されるのでどっちにするかというところ。

左2つがカテゴリアーカイブで、右が月別アーカイブの表示イメージ。

一覧用のテンプレートにコンテンツデータも読み込まれているという想定。

コンテンツデータを更新すると、このようなかんじで再構築するかどうかのモーダルが出る。

モーダルには対象のテンプレート名が表示される。
モーダルを出さないことも指定できる。

確認すると、カテゴリアーカイブが更新されている事を確認できる。
こんな感じで任意にテンプレートの再構築を制御出来る。

これは以前 @tinybeans が書いていた

MTAppjQuery で特定のコンテンツデータを公開・更新した時に別のコンテンツタイプアーカイブを再構築する方法 | MTAppjQuery | かたつむりくんのWWW
https://tinybeans.net/blog/202...

の記事がメソッドになっているもので、 MTAppjQuery v3 のドキュメントを見直していて見つけた。(今回の記事はほぼ内容が同じ)
MTAppjQuery もメソッド増えてきたなぁ、、、、としみじみ。
ご利用いただいているみなさま、ありがとうございますm(__)m

MTAppjQuery v3 は MT8 対応がメインですが、 @tinybeans が書いていたマルチフィールドのコンディショナルフィールドがやはり目玉かなと思う。

ステップバイステップで見る MTAppjQuery v3 のコンディショナルフィールドの使い方 | MTAppjQuery | かたつむりくんのWWW
https://tinybeans.net/blog/202...

是非使ってみてくださいm(__)m


memo

マッピングが複数あるときの DataAPI の publish templates エンドポイント

mtapp.rebuildTemplate() は内部的には DataAPI の templatespublish を利用している。

https://movabletype.github.io/...

表示イメージに月別アーカイブもだしているのは、試していた時にカテゴリアーカイブが再構築されずになんでだろう??というのがあった。
templates の publish は1つのテンプレートにマッピングが複数ある場合は最初(?)の物しか処理されない感じになっていた。

なので、マッピングを1つにすると問題無く処理されるが、月別のとカテゴリ別のがあると、月別のは処理されるがカテゴリ別のは処理されないという状況だった。

テンプレートを指定してるからその辺問題無いかと思っていたが、内部実装はまた違う事情があるようだ。