WordPressのリストブロックを使い、親項目のボタンで子リストを開閉する方法です。
項目の階層と子リストのリンクを保ったまま、必要な内容だけを展開できます。
CSSとJavaScriptを追加し、PHPは使いません。
文章を折りたたむだけなら、標準の「詳細」ブロックやSWELLのアコーディオンブロックも選べます。
この方法は、既にある入れ子のリストを開閉したい場合に使います。
動く見本:子リストを開く・閉じる
「実装の準備」は最初は閉じ、「作りたい表示を選ぶ」は最初から開いています。
ボタンをクリックするほか、Tabキーで移動してEnterまたはSpaceでも開閉できます。
子リスト内のリンクは通常のリンクとして使えます。
- 実装の準備
- 作りたい表示を選ぶ
リストブロックの作り方とクラス名
リストブロックで親項目を作り、その下に子リストを入れます。
親項目のラベル全体を太字にし、親の「リスト項目」ブロックを選択します。
「高度な設定 → 追加CSSクラス」にwaza-list-toggleを入力してください。
外側のリストブロック全体に付ける設定ではありません。
最初から開く項目には、同じ欄にwaza-list-toggle is-openと入力します。
親のラベルにリンクを付けると「移動」と「開閉」が競合するため、この実装はリンクを含むラベルをボタンへ変換しません。
リンクは子リストに置いてください。
編集画面のコードエディターで同じ見本を作る場合は、次のブロック記法を貼り付けます。
これはカスタムHTMLブロック用ではありません。
ビジュアル編集へ戻すとリストブロックとして編集できます。
<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item {"className":"waza-list-toggle"} -->
<li class="waza-list-toggle"><strong>実装の準備</strong><!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><a href="https://motoki-design.co.jp/wordpress/swell-customize-css/">CSSの貼り付け先と戻し方</a></li>
<!-- /wp:list-item --><!-- wp:list-item -->
<li><a href="https://motoki-design.co.jp/wordpress/swell-child-theme/">子テーマが必要か確認する</a></li>
<!-- /wp:list-item --></ul><!-- /wp:list --></li><!-- /wp:list-item -->
<!-- wp:list-item {"className":"waza-list-toggle is-open"} -->
<li class="waza-list-toggle is-open"><strong>作りたい表示を選ぶ</strong><!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li><a href="https://motoki-design.co.jp/wordpress/swell-customize-matome/">目的別のカスタマイズ一覧</a></li>
<!-- /wp:list-item --><!-- wp:list-item -->
<li><a href="https://motoki-design.co.jp/wordpress/swell-block-visual-list/">ブロックの見本を比べる</a></li>
<!-- /wp:list-item --></ul><!-- /wp:list --></li><!-- /wp:list-item --></ul>
<!-- /wp:list -->CSSを追加する
「外観 → カスタマイズ → 追加CSS」へ追加します。
既存の追加CSSを控えてから追記してください。
専用クラスの中だけに適用し、JavaScriptが動く前は子リストを隠しません。
li.waza-list-toggle { list-style: none; }
.waza-list-toggle > [hidden] { display: none !important; }
.waza-list-toggle > .waza-list-toggle-button {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1em;
width: 100%;
min-height: 44px;
padding: .7em 1em;
border: 1px solid #888;
border-radius: 4px;
background: #fff;
color: #333;
font: inherit;
font-weight: bold;
text-align: left;
cursor: pointer;
}
.waza-list-toggle-button::after { content: '+'; }
.waza-list-toggle-button[aria-expanded="true"]::after { content: '−'; }
.waza-list-toggle > .waza-list-toggle-button:focus-visible {
outline: 3px solid #245bba;
outline-offset: 3px;
}
JavaScriptを追加する
SWELLでは対象の記事編集画面の「カスタムJS」欄へ追加します。
scriptタグは付けません。
他のテーマでは、そのテーマが用意するJavaScriptの読み込み方法を使ってください。
PHPファイルや追加CSSへ、このJavaScriptをそのまま貼り付けないでください。
(function () {
function init() {
document.querySelectorAll('li.waza-list-toggle').forEach(function (item, index) {
if (item.dataset.wazaReady) return;
const label = Array.from(item.children).find(function (el) { return el.tagName === 'STRONG'; });
const list = Array.from(item.children).find(function (el) { return el.tagName === 'UL' || el.tagName === 'OL'; });
if (!label || !list || label.querySelector('a, button')) return;
const button = document.createElement('button');
button.type = 'button';
button.className = 'waza-list-toggle-button';
button.textContent = label.textContent;
let id = 'waza-list-panel-' + index;
while (document.getElementById(id)) id += '-x';
if (!list.id) list.id = id;
button.setAttribute('aria-controls', list.id);
const expanded = item.classList.contains('is-open');
button.setAttribute('aria-expanded', String(expanded));
list.hidden = !expanded;
label.replaceWith(button);
button.addEventListener('click', function () {
const open = button.getAttribute('aria-expanded') === 'true';
button.setAttribute('aria-expanded', String(!open));
list.hidden = open;
});
item.dataset.wazaReady = '1';
});
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init, { once: true });
else init();
})();
JavaScriptは親の太字ラベルをbutton要素へ置き換え、開閉状態をaria-expandedへ反映します。
複数の親項目は独立して開閉します。
子リストがない項目は変更しません。
JavaScriptを読み込めない場合は子リストが表示されたまま残ります。
動かないときの確認と元に戻す方法
開閉しない場合は、クラスを親のリスト項目に付けたか、親ラベルを太字にしたか、子リストが入っているかを確認します。
次にカスタムJSの保存とキャッシュを確認してください。
同じコードを複数箇所へ追加する必要はありません。
既に同じリストに開閉用のクラス・CSS・PHPスニペットを設定している場合は、控えを保存してから対象の設定を外し、本記事のコードへ置き換えます。
子リストを隠すCSSが残っていると、JavaScriptを読み込めない場合にも項目が非表示になることがあります。
元へ戻すには今回のCSSとJavaScriptを削除し、専用クラスを外してページを再読み込みします。
ブロック自体と子リストのリンクは残せます。
FAQ・文章の折りたたみとの使い分け
質問と回答にはSWELLのFAQを開閉する方法、長い文章には説明文を折りたたむ方法があります。
追加コードを減らす場合は、標準ブロックとSWELLブロックの見本から表示を選んでください。
3階層のリストと通常の項目
次は親と子の2段階で開閉する見本です。
子にもwaza-list-toggleを付けます。
親を閉じても子の開閉状態は保持され、親を開き直すとその状態で表示します。
リンク付きのラベルと子リストのない項目は通常表示のまま残します。
- 表示方法を選ぶ
- 横スクロールの方法
- FAQの開閉
- リンク付きのラベルは通常表示
- この子項目は最初から見えます。
- 子項目のない通常の項目
スマホでの操作画面
親と子を開いた状態です。
子の開閉ボタンにフォーカス枠が付き、3階層目のリンクが表示されます。

