楽天セール開催中!ポイント最大11倍! セール会場へ

WordPress│ボタンを押してモーダルで表示するカスタマイズ

WordPressでボタンを押したときに説明を重ねて表示するには、HTMLのdialog要素が使えます。

以下はライブラリを追加せず、閉じるボタン・Escキー・キーボード操作に対応する見本です。

SWELL以外のテーマでも、HTMLとJavaScriptを保存できる環境で使えます。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

動く見本:ボタンで開いて閉じる

モーダルの説明

ここに補足説明を入れます。閉じるボタンまたはEscキーで元の画面へ戻れます。

長文モーダルの説明

確認項目1:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目2:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目3:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目4:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目5:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目6:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目7:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目8:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目9:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目10:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目11:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目12:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目13:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目14:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目15:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目16:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目17:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目18:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目19:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

確認項目20:長い説明もモーダルの中でスクロールできます。閉じると、この見本を開いたボタンへ戻ります。

2つの見本はそれぞれ独立して開きます。

「長い説明を開く」では、モーダル内をスクロールして20番目の確認項目まで読めます。

ボタンはEnterキー・Spaceキーでも開けます。

開くと「閉じる」にフォーカスが移り、閉じた後は元のボタンへ戻ります。

背景クリックでは閉じない仕様です。

長文モーダルを開いた直後。先頭の閉じるボタンと確認項目1が見えるPC実画面
公開ページのPC実画面。長文の先頭を表示した状態で、閉じるボタンにフォーカスが移っています。

390px幅でも長文を開いた直後は先頭の「閉じる」と確認項目1が見えます。

モーダル内をスクロールすると確認項目20まで読め、Escで閉じると「長い説明を開く」へフォーカスが戻ります。

スマホ幅390pxの長文モーダルを開いた直後。先頭の閉じるボタンと確認項目1が表示されたWAZA公開ページ
2026年10月2日撮影。スマホ幅390pxでも長文の先頭から表示され、閉じるボタンにフォーカスが移ります。

カスタムHTMLブロックに貼るコード

記事編集画面でカスタムHTMLブロックを追加し、以下をまとめて貼り付けます。

PHPではないのでfunctions.phpやPHPスニペットには貼りません。

まずプレビューを確認し、保存後の公開ページでも操作してください。

<div class="waza-dialog-example">
  <button type="button" data-waza-open hidden>説明を開く</button>
  <dialog class="waza-dialog" aria-labelledby="waza-dialog-title-1">
    <button type="button" data-waza-close autofocus>閉じる</button>
    <p id="waza-dialog-title-1"><strong>モーダルの説明</strong></p>
    <p>ここに補足説明を入れます。閉じるボタンまたはEscキーで元の画面へ戻れます。</p>
    
  </dialog>
  <noscript><p>この見本の操作にはJavaScriptが必要です。</p></noscript>
</div>
<style>
.waza-dialog {
  box-sizing: border-box;
  width: min(36rem, calc(100% - 2rem));
  max-height: 80vh;
  max-height: 80dvh;
  overflow: auto;
  margin: auto;
  padding: 1.5rem;
  border: 0;
  border-radius: .75rem;
  color: #222;
  background: #fff;
}
.waza-dialog::backdrop { background: rgb(0 0 0 / 55%); }
.waza-dialog-example button {
  padding: .7em 1.2em;
  border: 1px solid currentColor;
  border-radius: .3em;
  color: #222;
  background: #fff;
  cursor: pointer;
}
.waza-dialog-example button:focus-visible {
  outline: 3px solid #1769aa;
  outline-offset: 3px;
}
</style>
<script>
(() => {
  const init = () => {
    document.querySelectorAll('.waza-dialog-example').forEach(root => {
      if (root.dataset.wazaReady) return;
      const dialog = root.querySelector('dialog');
      const open = root.querySelector('[data-waza-open]');
      const close = root.querySelector('[data-waza-close]');
      if (!dialog || !open || !close || typeof dialog.showModal !== 'function') return;
      root.dataset.wazaReady = '1';
      open.hidden = false;
      open.addEventListener('click', () => {
        if (!dialog.open) dialog.showModal();
      });
      close.addEventListener('click', () => dialog.close());
      dialog.addEventListener('close', () => open.focus());
    });
  };
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init, { once: true });
  } else {
    init();
  }
})();
</script>

文章・デザイン・複数設置を変更する

モーダル内の2つのp要素を、自分の見出しと補足説明に置き換えます。

幅はCSSの36rem、内側の余白は1.5remで変更できます。

長文は画面内の高さに収めて内部をスクロールする指定です。

閉じるボタンを先頭に置くことで、開いた直後のフォーカス移動で末尾までスクロールされるのを防ぎます。

重要な情報をモーダルだけに置かず、本文にも要点を載せてください。

複数設置するときはdiv.waza-dialog-exampleの一式を複製し、2つ目のaria-labelledbyと対応するpのidを両方waza-dialog-title-2などの固有値に変更します。

CSSとJavaScriptはページ内で1回だけで足ります。

各ボタンは同じ囲み内のdialogを開きます。

掲載JavaScriptは初期化時に存在する囲みを探すため、ページ表示後にAjaxなどで追加されたモーダルを自動では初期化しません。

