Ось короткий огляд того, як побудовано адміністраторське меню WordPress - я не кажу про add_menu_page
API, я маю на увазі фактичне меню WordPress за замовчуванням.
Виклик файла меню
Меню, очевидно, завантажено wp-admin/admin.php
. Але він не завантажується через стандартний API, який ми звикли використовувати на основі документації WordPress. Скоріше, все меню (усі можливі параметри, підменю тощо) завантажується через простий масив, визначений в wp-admin/menu.php
.
Отже, щоб завантажити систему меню, admin.php
просто require
з 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-адреси батьківського меню. Таким чином, пункт підменю на інформаційній панелі під назвою "Інформаційна панель":
$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');
Вкажіть порядок, який потрібно для всіх меню (я надав посилання на файл завантаження меню, щоб ви могли отримати список імен), і це повинно піклуватися про нього.
EDIT (2.09.2010):
Щоб визначити порядок редагування екрана редагування користувацького типу за допомогою цього методу, вам потрібно знати URL-адресу екрана редагування. Я в більшості випадків так і буде http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Це залежить від налаштування WordPress на вашому веб-сайті (якщо він встановлений у корені чи в підпапках) та від кулі типового типу публікації, який ви використовуєте.
Наприклад...
Скажімо, у вас є власний тип публікації для "Питання щодо обміну стеками", і ви хочете, щоб редактор відображався в тому ж розділі, що і приладова панель, безпосередньо під значком панелі інструментів. Ви використовуєте такий код у 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');
Решта меню не вплине, але ваша власна сторінка для редагування буде переміщена в той самий розділ, що і приладова панель, і відобразиться безпосередньо під нею. Ви можете використовувати це для переміщення власних типів публікацій до будь-якого розділу меню адміністратора та розміщення їх у будь-якому порядку. Ви також можете переміщати стандартні елементи меню приблизно таким же чином.
Просто переконайтеся, що ви вказали порядок усіх пунктів меню в даному розділі , інакше ваше меню може зазнати певної несподіванки.