首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

WordPress 選單註冊 register_nav_menus() 與調用 wp_nav_menu() 完整指南

     編輯:PHP 綜合知識

前言

WordPress 3.0+ 引入選單系統,讓使用者可在後台拖曳建立導航選單。開發者需先在主題 functions.php 註冊選單位置,再在模板中呼叫輸出。本文完整解析 register_nav_menus() 與 wp_nav_menu() 的參數、範例與進階技巧。

register_nav_menus() — 註冊選單位置

函數原型

register_nav_menus( array $locations )

參數說明

  • $locations:關聯陣列,Key 為選單識別碼,Value 為顯示名稱(支援多國語系 __())

基本範例

function my_theme_register_menus() {
    register_nav_menus(array(
        'header_menu' => __('頂部導航', 'my-theme'),
        'footer_menu' => __('頁腳導航', 'my-theme'),
        'social_menu' => __('社群連結', 'my-theme'),
    ));
}
add_action('init', 'my_theme_register_menus');
註冊後,後台「外觀 → 選單」即可建立選單並指派至上述位置。

wp_nav_menu() — 前端輸出選單

函數原型

wp_nav_menu( array $args = array() )

預設參數完整表

參數型別預設值說明
theme_locationstring''對應註冊時的 Key(如 header_menu)
menustring''指定選單 ID、slug 或名稱(優先級高於 theme_location)
containerstring'div'外層容器標籤:div、nav、false(不輸出容器)
container_classstring'menu-{slug}-container'容器 class
container_idstring''容器 id
menu_classstring'menu'<ul> 的 class
menu_idstring選單 slug<ul> 的 id
echobooltruetrue=直接輸出,false=回傳字串
fallback_cbcallable'wp_page_menu'找不到選單時的回調函數
beforestring''每個 <a> 之前的文字
afterstring''每個 <a> 之後的文字
link_beforestring''連結文字之前的文字
link_afterstring''連結文字之後的文字
items_wrapstring'<ul id="%1$s" class="%2$s">%3$s</ul>'包裹項目的模板,%1$s=id, %2$s=class, %3$s=items
depthint0顯示層級深度,0=全部
walkerobjectWalker_Nav_Menu自訂 Walker 類別

常用範例

基本輸出(無容器、自訂 ul id、自訂 fallback)

wp_nav_menu(array(
    'theme_location' => 'header_menu',
    'container'      => false,
    'items_wrap'     => '
    %3$s
', 'fallback_cb' => 'my_fallback_menu', )); function my_fallback_menu() { echo ''; }

輸出為 <nav> 容器、加入 BEM 命名

wp_nav_menu(array(
    'theme_location' => 'header_menu',
    'container'      => 'nav',
    'container_class' => 'site-nav',
    'menu_class'     => 'site-nav__list',
    'menu_id'        => 'site-nav-list',
    'depth'          => 2, // 僅顯示兩層
));

取得選單 HTML 字串供進一步處理

$menuHtml = wp_nav_menu(array(
    'theme_location' => 'footer_menu',
    'echo'           => false,
    'container'      => false,
));
// 可對 $menuHtml 進行字串替換、快取等操作
echo $menuHtml;

進階技巧

1. 動態新增 CSS 類別(如 active 狀態)

add_filter('nav_menu_css_class', function($classes, $item, $args, $depth) {
    if (in_array('current-menu-item', $classes) || in_array('current-menu-ancestor', $classes)) {
        $classes[] = 'is-active';
    }
    return $classes;
}, 10, 4);

2. 自訂 Walker 實現特殊結構(如 Mega Menu)

class My_Walker extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = []) {
        $indent = str_repeat("\t", $depth);
        $output .= "\n$indent
    \n"; } } // 使用 wp_nav_menu(array('walker' => new My_Walker()));

3. 選單項目加入圖示(利用 link_before/link_after 或 Walker)

add_filter('walker_nav_menu_start_el', function($item_output, $item, $depth, $args) {
    if ($item->attr_title) { // 在後台選單項目「標題屬性」填入圖示 class
        $item_output = str_replace(' ', $item_output);
    }
    return $item_output;
}, 10, 4);

常見問題 FAQ

問題解答
選單不顯示確認 theme_location 拼寫正確、後台已指派選單、模板位置正確
想移除外層 <div>設定 'container' => false
需在選單加入搜尋框/登入連結使用 'items_wrap' 或 'wp_nav_menu_items' filter 動態插入
多語系網站選單不同搭配 Polylang/WPML,註冊不同 location 或使用 menu 參數指定

小結

register_nav_menus() 定義「位置」,wp_nav_menu() 輸出「內容」。掌握參數陣列與 Filter/Hook,即可實現從簡單導航到複雜 Mega Menu 的彈性客製化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved