UI の差し込み(Slot / Fill)


管理画面のあらかじめ決められた位置に、独自のボタンやパネルを追加できます。

実験的機能

この機能は Ver. 3.2 の間は実験的機能として提供し、Ver. 3.3 で正式に提供する予定です。

  • 変わりうる範囲: 差し込み位置の名前(Slot 名)と、そこで受け取れる値は、マイナーバージョンアップで変更される可能性があります。
  • 変わらない範囲: PHP 側のフック処理・テンプレート挿入・アセット API は、この実験的機能の対象外です。従来どおりの仕様として提供しています。
  • 公開 API の線引き: このページの一覧に掲載している Slot 名を公開 API として扱います。掲載外のものも利用できますが、告知なく変更されることがあります。
  • サポート対象外: 管理画面に追加した独自の JavaScript・CSS は、バージョンアップ後の動作を保証しません。これらを原因とする不具合は、サポートの対象外です。

差し込み位置(Slot)とは

管理画面の特定の場所に用意された、名前付きの差し込み口です。追加のみができます。 既存のボタンを消したり、置き換えたりはできません。

差し込みは ctx.ui.fill(差し込み位置の名前, 内容) で行います。

DOM で差し込む

React を使わない場合はこちらです。渡された要素に自由に DOM を追加できます。

ACMS.plugins.register('my-plugin', {
  setup(ctx) {
    ctx.ui.fill('media.edit-modal.footer', (el) => {
      const button = document.createElement('button');
      button.type = 'button';
      button.className = 'acms-admin-btn';
      button.textContent = '外部システムに送信';
      button.addEventListener('click', () => sendToExternal());
      el.append(button);

      // 画面が閉じられたときに呼ばれる(省略可)
      return () => button.remove();
    });
  },
});
  • 引数 el は、差し込み位置に用意された空の要素です。
  • この要素の中身は管理画面側から書き換えられません。 自分で追加した DOM がいつのまにか消えることはありません。
  • 戻り値の関数は、その画面が閉じられたときに呼ばれます。イベントリスナーの解除などに使ってください。

差し込み位置が渡す値(下の一覧の「受け取れる値」)を DOM 版で使うことはできません。値が必要な場合は次の React 版を使ってください。

React で差し込む

管理画面と同じ React を使えます。値を受け取らない場合は、引数のないコンポーネントをそのまま渡します。

ACMS.plugins.register('my-plugin', {
  setup(ctx) {
    ctx.ui.fill('preview.actions', function MyButton() {
      return ACMS.Library.React.createElement('button', { type: 'button', className: 'acms-admin-btn' }, '送信');
    });
  },
});

差し込み位置の値を受け取る

編集中のメディアやエディターの情報を受け取りたい場合は、ACMS.plugins.withFillProps() でラップします。

ACMS.plugins.register('my-plugin', {
  setup(ctx) {
    const { withFillProps } = ACMS.plugins;

    ctx.ui.fill(
      'media.edit-modal.field.alt',
      withFillProps(({ item, previewSrc, setAlt }) =>
        ACMS.Library.React.createElement(
          'button',
          {
            type: 'button',
            className: 'acms-admin-btn',
            onClick: async () => {
              const alt = await generateAlt(previewSrc);
              setAlt(alt);
            },
          },
          'alt を自動入力'
        )
      )
    );
  },
});

withFillProps を忘れると値が渡りません

値を受け取るコンポーネントをそのまま渡すと、DOM 版の書き方(要素を受け取る関数)と区別できないため、正しく動きません。値を受け取る場合は必ず withFillProps() でラップしてください。

JSX で書きたい場合は 開発環境と型定義 を参照してください。

差し込み位置の一覧

差し込み位置場所受け取れる値効く画面
unit-editor.unit-toolbarユニット共通のツールバー(各ユニットの操作ボタンが並ぶ場所)editor, unitエントリー編集・インライン編集・編集設定のユニット編集
unit-editor.topユニットエディターの上部(本文編集領域の直前)editor同上
unit-editor.bottomユニットエディターの下部(本文編集領域の直後)editor同上
block-editor.menusブロックエディターのメニュー群の直後editor, appendToブロックエディターを使うすべての画面
block-editor.block-menuブロックのツールバー(ブロックを選択したときに表示されるツールバー)の共通区画の直後。ブロックの種類を問わず表示editor, variantブロックエディターを使うすべての画面
block-editor.block-menu.textツールバーのテキスト系ブロック(段落・見出し・引用など)の区画の末尾editor, variant(常に 'text')同上
block-editor.block-menu.imageツールバーの画像ブロックの区画の末尾editor, variant(常に 'image')同上
block-editor.block-menu.fileツールバーのファイルブロックの区画の末尾editor, variant(常に 'file')同上
block-editor.block-menu.linkButtonツールバーのリンクボタンブロックの区画の末尾editor, variant(常に 'linkButton')同上
block-editor.block-menu.tableツールバーのテーブル(セル選択時)の区画の末尾editor, variant(常に 'table')同上
media.edit-modal.field.altメディア詳細の alt 入力欄の直後item, previewSrc, getAlt(), setAlt(値)メディア詳細モーダル(メディア管理・カスタムフィールド・ブロックエディター・リッチエディター・ユニットなどから開く画面すべて)
media.edit-modal.fieldsメディア詳細の編集タブ、項目テーブルの直後item同上
media.edit-modal.footerメディア詳細の保存ボタンの直後item, getFormData()同上
media.list.bulk-actionsメディア一覧の一括操作エリアselectedItems(選択中のメディア)メディア管理の一覧
preview.actionsプレビューの操作ボタン群の直後なしプレビューモーダル・インラインプレビュー

補足:

  • media.edit-modal.field.alt は、管理画面の設定で alt 入力欄を非表示にしている場合、この差し込み位置も一緒に非表示になります。
  • setAlt(値) を使うと、入力欄の表示・内部の値・高さの自動調整がまとめて更新されます。getAlt() は現在の値を返します。
  • getFormData() は、その時点で保存されようとしている内容を FormData として返します。
  • preview.actions は、プレビューのキャプチャまたは共有が有効なときだけ表示されます。

同じ位置に複数のプラグインが差し込んだとき

JS が読み込まれた順に並びます。 優先度の指定はありません。順序を制御したい場合は、アセット API の登録順で調整してください。

差し込む UI の見た目を合わせる

管理画面と同じ見た目にするには、管理画面の CSS クラスをそのまま使えます。

button.className = 'acms-admin-btn acms-admin-btn-primary';

変更履歴

バージョン変更内容
Ver. 3.2.29新規追加(実験的機能)