Amazon10/19まで!プライム感謝祭開催中! セール会場へ

SWELL│メニューにブログパーツを追加する方法:クリック・キーボード対応

SWELLのヘッダーメニューにブログパーツを追加し、関連ページをまとめて案内する方法です。

通常のメニューリンクを残し、その隣の「関連ページを開く」をクリック・Enter・Spaceで開閉します。

マウスホバーでの開閉や画面全体を覆うオーバーレイは使いません。

目次

著者

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

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

メニュー項目とブログパーツを用意する

対象はSWELLのヘッダーメニューとスマホ用メニューです。

メニュー項目のリンク先は、関連ページの一覧など実在するURLにします。

メニュー全体のIDではなく、対象のメニュー項目IDを控えてください。

下の例では21813です。

通常の子メニューを持たない項目に適用します。

ブログパーツにリンク一覧やボックスメニューを作り、公開します。

例のブログパーツIDは21787です。

スマホに別メニューを割り当てている場合、メニュー項目IDも別になります。

このコードは指定IDだけが対象なので、スマホ側の通常リンクも残して移動できるようにしてください。

子テーマのfunctions.phpに追加する

変更前にfunctions.phpと追加CSSを保存し、編集前の状態へ戻せるようにします。

次の例の21813と21787を自分のIDに置き換えます。

既存のPHP内へ貼り付ける場合、先頭の<?phpは重ねません。

旧版のadd_custom_content_to_menu_item、motoki_gloal_menu_overlay、そのフック登録と専用CSSは先に外してください。

<?php
add_filter( 'walker_nav_menu_start_el', 'waza_menu_parts', 10, 4 );
function waza_menu_parts( $output, $item, $depth, $args ) {
    if ( ! in_array( $args->theme_location ?? '', array( 'header_menu', 'nav_sp_menu' ), true )
        || 0 !== (int) $depth || 21813 !== (int) $item->ID ) {
        return $output;
    }
    // 通常のリンク先は残し、その後ろに開閉操作を追加します。
    static $rendering = false;
    if ( $rendering ) { return $output; }
    $parts_id = 21787;
    if ( 'blog_parts' !== get_post_type( $parts_id )
        || 'publish' !== get_post_status( $parts_id )
        || '' !== get_post_field( 'post_password', $parts_id, 'raw' )
        || ! shortcode_exists( 'blog_parts' ) ) {
        return $output;
    }
    $previous_post = $GLOBALS['post'] ?? null;
    $rendering = true;
    try {
        $content = do_shortcode( '[blog_parts id="' . $parts_id . '"]' );
    } finally {
        $GLOBALS['post'] = $previous_post;
        if ( $previous_post instanceof WP_Post ) {
            setup_postdata( $previous_post );
        }
        $rendering = false;
    }
    if ( '' === trim( $content ) ) { return $output; }
    return $output . '<details class="waza-menu-parts"><summary>関連ページを開く</summary>'
        . '<div class="waza-menu-parts__body">' . $content . '</div></details>';
}

公開済みでパスワードのないブログパーツだけを挿入します。

再帰呼び出しを防ぎますが、パーツの中に同じナビゲーションを入れる構成は避けてください。

ブログパーツの内容は管理者が編集したHTMLとして扱います。

ブログパーツが公開状態でも、パスワード付きなら通常リンクだけを残します。

2026年10月3日の隔離したWordPress 7.1.2 / SWELL 2.19.0では、修正前はパスワード付き本文が匿名メニューへ出力され、修正後は出力されないことを確認しました。

パスワードなしの公開パーツはPCヘッダーとスマホ用メニュー位置で出力され、非公開パーツ・フッター位置・子階層では通常リンクを維持しました。

追加CSSを保存する

外観の追加CSS、または子テーマstyle.cssに次を追加します。

通常のサブメニュー全体を上書きしない、専用クラスだけの指定です。

960px未満では開いた内容を通常の流れに配置します。

