問題描述

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

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