メニュー経路: WordPress > ユーザーガイド

WordPress プラグイン ユーザーガイド

このガイドは 4 つのセクションで構成されています。§1 クイックスタート ではスクリーンショットと共に最初のショートコードを公開するまでのすべての手順をたどれます。§2〜§4 はもっと深く作り込んだり、問題を解決したりするときに参照する詳細リファレンスです。


1. クイックスタート

WordPress の管理画面で 3Min API → + New メニューを開くと、ショートコードビルダーが表示されます。上から順に 4 ステップをたどれば、ショートコードがひとつ完成します。

はじめての方は、3Min API を見てまわる でエンドポイントと API キーの発行方法を先に確認するか、ChatGPT Apps で「3Min API」を検索して会話から始めることもできます。

1.1 エンドポイント入力 + テスト

エンドポイント入力と Test endpoint の結果

  1. エンドポイント IDAPI key を貼り付け、HTTP メソッド(Get Record / Get List / POST)を選びます。
  2. Test endpoint ボタンを押すと実際のリクエストが送信され、レスポンスがその場にインラインで表示されます。
  3. レスポンスが正常であれば、次のカード(変数、テンプレート)が自動で埋まります。

POST エンドポイントはビルダー内で事前にテストできません。ショートコードを保存してページに貼り付けてから、フォームを送信して確認してください。

1.2 変数の確認

自動検出された変数チップ

テストレスポンスを解析して、利用できるテンプレート変数 がチップ形式で表示されます。代表的な変数:

  • {{response}} — レスポンス全体
  • {{response.payload}} — ユーザーレコードの本体
  • {{response.payload.title}}{{response.id}} のような「ドット記法」で深い階層にアクセス

これらの変数を次のステップの HTML/CSS にそのまま挿入すれば、安全に処理されます。

1.3 テンプレート選択 + AI でデザイン

テンプレートギャラリー + HTML/CSS/JS パネル

  1. メソッド別のテンプレートを選ぶと、HTML/CSS·JavaScript パネルが自動で埋まります。
  2. 上部の Copy AI prompt ボタンを押すと、選んだテンプレートのコード + プラグインの作成ルール + 自動検出された変数がシステムプロンプトにまとめられ、クリップボードへコピーされます。
  3. ChatGPT / Claude / Gemini のような LLM にそのまま貼り付け、「もう少しミニマルに」「ダークモードをデフォルトに」「星評価も見せて」のような自然な言葉でデザインを整えていきましょう。
  4. 結果を HTML/CSS パネル(必要なら JavaScript パネルにも)に戻して、右側のライブプレビューで確認します。

JavaScript パネルはオプションです。JavaScript はサイト管理者のみ保存できます。

1.4 保存 + ページに公開

ショートコード名と Save ボタン

  1. ショートコード名 を入力します(初回保存後は変更できません)。
  2. Save を押すと、次の形式のショートコードが生成されます:
    [3minapi name="your-snippet-name"]
    
  3. この 1 行を記事・固定ページ・ウィジェット・ブロックのどこにでも貼り付ければ、その場所に作成した UI がレンダリングされます。

同じショートコードを複数のページで再利用でき、1 ページに別々のショートコードを複数置くこともできます — それぞれ独立してレンダリングされます。


2. HTML/CSS ガイド

HTML/CSS は保存時にセキュリティ上の理由で一部のコードが自動的に取り除かれます。安全に使用できるタグ・属性・CSS を以下で確認してください。

2.1 レンダリングの仕組み

  • Get Record: ページが開いたときにサーバーで API を呼び出し、レスポンスを含む HTML/CSS が描画された後で JavaScript コードが実行されます。
  • Get List: Get Record と同じ流れです。ただし、最初のページだけサーバーでレンダリングされ、次のページからは JavaScript の threeminApi.fetch() で取得します(「Load more」ボタンなど)。
  • POST: フォームの HTML/CSS が先にレンダリングされ、ユーザーがフォームを送信したときに API 呼び出しと JavaScript ハンドラーが動作します。(JavaScript コード自体はレンダリング直後に登録され、送信時点で動くように準備されます。)
  • すべてのショートコードはレンダリング時に自動で <div class="threemin-api-rendered" data-3minapi-preset="<snippet>">…</div> で包まれます。JavaScript で root を探すときはこの属性を使ってください — 自分の HTML に data-3minapi-preset追加してはいけません

2.2 許可されるタグ・CSS

