問題描述

我花了幾個小時嘗試完成這個相當簡單的任務,沒有任何運氣,在這裡有點沮喪。

本質上我有 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 只是 requiremenu.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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。