Вот краткий обзор того, как строится меню администратора WordPress - я не говорю об add_menu_page
API, я имею в виду фактическое меню WordPress по умолчанию.
Вызов файла меню
Меню, очевидно, загружено wp-admin/admin.php
. Но он не загружается через стандартный API, который мы привыкли использовать на основе документации WordPress. Скорее, все меню (все возможные опции, подменю и т. Д.) Загружаются через простой массив, определенный в wp-admin/menu.php
.
Таким образом , чтобы загрузить систему меню, admin.php
просто require
S menu.php
... вокруг линии 99 в WordPress 3.0.
Загрузка меню
Само меню хранится в глобальном массиве $menu
. Согласно встроенной документации, массив меню имеет следующие элементы:
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' );
Файл проходит и загружает каждый элемент меню в массив и загружает все их элементы подменю в массив, называемый $submenu
индексами на основе URL родительского меню. Итак, элемент подменю Dashboard под названием «Dashboard»:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
После того, как система завершит загрузку всех меню (их не так много, но система пошагово просматривает индекс на 5 или 10 раз ... обратите внимание, что панель инструментов, даже если это первый элемент меню, все еще индексируется как пункт "2" (массивы PHP начинаются с индекса 0 ... так что это дает вам некоторое пространство для маневрирования).
На данный момент, системные вызовы wp-admin/includes/menu.php
.
Пошаговое меню
Этот третий файл проходит через каждый пункт меню и, основываясь на привилегиях, назначенных текущему пользователю, либо использует меню, либо удаляет его. Сначала он просматривает все подменю и удаляет страницы, к которым у пользователя нет доступа. Затем он перебирает родительские страницы и делает то же самое. Затем он удаляет все повторяющиеся разделители, которые остаются после устранения меню.
Наконец, он сортирует меню в соответствии с назначенным им порядком меню.
Заказ пользовательских меню
Хук admin_menu
вызывается после настройки меню, но до того, как что-либо заказано. Таким образом, можно заказать всю систему меню WordPress без «взлома» API.
После запуска действия 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');
Укажите порядок, который вы хотите для всех меню (я предоставил ссылки на файл загрузки меню, чтобы вы могли получить список имен файлов), и об этом нужно позаботиться.
РЕДАКТИРОВАТЬ (02.09.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');
На остальное меню это не повлияет, но ваша пользовательская страница редактирования будет перемещена в тот же раздел, что и панель мониторинга, и появится сразу под ней. Вы можете использовать это для перемещения ваших пользовательских типов сообщений в любой раздел меню администратора и размещать их в любом порядке. Вы также можете перемещать стандартные пункты меню примерно так же.
Просто убедитесь, что вы указали порядок всех пунктов меню в данном разделе , в противном случае ваше меню может подвергнуться какой-то неожиданной странности.