カテゴリ 許可
テキストタグ h1h6pdivspanblockquoteul / ol / li、テーブル系、aimgfigurefigcaption
フォームタグ forminputbuttontextareaselectoptionfieldsetlegendlabel
スタイリング <style> ブロック
CSS 色 / タイポグラフィ、ボックスモデル、レイアウト(Flexbox + Grid)、モーション(transformtransitionanimationfilter)、インタラクション(pointer-eventscursoruser-select)
表示切替 hidden 属性、<style> 内の display:none クラス、インライン style="display:none"
保存時に削除 <script> タグ、PHP タグ(<?php<?=)、インラインイベントハンドラー(onclickonerror、…)、javascript: URL

一部のインライン style プロパティは保存時に削除されます — CSS ルールは <style> ブロックの中に書いてください。

2.3 推奨パターン

  • セマンティック HTML5 — 見出し、リスト、表は表系のタグで、画像 + キャプションは figure + figcaption を組み合わせます。
  • ショートコード名を接頭辞に持つ BEM クラス.product-card.product-card__title のような形。同じショートコードが 1 ページに複数あっても衝突しません。
  • ショートコードごとに <style> ブロックを 1 つ。
  • モダンなレイアウト — Flex / Grid / gap すべて許可。
  • レスポンシブな単位rem%vwvh
  • 画像の遅延読み込み<img loading="lazy">
  • アクセシビリティaria-labelaria-hiddenrole="..." はすべて保存後もそのまま動作します。
  • HTML5 フォームバリデーションrequiredminmaxpatterntype=email/number/date/… がそのまま適用されます。

2.4 避けるべきパターン

  • ⚠️ フォーム系タグへの独自 data-3minapi-*(最もよくある無反応の原因 — エラーすら出ません)。 <button> / <input> / <textarea> / <form> / <select> / <fieldset> にホワイトリスト外の data-* 属性を付けると、保存時にひそかに削除され、その後の JS の querySelector('[data-...]')null を返しますが、コンソールにエラーも出ません。ボタンや入力のようなインタラクション要素は BEM クラスで指定してください。<div> / <span> / <li> のような一般タグはどんな data-* も通過します。
  • セレクターは HTML と完全に一致しなければなりません — 1 文字のタイプミスでもエラーなく無反応になります。
  • <div role="button"> ではなく <button> を使ってください。
  • レイアウトをインライン style="..." で組まないでください — <style> ブロックの中に書きます。
  • id でスタイリングしないでください — 同じショートコードが 1 ページに 2 回入ると id が衝突します。クラスを使ってください。
  • トップレベルのコンテナに固定 px 幅は禁止 — レスポンシブが壊れます。

2.5 メソッド別の作成のコツ

2.5.1 Get Record — API フィールドを HTML に差し込む

  • Test endpoint 実行後、Variables カードに 2 つのチップが表示されます: {{response}}(レスポンス全体)、{{response.payload}}(ユーザーレコード)。
  • ドット記法で下位にアクセス: {{response.payload.title}}{{response.id}}{{response.payload.author.name}}
  • 変数の値は自動的に安全に処理されます。
  • 表示/編集の切替属性(フォーム系タグ用のホワイトリスト): data-3minapi-view-modedata-3minapi-edit-modedata-3minapi-edit-toggledata-3minapi-savedata-3minapi-canceldata-3minapi-delete。編集フォーム内の input は普通の name="..." を使います。

2.5.2 Get List — 動的なアイテムのレンダリング

  • HTML には空のコンテナだけを置き、JavaScript がランタイムで各行を追加します。ハードコードした行は公開ページで重複してしまいます。
  • DOM フックのホワイトリスト: <ul data-3minapi-feed-list>(アイテムコンテナ)、<button data-3minapi-feed-more>(Load more)、[data-3minapi-feed-empty](空状態)。
  • 変数チップ: {{response.data}}(配列 — テンプレート内では空に置換、参考表示のみ)、{{response.pagination.next_cursor}}{{response.data.0.payload.x}}(インデックスで単一レコードにアクセス、静的に表示される領域用)。
  • 複数行のレンダリングとページネーションは JS パネルで処理します。

2.5.3 POST — フォームをエンドポイントに接続

  • エンドポイントの body フィールド定義を 3Min API ダッシュボードで確認してください。
  • 各 input の name 属性を body フィールド名と完全に一致させてください。
  • 自動送信バインディング: [data-3minapi-preset] の内側に <form data-3minapi-form> を置くと、ランタイムが submit イベントをインターセプトします。組み込みの POST テンプレートにはすでに含まれています。
  • 自動ステータスフィードバック: フォームの中に <div data-3minapi-status></div> を置いてください。ランタイムが textContent を書き込み、is-success / is-error クラスを切り替えます。
  • HTML5 バリデーション属性(requiredminmaxpatterntype=email/number/date/…)はそのまま適用されます — JS なしで軽量なバリデーションが可能です。
  • カスタムバリデーション、条件付き送信、ライフサイクルフックが必要な場合は JavaScript パネルを使ってください。

