wordpress

WordPress Interactivity APIの使い方|stateとactionを実働デモで理解する

WordPress Interactivity APIのstate・context・action・data-wp属性を同期デモで解説。block.json、viewScriptModule、storeの最小構成と採用判断まで分かります。

この記事の目次
  1. 先に結論:APIを使う判断基準
  2. stateとactionの同期を触って理解する
  3. 離れた2つの表示が同じstateを参照する
  4. 商品欄
  5. ヘッダーのカート
  6. 必要な4要素を整理する
  7. 最小ブロックを作る手順
  8. 1. block.jsonでInteractivity APIを有効にする
  9. 2. PHPでディレクティブ付きHTMLを出す
  10. 3. view.jsでstoreを登録する
  11. contextを使う場面
  12. アクセシビリティはAPI任せにしない
  13. つまずきやすい点と解決策
  14. クリックしてもactionが呼ばれない
  15. 複数ブロックの値が意図せず同期する
  16. 古いWordPressでも動かしたい
  17. 導入前チェックリスト
  18. まとめ
  19. 関連記事
  20. 参照した公式資料

WordPress Interactivity APIは、ブロックのHTMLへ宣言的な属性を付け、共有stateとactionでフロント側の操作を組み立てる仕組みです。カウンター、絞り込み、カート、アコーディオンなどを、WordPressが管理する共通ランタイム上で実装できます。

情報確認日:2026年8月20日

先に結論:APIを使う判断基準

向いているケース

  • 独自ブロックの公開画面に状態と操作が必要
  • 別のDOM領域でも同じstateを同期したい
  • PHPで出した初期HTMLを保ちつつ、必要な部分だけ対話化したい
  • WordPress標準の仕組みに沿って処理を分割したい

単発ボタン1つだけなら素のJavaScriptでも十分です。エディター画面の設定パネルを作るAPIではありません。

スポンサーリンク

stateとactionの同期を触って理解する

CONCEPT DEMO

離れた2つの表示が同じstateを参照する

商品欄とヘッダー欄は別の領域ですが、同じ値を表示します。ボタン操作がaction、数字がstateのイメージです。

商品欄

0

ヘッダーのカート

0


このデモは概念説明用です。WordPress本体のディレクティブを使う実装は以下のコードで確認できます。

必要な4要素を整理する

要素 役割
namespace 機能の名前空間 devsakaso/cart
state 共有したい値 カート件数
context その要素周辺だけの値 商品のIDや開閉状態
actions / callbacks 操作・副作用 追加、削除、初期化

サイト全体で共有する値をすべてcontextへ入れたり、各カード固有の値をglobal stateへ入れたりすると、更新範囲が分かりにくくなります。「共有するか、その要素だけか」で分けます。

最小ブロックを作る手順

1. block.jsonでInteractivity APIを有効にする

{
  "apiVersion": 3,
  "name": "devsakaso/counter",
  "title": "Interactive Counter",
  "category": "widgets",
  "supports": {
    "interactivity": true
  },
  "render": "file:./render.php",
  "viewScriptModule": "file:./view.js"
}

viewScriptModuleは公開画面で使うScript Moduleを登録します。通常のviewScriptと混同せず、公式ドキュメントで対象WordPressバージョンを確認してください。

2. PHPでディレクティブ付きHTMLを出す

<div
  <?php echo get_block_wrapper_attributes(); ?>
  data-wp-interactive="devsakaso/counter"
>
  <button data-wp-on--click="actions.increment">
    追加
  </button>
  <output data-wp-text="state.count"></output>
</div>

data-wp-interactiveでnamespaceを宣言し、data-wp-on--clickでクリックをactionへ結び、data-wp-textでstateを表示します。初期HTMLをPHPで出しておけば、JavaScriptの読込前にもページ構造を保てます。

3. view.jsでstoreを登録する

import { store } from '@wordpress/interactivity';

const { state } = store('devsakaso/counter', {
  state: {
    count: 0,
  },
  actions: {
    increment() {
      state.count += 1;
    },
  },
});

同じnamespaceを使う領域はstateを共有できます。外部APIを呼ぶactionは待機中・失敗・再試行の状態も設計し、連打や二重送信を防ぎます。

contextを使う場面

一覧に複数のアコーディオンがあり、各項目の開閉を個別に持つならcontextが適します。PHP側でwp_interactivity_data_wp_context()を使い、項目固有の初期値を安全にJSON化できます。JavaScript側ではgetContext()で現在の要素に対応する値を取得します。

import { getContext, store } from '@wordpress/interactivity';

store('devsakaso/accordion', {
  actions: {
    toggle() {
      const context = getContext();
      context.isOpen = !context.isOpen;
    },
  },
});

アクセシビリティはAPI任せにしない

stateが変わっても、意味のあるHTMLやフォーカス管理が自動で完成するわけではありません。開閉ボタンならaria-expandedと対象の関連付け、非同期結果なら適切な通知、メニューならキーボード操作を設計します。divへクリックを付けるのではなく、操作にはbuttonを使うのが出発点です。

つまずきやすい点と解決策

クリックしてもactionが呼ばれない

namespaceの不一致、supports.interactivity、Script Moduleの登録、ディレクティブ名を確認します。ブラウザのConsoleだけでなく、生成されたHTMLに属性が残っているかを見ます。

複数ブロックの値が意図せず同期する

global stateへ置いた値はnamespace内で共有されます。各ブロック固有ならcontextへ移し、共有が必要な値だけstateに残します。

古いWordPressでも動かしたい

Interactivity APIはWordPress 6.5で導入されました。対応バージョンをプラグイン要件へ明記し、古い環境が対象なら従来のJavaScript実装を別ビルドとして用意するか、機能を静的表示へ縮退させます。

導入前チェックリスト

  • 静的HTMLだけでも内容が理解できる
  • stateとcontextの境界を説明できる
  • actionの連打、失敗、待機中を処理している
  • キーボードとスクリーンリーダーで操作できる
  • 対象WordPressバージョンをテストしている

まとめ

Interactivity APIは、WordPressブロックの公開画面へ状態と操作を追加する共通基盤です。共有値はstate、局所値はcontext、操作はactionへ分け、PHPの初期HTMLを残して段階的に対話化してください。単純な処理を無理に移行するのではなく、複数領域の同期や再利用性が必要になった時点で採用するのが現実的です。

関連記事

参照した公式資料

スポンサーリンク