通常の本文に配置する例として使い、後から内容を読み込む構成では、その読み込み処理に合わせた初期化が別途必要です。

SWELLのブログパーツを入れる場合

SWELLでは説明文の代わりにブログパーツのショートコードを置けます。

[blog_parts id="123"]の123を自分の公開済みブログパーツIDへ変更してください。

これはSWELL固有の機能で、他テーマ共通のHTML機能ではありません。

コード表示用ブロックではなく、実際のdialogの中身へ置きます。

ブログパーツ内のフォーム・タブ・動画などは、非表示状態で初期化するとサイズや操作に影響する場合があります。

この見本はテキストだけで検証する基本例です。

複雑なパーツを入れた場合は、その操作とスマホでのスクロールを別途確認してください。

動かないときの確認と戻し方

保存後にボタンが見えない場合は、scriptが権限やセキュリティ設定で削除されていないか、JavaScriptの遅延・結合処理でエラーになっていないかを確認します。

ボタンは初期化が成功してから表示するため、JavaScriptが使えない環境では操作できません。

dialog.showModalに対応しない古いブラウザーも対象外です。

権限の制限を無効化せず、サイト管理者が許可したJSの設置方法を使ってください。

同じwaza-dialog-example内に、dialog、data-waza-open付きの開くボタン、data-waza-close付きの閉じるボタンがそろっているかも確認します。

掲載コードはどれかが欠けると初期化を中止するため、開くボタンのhiddenだけを外しても開閉できる状態にはなりません。

旧版の#custom-modal、#swell-modal-btn、.modal、.closeを使ったHTML・CSS・PHPとは混ぜないでください。

旧版を停止してから置き換えます。

今回の例を戻すときは、追加したカスタムHTMLブロックを削除するだけです。

CSSやJSを別の場所へ移した場合は、その追加分も取り除きます。

確認する操作

公開ページでマウス、Enter、Spaceによる開閉、Escによる終了、閉じた後のフォーカス復帰、スマホ幅での収まりを確認します。

読み上げ時の名前はaria-labelledbyが参照する説明見出しから付けます。

スクリーンリーダーや全ブラウザーでの確認は別途必要です。

仕様の根拠:MDNのdialog要素(2026年10月4日確認)。

旧GitHub例はこの改訂と同期していないため、本文のコードを使用してください。

よくある質問:WordPressでボタンを押してモーダルで表示するとき

ボタンを押してモーダルで表示するには、何を使いますか?

記事では、HTMLのdialog要素を使います。ライブラリを追加せず、閉じるボタン・Escキー・キーボード操作に対応する見本です。SWELL以外のテーマでも、HTMLとJavaScriptを保存できる環境で使えます。

コードは、どこに貼りますか?

記事では、記事編集画面でカスタムHTMLブロックを追加し、掲載コードをまとめて貼り付けます。PHPではないので、functions.phpやPHPスニペットには貼りません。まずプレビューを確認し、保存後の公開ページでも操作します。

モーダルの文章や幅は、どう変えますか?

記事では、モーダル内の2つのp要素を自分の見出しと補足説明に置き換えます。幅はCSSの36rem、内側の余白は1.5remで変更できます。長文は画面内の高さに収めて内部をスクロールする指定です。重要な情報をモーダルだけに置かず、本文にも要点を載せます。

同じページに、複数のモーダルを置けますか?

置けます。記事では、div.waza-dialog-exampleの一式を複製し、2つ目のaria-labelledbyと対応するpのidを両方、固有値に変更します。CSSとJavaScriptはページ内で1回だけで足ります。

SWELLのブログパーツを、モーダルの中に入れられますか?

入れられます。記事では、SWELLでは説明文の代わりにブログパーツのショートコードを置け、ブログパーツIDは自分の公開済みIDへ変更します。これはSWELL固有の機能で、他テーマ共通のHTML機能ではありません。フォーム・タブ・動画などは、非表示状態で初期化するとサイズや操作に影響する場合があるため、その操作とスマホでのスクロールを別途確認します。

ボタンが表示されない、動かないときは?

記事では、scriptが権限やセキュリティ設定で削除されていないか、JavaScriptの遅延・結合処理でエラーになっていないかを確認します。ボタンは初期化が成功してから表示するため、JavaScriptが使えない環境では操作できません。dialog.showModalに対応しない古いブラウザーも対象外です。

Ajaxで後から読み込んだモーダルにも使えますか?

自動では使えません。記事では、掲載JavaScriptは初期化時に存在する囲みを探すため、ページ表示後にAjaxなどで追加されたモーダルを自動では初期化しません。後から内容を読み込む構成では、その読み込み処理に合わせた初期化が別途必要です。

公開前に、何を確認しますか?

記事では、公開ページでマウス、Enter、Spaceによる開閉、Escによる終了、閉じた後のフォーカス復帰、スマホ幅での収まりを確認します。スクリーンリーダーや全ブラウザーでの確認は別途必要です。旧版の#custom-modalなどを使ったHTML・CSS・PHPとは混ぜず、旧版を停止してから置き換えます。戻すときは、追加したカスタムHTMLブロックを削除します。

  • URLをコピーしました!

実装を任せたい方へ

WordPressのカスタマイズ代行

ブロックの追加、テーマの改修、管理画面の調整など、記事で紹介している内容の実装を承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次