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

目錄

發佈留言

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

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

Picture of 賴俊吾 / Oberon Lai
賴俊吾 / Oberon Lai

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

訂閱電子報

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

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

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

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

訂閱電子報

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