拡張:カテゴリー編集画面からメニューを選択する方法
投稿→カテゴリー→カテゴリー編集に、独自の設定項目「ヘッダーメニュー」を追加します。
これにより、カテゴリーごとに表示するヘッダーメニューを管理画面から選択できるようになります。
完成イメージ

実装手順
以下のコードをfunctions.phpに追加します。
// カテゴリー編集にメニューを追加
add_action('category_edit_form_fields', function ($term) {
// ナビゲーションメニュー一覧を取得
$menus = wp_get_nav_menus();
// 保存済みメニューIDを取得
$menu_id = get_term_meta($term->term_id, 'my_category_navi_header', true);
?>
<tr class="form-field category-navi-header">
<th>
<label for="category-navi-header">ヘッダーメニュー</label>
</th>
<td>
<?php wp_nonce_field('category_navi_header_action', 'category_navi_header_nonce'); ?>
<select name="my_category_navi_header" id="category-navi-header">
<option value="">未選択</option>
<?php foreach ($menus as $menu) : ?>
<option value="<?= esc_attr($menu->term_id); ?>" <?php selected($menu_id, $menu->term_id); ?>><?= esc_html($menu->name); ?></option>
<?php endforeach; ?>
</select>
<p class="description">このカテゴリーに表示するヘッダーメニューを選択してください。</p>
</td>
</tr>
<?php
});
// カテゴリー編集の設定を保存
add_action('edited_category', function ($term_id) {
// nonceチェック
if (!isset($_POST['category_navi_header_nonce']) || !wp_verify_nonce($_POST['category_navi_header_nonce'], 'category_navi_header_action')) {
return;
}
if (isset($_POST['my_category_navi_header'])) {
update_term_meta($term_id, 'my_category_navi_header', (int) $_POST['my_category_navi_header']);
}
});
// ヘッダーメニューを変更
add_filter('wp_nav_menu_args', function ($args) {
if (empty($args['theme_location']) || $args['theme_location'] !== NAV_MENU_HEADER) {
return $args;
}
if (!is_category()) {
return $args;
}
$cat = get_queried_object();
$cat_id = $cat->term_id;
// カテゴリーに保存されたメニューIDを取得
$menu_id = get_term_meta($cat_id, 'my_category_navi_header', true);
// メニューを変更
if (!empty($menu_id) && is_nav_menu((int) $menu_id)) {
$args['menu'] = (int) $menu_id;
}
return $args;
});
さいごに
今回紹介した方法を使えば、カテゴリーごとにグローバルナビメニューを柔軟に変更できます。
表1に示したようにメニューの位置を指定すれば、他のメニューにも応用が可能です。
また、is_category()をis_page()に変更することで、特定の固定ページにも対応できるため、さらに汎用性の高いカスタマイズが実現できます。
