問題描述
我花了幾個小時嘗試完成這個相當簡單的任務,沒有任何運氣,在這裏有點沮喪。
本質上我有 5 個自定義的帖子類型,我創建的,我想做的是直接在”dashboard” 下以特定的順序顯示它們。
從 WordPress 文檔看來,您不能真正做到這一點,因為最高的菜單順序似乎是”5″ 。以上 L
我猜測一些專家閲讀這可以告訴我一個簡單的方法,我可以通過使用功能文件,而不使用插件 (我知道存在) 完全按照我想要的方式訂購管理菜單。
請繼續嘗試創建 5 個單獨的帖子類型,並將它們直接包含在儀錶板下的特定順序中… 似乎這是不可能的… … 有些類型的 jquery 黑客讓這個工作有人可以與我分享,還是不用利用 jQuery?
最佳解決方案
嗨 @BinaryBit:
難怪你有點沮喪?管理菜單是通過 WordPress 核心最笨重和令人沮喪的實現之一。老實説,當他們這樣設計的時候,我不知道他們在想什麼。
@EAMann 做了很好的工作來解釋管理員菜單在 WordPress 中的工作方式 (我希望我能夠在大約 4 個月前閲讀… 🙂
不過,在我弄清楚它是如何工作的,我仍然在失去工作,沒有投入足夠的時間來保持我的頭直,而我試圖做簡單的事情。所以這就是為什麼我建立一個菜單 API,簡化和簡化使用 WordPress 管理菜單。
它們與 WordPress 的現有結構 100%兼容,並且仍然非常適用於 alpha,因為我是唯一使用它的。我確定他們還沒有處理 use-cases 。但是我會把代碼放在這裏,供你和其他人試用。
您可以下載文件以放在主題的目錄中:wp-admin-menu-classes.php,下面顯示瞭如何調用主題 functions.php 文件中的功能:
<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
swap_admin_menu_sections('Pages','Posts'); // Swap location of Posts Section with Pages Section
rename_admin_menu_section('Media','Photos & Video'); // Rename Media Section to "Photos & Video"
delete_admin_menu_section('Links'); // Get rid of Links Section
$movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags'); // Save off the Movie Tags Menu
update_admin_menu_section('Movies',array( // Rename two Movie Menu Items and Delete the Movie Tags Item
array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
array('delete-item','item'=>'Movie Tags'),
));
copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
renamed_admin_menu_item('Movies','Add New','Add Actor'); // Rename copied Actor 'Add New' to 'Add Actor
add_admin_menu_item('Movies',array( // (Another way to get a 'Add Actor' Link to a section.)
'title' => 'Alt Add Actor ',
'slug' => 'post-new.php?post_type=actor',
), array(// Add Back the Movie Tags at the end.
'where'=>'end'
));
add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
'where'=>'end'
));
delete_admin_menu_section('Actors'); // Finally just get rid of the actors section
}
此外,這些功能甚至被考慮 (作為基礎) 包含在 WordPress 3.1 中,所以如果我們幸運,甚至可能成為標準!
次佳解決方案
這是一個快速的演示文稿如何構建 WordPress 管理菜單 – 我不是説 add_menu_page API,我的意思是實際的默認 WordPress 菜單。
調用菜單文件
菜單顯然由 wp-admin/admin.php 加載。但是它沒有通過我們習慣使用基於 WordPress 文檔的標準 API 加載。相反,整個菜單 (所有可能的選項,子菜單等) 都是通過 wp-admin/menu.php 中定義的簡單數組加載的。
所以要加載菜單系統,admin.php 只是 require 的 menu.php … 在 WordPress 3.0 中的第 99 行。
加載菜單
菜單本身存儲在全局數組 $menu 中。根據 in-line 文檔,菜單數組有以下元素:
The elements in the array are:
* 0: Menu item name
* 1: Minimum level or capability required.
* 2: The URL of the item's file
* 3: Class
* 4: ID
* 5: Icon for top level menu
例如,儀錶板是:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
該文件經過並將每個菜單項加載到數組中,並將所有的 sub-menu 項目加載到一個名為 $submenu 的數組中,該數組根據父菜單的 URL 進行索引。所以儀錶板的子菜單項”Dashboard” 是:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
系統完成後加載所有菜單 (沒有那麼多,但是系統通過索引在 5 或 10 時間步進… 注意到,即使是第一個菜單項,儀錶板仍然被編入索引項目”2″(PHP 數組從索引 0 開始… 所以這給你一些機動的空間) 。
此時系統調用 wp-admin/includes/menu.php 。
踏上菜單
第三個文件遍歷每個菜單項,並根據分配給當前用户的權限,使用菜單或將其刪除。首先它循環遍歷所有的 sub-menus,並刪除用户無法訪問的頁面。然後它循環遍歷父頁面,做同樣的事情。然後,它會刪除任何重複的分隔符,從而刪除菜單。
最後,它根據分配的菜單順序對菜單進行排序。
訂購自定義菜單
掛鈎 admin_menu 在菜單設置後,但任何東西都被訂購之前被調用。所以可以在沒有”hacking” API 的情況下訂購整個 WordPress 菜單系統。
操作 admin_menu 被觸發後,您的自定義頁面將加載到系統中。接下來的事情是 WordPress 檢查一個名為 custom_menu_order 的過濾器… 這個過濾器總是返回 false 並告訴 WordPress 是否要使用自定義的順序。
將以下內容添加到主題中,將標誌設置為 true,並定義您的顯式菜單順序:
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array('index.php', 'edit.php', 'edit-comments.php');
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
指定所有菜單所需的順序 (我提供了對 menu-loading 文件的引用,以便您可以獲得一個文件名列表),這應該會照顧它。
編輯 (9/2/2010):
要使用此方法指定自定義帖子類型的編輯屏幕的順序,您需要知道編輯屏幕的 URL 。我大多數情況下,會是 http://blog.url/wp-admin/edit.php?post_type=POST_TYPE 。這取決於 WordPress 如何在您的網站上設置 (如果它安裝在根目錄或子文件夾中) 以及您使用的自定義帖子類型的部分。
例如…
假設您有 「Stack Exchange Questions」 的自定義帖子類型,並希望編輯器與儀錶板圖標正下方的儀錶板顯示在相同的部分。您將在主題的 functions.php 文件中使用以下代碼:
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
菜單的其餘部分將不受影響,但您的自定義編輯頁面將被移動到與儀錶板相同的部分,並將在其下方顯示。您可以使用它將自定義帖子類型移動到管理菜單的任何部分,並將它們放在任何順序中。您也可以以相同的方式移動標準菜單項。
只要確定您在給定的部分指定所有菜單項的順序,否則您的菜單可能會受到一些意想不到的奇怪。
第三種解決方案
我意識到這是一箇舊的線程,但我認為這是更值得更新一個更容易的解決方案。請注意,這適用於 3.5,並沒有任何其他版本的測試。以下代碼可以放在 plugin 或 functions.php 文件中。
參見:http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order 。稍微修改以適應原始海報的需求 (雖然,我希望他現在找到一個解決方案…) 。
// Rearrange the admin menu
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array(
'index.php', // Dashboard
'edit.php?post_type=custom_type_one', // Custom type one
'edit.php?post_type=custom_type_two', // Custom type two
'edit.php?post_type=custom_type_three', // Custom type three
'edit.php?post_type=custom_type_four', // Custom type four
'edit.php?post_type=custom_type_five', // Custom type five
'separator1', // First separator
'edit.php?post_type=page', // Pages
'edit.php', // Posts
'upload.php', // Media
'link-manager.php', // Links
'edit-comments.php', // Comments
'separator2', // Second separator
'themes.php', // Appearance
'plugins.php', // Plugins
'users.php', // Users
'tools.php', // Tools
'options-general.php', // Settings
'separator-last', // Last separator
);
}
add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
add_filter('menu_order', 'custom_menu_order');
管理員菜單中未列出的任何項目都不會被刪除。它們將被附加到菜單的底部。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。