問題描述
我花了幾個小時嘗試完成這個相當簡單的任務,沒有任何運氣,在這裡有點沮喪。
本質上我有 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。