WordPress 後台合併選單

目錄

這週做到一個需求是要在後台把三種不同 Post Type 選單整合為一個,讓客戶在管理時只要從同一個選單中進入即可,大概就像是示意圖中把頁面整合進文章的選項之中這樣:

WordPress 後台合併選單

雖然知道可以用一些後台選單整理的外掛像是 Admin Menu Editor 來處理,但由於選單的文字會需要用變數帶入以及還要處理一些邏輯判斷,因此還是決定自己手刻,我思考的方向是先用 add_submenu_page 來新增文章裡面的子選單,然後在點擊選單後重新導向去我希望的頁面。

<?php

/**
 * 新增後台子選單
 */
add_action(
	'admin_menu',
	function() {
		add_submenu_page(
			'edit.php',
			'全部頁面',
			'全部頁面',
			'manage_options',
			'my_custom_page',
			function() {
				// 跳轉到所有頁面
				wp_safe_redirect( admin_url( 'edit.php?post_type=page' ) );
				exit;
			}
		);
		// 移除頁面選單
		remove_menu_page( 'edit.php?post_type=page' );
	},
);

跳轉的部分可以直接在回呼函數裡面用 wp_safe_redirect 處理,然後再搭配 remove_menu_page 把指定的選單移除掉,比較棘手的是重新導向後所在位址為頁面而非文章,因此左側選單會無法正確顯示目前的所在位置:

WordPress 後台合併選單

研究了許久發現到有一個全域變數 $plugin_page可以控制選單的展開,但風險在於修改全域變數會造成潛在的衝突,因此要設好限制只在必要的情況下進行修改。我的限制是只有造訪特定頁面才會修改。

其次要讓選單反白使用的勾點叫做 submenu_file,只要返回我們自行新增子選單的代稱就能讓選單反白:

<?php

add_filter(
	'submenu_file',
	function( $submenu_file ) {
		if ( '/wp-admin/edit.php?post_type=page' === $_SERVER['REQUEST_URI'] ) {
			global $plugin_page;
			$plugin_page = 'my_custom_page'; // 子選單代稱,展開父選單
			return 'my_custom_page'; // 子選單代稱,反白所在位置
		}
		return $submenu_file;
	}
);
文章標籤wp-admin

目錄

賴俊吾 / Oberon Lai
賴俊吾 / Oberon Lai

現為全職 WordPress 工程師,網站開發經歷 11 年,專攻前端工程與 WordPress 佈景主題、外掛客製化開發

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!

覺得文章對你有幫助再幫我鼓個掌吧!

相關文章

Gravity Form 取得表單送出資料

WooCommerce 推播通知外掛近期的功能建議是加入支援 Gravity Form 外掛,讓填表者送出資料後可以收到簡訊或是 ...

LearnDash 手動開通課程瀏覽權限

在某些情境下我們需要透過程式碼來開通 LearnDash 的課程瀏覽權限,像是有些免費課程需要填表單才能觀看,或是連續登入 N 日...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

專注於分享 WordPress 開發、接案技巧、專案管理等自由工作者必備知識與心得

© 2023 想點創意科技有限公司

想點創意科技有限公司 | 統一編號 90516823
Designed by Hend Design | 隱私權政策

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!