0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 每個頁面用不同的選單

WordPress 每個頁面用不同的選單 封面

一個網站裡常常有好幾塊不同的內容:公司介紹、線上商店、課程報名。客人進到商店,選單最好是「全部商品、運費說明、購物車」;進到課程,選單換成「課程介紹、上課時間、報名」。

WordPress 預設整個網站只有一組主選單。這篇用一段程式碼,讓你在編輯頁面時直接選這一頁要用哪一組選單,不用裝外掛。

先說適用範圍

  • 傳統佈景主題(例如 Twenty Twenty-One、Astra 這類在「外觀 → 選單」設定選單的佈景主題):用這篇的程式碼。
  • 區塊佈景主題(例如 Twenty Twenty-Five,選單在「外觀 → 編輯器」裡設定):不用寫程式,做法在文章最後。

程式碼

先到「外觀 → 選單」把每一組選單建好,例如「購物選單」「課程選單」。然後把下面的程式碼放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增:

PHP
// 1. 編輯頁面時,右邊多一個「這一頁的選單」下拉選單
add_action( 'add_meta_boxes_page', function () {
	add_meta_box( 'zw-page-menu', '這一頁的選單', 'zw_page_menu_box', 'page', 'side' );
} );

function zw_page_menu_box( $post ) {
	wp_nonce_field( 'zw_page_menu', 'zw_page_menu_nonce' );
	$current = (int) get_post_meta( $post->ID, '_zw_page_menu', true );
	echo '<select name="zw_page_menu" style="width:100%">';
	echo '<option value="0">預設選單(沒設定就沿用上層頁面)</option>';
	foreach ( wp_get_nav_menus() as $menu ) {
		printf(
			'<option value="%d"%s>%s</option>',
			$menu->term_id,
			selected( $current, $menu->term_id, false ),
			esc_html( $menu->name )
		);
	}
	echo '</select>';
}

// 2. 儲存頁面時,把選的選單記下來
add_action( 'save_post_page', function ( $post_id ) {
	if ( ! isset( $_POST['zw_page_menu_nonce'] )
		|| ! wp_verify_nonce( sanitize_key( $_POST['zw_page_menu_nonce'] ), 'zw_page_menu' ) ) {
		return;
	}
	if ( ! current_user_can( 'edit_page', $post_id ) ) {
		return;
	}
	$menu = absint( $_POST['zw_page_menu'] ?? 0 );
	if ( $menu ) {
		update_post_meta( $post_id, '_zw_page_menu', $menu );
	} else {
		delete_post_meta( $post_id, '_zw_page_menu' );
	}
} );

// 3. 前台:「主選單」位置換成這一頁(或上層頁面)指定的選單
add_filter( 'wp_nav_menu_args', function ( $args ) {
	if ( 'primary' !== $args['theme_location'] || ! is_page() ) {
		return $args;
	}
	$page_id = get_queried_object_id();
	foreach ( array_merge( array( $page_id ), get_post_ancestors( $page_id ) ) as $id ) {
		$menu = (int) get_post_meta( $id, '_zw_page_menu', true );
		if ( $menu && is_nav_menu( $menu ) ) {
			$args['menu'] = $menu;
			break;
		}
	}
	return $args;
} );

逐段說明:

  • 第 1 段:在編輯頁面的畫面加一個區塊,列出所有建好的選單。用區塊編輯器時,它會出現在右側「頁面」設定的最下面。
  • 第 2 段:按下儲存時,把選的選單編號存起來。wp_nonce_field、wp_verify_nonce 確認是從這個畫面送出的,current_user_can 確認這個人有權限編輯這一頁。
  • 第 3 段:前台顯示選單時,如果是主選單的位置,就看這一頁有沒有指定選單;沒有的話往上找上層頁面,找到就換掉。
  • 'primary' 是 Twenty Twenty-One 主選單位置的名稱。每個佈景主題的名稱不一樣,可以在「外觀 → 選單 → 管理位置」看到有哪些位置,再到佈景主題的 functions.php 找 register_nav_menus 對照。
  • is_nav_menu 檢查選單還存在。選單被刪掉時,會回到預設的主選單,不會整排消失。

實際測試的結果

測試站:WordPress 7.1.3,佈景主題 Twenty Twenty-One。主選單只有「首頁」,另外建了「購物選單」(全部商品、運費說明、購物車)和「課程選單」(課程介紹、上課時間、報名)。

  1. 公司介紹頁,沒有設定:選單是「首頁」。
  2. 線上商店頁,設定購物選單:選單變成「全部商品、運費說明、購物車」。
  3. 運費說明頁(線上商店的子頁面),沒有設定:自動沿用上層的購物選單。
  4. 在區塊編輯器裡設定:打開「課程」頁面,右側「頁面」設定最下面出現「這一頁的選單」,下拉選單列出主選單、課程選單、購物選單;選「課程選單」按儲存,資料有存進去,前台的選單變成「課程介紹、上課時間、報名」。
  5. 指定的選單被刪掉:前台回到主選單「首頁」。
  6. 拿掉程式碼:線上商店頁回到主選單,存起來的設定不會影響網站。

區塊佈景主題的做法

區塊佈景主題的選單是頁首裡的「導覽」區塊,不經過上面的程式碼。做法是用範本:

  1. 到「外觀 → 編輯器 → 範本」,替頁面新增一個自訂範本,例如「商店頁面」。
  2. 在這個範本裡,把頁首的導覽區塊換成另一組選單,或換成另一個頁首。
  3. 編輯線上商店頁,在右側的「範本」選「商店頁面」。

這樣用同一個範本的頁面,選單都會一樣。

什麼時候適合

  • 一個網站裡有好幾個品牌或服務,客人各看各的。
  • 活動頁、招生頁:不想讓客人點到別的地方,選單只留報名相關的項目。

如果只是想讓選單短一點,先檢查是不是選單項目太多,〈企業官網要放哪些頁面?〉有建議的頁面清單。

延伸閱讀

選單是客人在網站裡找路的地圖。正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含每年 12 次小修改,像這樣的小調整都可以交給我們,台北與全台客戶也歡迎免費諮詢。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!