3. JavaScript ガイド

JavaScript パネルはオプションで、サイト管理者のみ保存できます。ここに貼り付けたコードはショートコードの HTML/CSS がレンダリングされた直後に自動で実行されます。

3.1 実行方式

  • ランタイムで (function(scope){ /* your code */ })('<snippet>') の形に自動で包まれます。<script> タグ、import、IIFE ラッパーはどれも必要ありません。
  • scope 変数は自動で注入されるので、そのまま使ってください。ショートコード名を 文字列リテラルとしてコードに直接書かないでください
  • 同じショートコードが 1 ページに複数現れる場合、各インスタンスは自分の scope で独立して実行されます。
  • すべてのヘルパーは window.threeminApi.* から使えます。レスポンスフィールドの正確なパスとサンプルコードは Copy AI prompt の結果にある [Sample —] ブロックにすべて入っています。

3.2 実行環境

  • 普通のブラウザ JavaScript(ES2017+) — async/awaitfetchPromise、アロー関数、分割代入すべて動作します。
  • DOM API を直接使用 — document.querySelectoraddEventListenercreateElement など。
  • ショートコード内では import は使えません。外部ライブラリはテーマ/プラグインの wp_enqueue_script で読み込み、グローバル(window.X)としてアクセスしてください。
  • JavaScript の保存はサイト管理者のみ可能です。HTML/CSS など他のフィールドは管理者以外のユーザーでも保存できます。

3.3 ヘルパー一覧

ヘルパー モード 動作
data(scope) All インラインされたレスポンスをパース(ネットワーク呼び出しなし)。なければ null
fetch(scope, q) Get List サーバープロキシ経由で次のページを取得。{ cursor: <next_cursor> }
fetchById(scope, id) Get List id で単一レコードを GET。
submit(scope, body) POST <form data-3minapi-form> があれば自動バインドされます — 直接呼ぶケースはまれです。
update(scope, body) Get Record ショートコードが指すレコードを PUT。
updateById(scope, id, body) Get List id で単一レコードを PUT。
delete(scope) Get Record ショートコードが指すレコードを DELETE。
deleteById(scope, id) Get List id で単一レコードを DELETE。
on(scope, event, cb) POST 'before-submit' / 'success' / 'error' フックを登録。

mutation はキュー確認レスポンスのみ返します。更新後のレコードは返しません。 update / delete / updateById / deleteById のレスポンスは successmessageid(キュータスク id でレコード id では ありません)、queued_at を含む確認レスポンスです。送信した body で DOM を直接更新してください(楽観的 UI)。実際のレコード書き込みは後続の GET より ~3 秒程度遅れる可能性があります。

3.4 推奨 / 避けるべきパターン

推奨

  • root は一度だけ探すvar root = document.querySelector('[data-3minapi-preset="' + scope + '"]'); として、その後すべてのセレクターを root.querySelector(...) で範囲を限定。同じショートコードが複数レンダリングされても安全です。
  • イベント委譲 — 動的に追加される行には、コンテナに 1 つだけリスナーを掛けて e.target.closest('.…') で識別します。
  • dataset で行の識別li.dataset.recordId = item.id で 1 度刻んでおき、クリックハンドラーで e.target.closest('li').dataset.recordId を読みます。
  • 読み込みはキャッシュを利用threeminApi.data(scope) はインラインの JSON をパースするだけなので、繰り返し呼んでも負担はありません。
  • mutation のレスポンスは確認レスポンスupdate/delete のレスポンスはキュー確認レスポンスだけなので、送信した body で DOM を更新(楽観的 UI)してください。

避ける

  • ⚠️ scope + record_id の文字列連結で element id を作る — ショートコード名とアップストリームのレコード id はまったく異なる文字列です。
  • ⚠️ mutation レスポンスの wrap 深度の誤認 — success は res.json.data.data.success にあります。res.json.data.success(.data が 1 つ足りない)を読むと常に falsy になり、HTTP 200 がエラー処理経路に流れる最もよくある落とし穴になります。
  • mutation のレスポンスから更新後のレコードを読もうとする — キュー確認レスポンスにはレコードの中身はありません。
  • mutation 直後にすぐ再取得する — 非同期処理で ~3 秒遅れる可能性があります。setTimeout(..., 3000) と "Saving…" インジケーターを使ってください。
  • mutation の body を { payload: { ... } } で包む — body は 1 段のオブジェクト { field: value } の形です。ネストされたオブジェクトは URL エンコードの過程でエラーなく消えてしまいます。
  • record_id を合成する — [A-Za-z0-9_-] に一致し、≤256 文字である必要があります。違反するとサーバーが 422 エラーを返します。前のレスポンスで API が返した id をそのまま再利用してください。
  • ショートコード名をコードに直接書く — 自動注入された scope 変数を使ってください。

