MTAppjQuery:記事編集画面からコンテンツデータと関連付けを行う
2025.11.11
MTAppjQuery を使って、MTの記事編集画面からコンテンツデータとの関連付けをできるようにしたときのメモです。

【注】MTAppjQuery、Data API(json)ともに知識が浅く、参考にできる情報も少なかったためやや強引な実装になっているかと思います。それでもできないよりはマシという方向けになります。

●やりたいこと
・MTの記事編集画面から、コンテンツデータの一覧を開いて関連付けする。
・一覧ではラベルやID以外に、特定のコンテンツフィールドも表示する。(これに詰まっていた)

●実装手順
(1) 関連付けたコンテンツデータの情報を保存するためのカスタムフィールドを作成する。(種類はテキスト)

(2)MTAppjQuery の user.js に以下のように記述。

(function($){

// ID:1のブログに適用
if( mtappVars.blog_id == 1 ){

// 記事編集画面のみ
if (mtappVars.screen_id === 'edit-entry') {
        
    // コンテンツデータを選択するボタン
    $('#customfield_**カスタムフィールドのベースネーム**').MTAppListing({
        url: 'https://xxxxxxxxxxxxx/mt/mt-data-api.cgi/v6/sites/1/contentTypes/2/data', // DataAPIのパスを入れる。「/1/」はブログID、「/2/」はコンテンツタイプID
        data: {
            fields: 'id,label,data',
            limit: 9999999
        },
        dialogTitle: 'コンテンツデータを選択',
        jsontable: {
            header: {
                id: 'ID',
                field_A: 'フィールドA',
                label: 'テーマタイトル'
            },
            headerOrder: ['id', 'field_A', 'label'],
            itemsRootKey: 'items',
            listingCheckboxType: 'radio',
            listingTargetKey: 'id',
            listingTargetEscape: false,
        },
        // json読み込み完了時に実行
        cbAjaxDoneFilterJSONTable: function(cb, $dialog, response) {
            // fieldMap: 出力キー名 : 項目名
            const fieldMap = {
                field_A: 'フィールドA' // ここでコンテンツフィールドの項目名と、それを扱うためのキー名を設定する。
            };
            response.items = flattenContentTypeItems(response.items || [], fieldMap);
            return response;
        }
    });

    // jsonを整形する関数
    // コンテンツタイプのフィールドデータはすべて"data"に格納されているので、そのままでは MTAppListing で使用できない。
    // 出力キー名を使用して呼び出せるように整形する。
    function flattenContentTypeItems(items, fieldMap) {
        return items.map(function(item){
        // fieldMap に従って item に新しいキーを作る
        Object.keys(fieldMap).forEach(function(key){
            const labelName = fieldMap[key];
            const field = item.data.find(f => f.label === labelName);
            item[key] = field ? field.data : '';
        });
        return item;
        });
    }

}
}
})(jQuery);

ポイントとしては、
・.MTAppListing() では呼び出した JSONファイルから header: {}内で指定したデータを扱うが、コンテンツデータは各フィールドのデータがすべて"data"内に格納されていてそのままでは使用できない(おそらく)
・そのため、呼び出したJSONを一旦加工して、任意のキーで呼び出せるようにする
・そのキーを header: {}内で使用する
という感じです。

月別アーカイブ