よくある質問:WordPressのリストをアコーディオンにするとき
この方法では、何を開閉できますか?
記事では、WordPressのリストブロックを使い、親項目のボタンで子リストを開閉します。項目の階層と子リストのリンクを保ったまま、必要な内容だけを展開できます。CSSとJavaScriptを追加し、PHPは使いません。
文章を折りたたむだけなら、この方法を使うべきですか?
記事では、文章を折りたたむだけなら標準の「詳細」ブロックやSWELLのアコーディオンブロックも選べるとしています。この方法は、既にある入れ子のリストを開閉したい場合に使います。
リストブロックには、どう設定しますか?
記事では、リストブロックで親項目を作り、その下に子リストを入れます。親項目のラベル全体を太字にし、親の「リスト項目」ブロックを選択して、「高度な設定 → 追加CSSクラス」に専用のクラスを入力します。外側のリストブロック全体に付ける設定ではありません。最初から開く項目には、同じ欄に別のクラスも入力します。
親のラベルにリンクを付けてもよいですか?
付けないでください。記事では、親のラベルにリンクを付けると「移動」と「開閉」が競合するため、この実装はリンクを含むラベルをボタンへ変換しません。リンクは子リストに置きます。
キーボードでも操作できますか?
できます。記事では、ボタンをクリックするほか、Tabキーで移動してEnterまたはSpaceでも開閉できます。開閉状態はaria-expandedへ反映します。
JavaScriptが読み込めないときは、どうなりますか?
記事では、JavaScriptを読み込めない場合は子リストが表示されたまま残ります。ただし、子リストを隠すCSSが残っていると、JavaScriptを読み込めない場合にも項目が非表示になることがあります。
開閉しないときは、何を確認しますか?
記事では、クラスを親のリスト項目に付けたか、親ラベルを太字にしたか、子リストが入っているかを確認します。次にカスタムJSの保存とキャッシュを確認します。既に同じリストに開閉用のクラス・CSS・PHPスニペットを設定している場合は、控えを保存してから対象の設定を外し、本記事のコードへ置き換えます。
元に戻すには、どうしますか?
記事では、今回のCSSとJavaScriptを削除し、専用クラスを外してページを再読み込みします。ブロック自体と子リストのリンクは残せます。