3.5 レスポンスの wrap 深度 — よくある落とし穴

WordPress の wp_send_json_success が 1 度、プラグインの admin-ajax ハンドラーが 1 度ラップします。結果:

  • ページ内の単一 GET 読み込み(data(scope)) — data(scope).data.payload.X
  • fetch() の次のページ — レスポンス全体は res.json.data.data(.data 2 つ)。
  • fetchById() 単一レコード — レコードは res.json.data.data.data(.data 3 つ)。
  • mutation キュー確認レスポンス — res.json.data.data.{success, message, id, queued_at}(.data 2 つ)。
  • POST 'success' フックのイベント — e.response.data.data.{success, …}(.data 2 つ)。

シグネチャ全体と検証済みのサンプルコードは Copy AI prompt の結果にある [Sample —] ブロックを参照してください。


4. よくある質問

4.1 「ボタンをクリックしても反応がなく、コンソールにエラーも出ません」

フォーム系タグ(<button><input><form><select><fieldset>)に data-* 属性を付けましたね。WordPress のセキュリティフィルター(wp_kses)が保存時に削除したため、querySelector('[data-...]')null を返し、リスナーが登録されず、ログも何も出ません。

解決 — その要素を BEM クラス(<button class="my-card__back">)に切り替え、root.querySelector('.my-card__back') で探してください。

4.2 「カードが空、もしくはフィールドが undefined として表示されます」

レスポンスから読み込んでいるパスが間違っています。ヘルパーごとの正確なパスは AI prompt の [Sample —] ブロックにすべて記載があります。よくある正解:

  • data(scope).data.payload.X — 単一 GET。
  • res.json.data.data.data.payload.XfetchById(三重ラップ)。

4.3 「Update が HTTP 200 を受け取ったのに画面が変わりません」

res.json.data.success を確認していますね。このパスは .data が 1 つ足りないため、mutation では常に undefined になります。mutation の success フラグは res.json.data.data.success にあります(WP が 1 度、プラグインが 1 度包みます)。delete / updateById / deleteById も同じです。POST 'success' フックの対応パスは e.response.data.data.success です。

4.4 「リストが空に見えますが API は 200 を返しています」

DOM フックのセレクターが HTML と完全に一致していません。HTML を再度見て、data-3minapi-feed-list(またはカスタムフック)がそのまま書かれているか確認してください。

4.5 「保存後に CSS ルールが効きません」

そのルールがインラインで安全フィルターに削除されたか、安全 CSS リストにないプロパティです。<style> ブロックの中に移してください。

4.6 「POST はちゃんと送信されたのにフィードバックが見えません」

フォームの中に <div data-3minapi-status></div> がありません。ランタイムはこの要素にしか textContent を書き込まず、is-success / is-error を切り替えません。

4.7 「Update は成功したのに UI に古い値が残っています」

mutation のレスポンスから更新後のレコードを読もうとしましたね。mutation はキュー確認レスポンスのみを返します — レコードの中身はありません。送信したばかりの body で DOM を直接更新してください。

4.8 「mutation 直後にページを再読み込みしても古いデータが見えます」

mutation は非同期で処理されるため、再取得が ~3 秒まで遅れる可能性があります。楽観的 UI を使ってください。再取得がどうしても必要であれば、"Saving…" インジケーターと一緒に setTimeout(..., 3000) で行います。

4.9 「JS パネルが無効化されており案内が出ます」

そのアカウントには JavaScript を保存する権限がありません(マルチサイトや制限ロールでよくあります)。JavaScript なしで保存するか、サイト管理者に JavaScript 部分の保存を依頼してください。

4.10 「Test endpoint がネットワークエラーを返します」

3Min API ダッシュボードでエンドポイント ID と API キーを確認してください。


ヘルプを得る

  • 3Min API を見てまわる3minapi.com/tour
  • 直接お問い合わせcontact@3minapi.com
  • WordPress.org サポートフォーラム — プラグインの正式公開後、ディレクトリページの Support タブで利用できます。