.waza-menu-parts { position: relative; }
.waza-menu-parts > summary { cursor: pointer; padding: .5em; }
.waza-menu-parts > summary:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
.waza-menu-parts__body { background: #fff; color: #222; padding: 1em; overflow-wrap: anywhere; }
.waza-menu-parts__body a { color: #075cab; }
@media (min-width: 960px) {
  .waza-menu-parts__body { position: absolute; right: 0; top: 100%;
    width: min(32rem, 80vw); max-height: 65vh; overflow: auto;
    box-shadow: 0 4px 16px #0003; z-index: 10; }
}

操作と表示を確認する

通常リンクの次に「関連ページを開く」が出ます。

クリック、またはTabで要約へ移動してEnter・Spaceで開閉します。

開いたらTabで内部リンクへ進めます。

閉じる操作も同じ要約で行います。

これはモーダルではなく、Escapeや外側クリックで自動的に閉じる処理は付けていません。

PCでは左右端のメニュー、スマホではメニュー内の表示と縦スクロールを確認します。

固定ヘッダーや親要素のoverflow指定によってはパネルが切れるため、その場合は絶対配置を外して通常の流れで表示してください。

記事本文のサンプルだけで、全ヘッダー設定での動作を保証するものではありません。

通常リンクを残してキーボードで開閉を確かめる

メニューのリンク文字と「関連ページを開く」は別の操作です。

メニュー項目のURLには通常の案内先を指定し、ブログパーツには追加で紹介するページへのリンクを置きます。

保存後はTabキーで「関連ページを開く」に移動し、Enterでブログパーツが開くことを確認します。

Spaceでも開閉できることを確認したら、通常のメニューリンクをEnterで開き、指定したページへ移動できるか確かめます。

隔離したWordPress 7.1.2 / SWELL 2.19.0では、実際のヘッダーメニューとブログパーツを組み合わせて、この3つの操作を確認しました。

画面幅1280pxでは開いたパーツが画面内に収まりました。

設置位置によって右端からはみ出す場合は、追加CSSの位置指定と幅を調整します。

以下の画像は2026年10月3日の通常PCヘッダーの操作確認です。

その後、スマホメニューでの展開とリンクの表示も確認しましたが、内部リンクのキー操作による遷移と固定ヘッダーでの収まりは未確認です。

末尾で説明する投稿情報の復元を追加した最新版PHPは、利用先でのPC・スマホ操作を別途確認する必要があります。

SWELLの通常ヘッダーで関連ブログパーツを開いた画面
SWELLの通常ヘッダーで関連ブログパーツを開いた画面。2026年10月3日、隔離したWordPress 7.1.2 / SWELL 2.19.0で撮影。

表示されない場合と戻し方

項目ID、パーツID、公開状態、メニュー位置を確認してください。

別位置のフッターやサブ階層には追加しません。

停止するときは今回のフィルターとCSSを外し、元のメニューリンクが表示されることを確認します。

本文やメニュー項目を削除する必要はありません。

PCでもスマホメニューのボタンを使いたい場合はPCでハンバーガーメニューを表示する方法を参照してください。

今回のコードとは別の実装です。

ローカル検証ページで開いたリンク一覧
SWELL 2.19.0を読み込んだローカル検証ページ、幅390px。ブログパーツのデータは検証用に差し替えたものです。実際のヘッダーメニューへの組み込み画面ではありません。

メニューのパーツ描画後に投稿情報を戻す

SWELL 2.19.0のブログパーツ取得処理は、終了時にメインクエリーの投稿情報へ戻します。

別の投稿ループ中でメニューを描画すると、後続のタイトルや著者名がそのループの投稿と一致しなくなる場合があります。

掲載コードでは呼出し前の投稿を保存し、finallyで復元します。

通常のリンクと再帰呼出しを防ぐ処理は維持します。

隔離したWordPress 7.1.2とSWELL 2.19.0で、別著者の投稿ループ、投稿が設定されていない呼出し、描画中の例外を確認しました。

公開中の利用先でのキャッシュ、PC・スマホ表示と操作は別に確認します。

よくある質問:SWELLのメニューにブログパーツを追加するとき

この方法では、メニューに何を追加しますか?

記事では、SWELLのヘッダーメニューにブログパーツを追加し、関連ページをまとめて案内します。通常のメニューリンクを残し、その隣の「関連ページを開く」をクリック・Enter・Spaceで開閉します。マウスホバーでの開閉や画面全体を覆うオーバーレイは使いません。

どのメニューが対象ですか?

記事では、対象はSWELLのヘッダーメニューとスマホ用メニューです。通常の子メニューを持たない項目に適用し、別位置のフッターやサブ階層には追加しません。スマホに別メニューを割り当てている場合は、メニュー項目IDも別になります。

IDは、何を控えておきますか?

記事では、メニュー全体のIDではなく、対象のメニュー項目IDを控えます。ブログパーツにはリンク一覧やボックスメニューを作って公開し、そのIDも控えます。コード内の例のIDは、自分のIDに置き換えます。

コードは、どこに追加しますか?

記事では、変更前にfunctions.phpと追加CSSを保存し、子テーマのfunctions.phpに追加します。既存のPHP内へ貼り付ける場合は、先頭のPHP開始タグを重ねません。旧版の関数、フック登録と専用CSSは、先に外します。公開済みでパスワードのないブログパーツだけを挿入します。

モーダルのように、Escapeキーで閉じられますか?

閉じられません。記事では、これはモーダルではなく、Escapeや外側クリックで自動的に閉じる処理は付けていません。閉じる操作も、同じ要約で行います。

ブログパーツが画面からはみ出すときは?

記事では、固定ヘッダーや親要素のoverflow指定によってはパネルが切れるため、その場合は絶対配置を外して通常の流れで表示します。設置位置によって右端からはみ出す場合は、追加CSSの位置指定と幅を調整します。960px未満では、開いた内容を通常の流れに配置します。

表示されない場合は、何を確認しますか?

記事では、項目ID、パーツID、公開状態、メニュー位置を確認します。

どこまで検証されていますか?

記事では、隔離したWordPress 7.1.2 / SWELL 2.19.0で、実際のヘッダーメニューとブログパーツを組み合わせて、Enterでの開閉、Spaceでの開閉、通常リンクでの移動を確認しています。一方、内部リンクのキー操作による遷移と固定ヘッダーでの収まりは未確認で、記事本文のサンプルだけで全ヘッダー設定での動作を保証するものではありません。停止するときは、今回のフィルターとCSSを外します。

  • URLをコピーしました!

実装を任せたい方へ

SWELLのカスタマイズ代行

記事のコードをそのまま使うのが不安な場合や、サイトに合わせた調整が必要な場合は当社が実装します。1時間 ¥8,000〜(税込)。テーマ更新に強い書き方で納品します。

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

サービス

Service

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

目次