Зміна порядку користування розділами меню адміністратора?


31

Я тут трохи засмучуюся, провівши кілька годин, намагаючись виконати це досить просте завдання без удачі.

По суті, у мене є 5 створених спеціальних типів публікацій, і все, що я хочу зробити, - це показати кожен із них у визначеному порядку безпосередньо під "панеллю" .

З документації на WordPress, схоже, ви цього не можете зробити, оскільки найвищий порядок меню здається "5". А над L

Я здогадуюсь, що читання цього експерта може показати мені простий спосіб, що я можу замовити меню адміністратора саме так, як я хочу, використовуючи файл функцій і не використовуючи плагін (який я знаю, що існує).

Будь-ласка, спробуйте створити 5 окремих типів публікацій і включити їх у визначеному порядку безпосередньо під панель приладів ... здається, це неможливо. ?? ... чи є якийсь тип злому jquery, щоб зробити цю роботу хтось Ви могли б поділитися зі мною або бажано без використання jQuery?

Відповіді:


33

Привіт @BinaryBit:

Недарма ви трохи засмучені; меню адміністрування є однією з найбільш тупих і розчарувальних реалізацій через ядро ​​WordPress. Чесно кажучи, я не знаю, про що вони думали, коли так розробили це.

@EAMann зробив відмінно роботу, пояснивши, як працюють адміністраторські меню в WordPress (я б хотів, щоб я зміг прочитати це близько 4 місяців тому ... :)

І все-таки, коли я зрозумів, як це працює, я все ще втрачав роботу з цим, не приділяючи достатньо часу, щоб тримати голову прямо, поки я намагався робити прості речі. Тому я створив API меню, який спрощує та впорядковує роботу з адміністраторським меню WordPress.

Вони на 100% сумісні з існуючими структурами WordPress і все ще знаходяться в альфа-роді, оскільки я єдиним користувався цим. Я впевнений, що є випадки використання, які вони ще не вирішують. Але я опублікую тут код для вас та інших, щоб спробувати.

Ви можете завантажити файл, який можна перенести в каталог вашої теми тут: wp-admin-menu-groups.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, тому, якщо нам пощастить, вони можуть стати навіть стандартними!


Фантастичне доповнення до API! Мені знадобилося кілька місяців, щоб додати мій перший розділ спеціального меню до існуючої рамки (саме тому я вивчив код робити багато) ... але ваш API здається набагато більш інтуїтивним у використанні!
EAMann

@EAMann - Дякую! Якщо ви хочете запропонувати будь-які пропозиції або навіть співпрацювати над її вдосконаленням, я хотів би створити щось, що полегшить всім, за винятком лише тих, хто випадково бачить цю запитання.
MikeSchinkel

це зробило ядро ​​чи все-таки потрібне це чи щось подібне для маніпулювання порядком елементів меню в адміністраторі?
Q Studio

Наскільки я виявив, його перенесли на WP 3.5
пікселін

Ей Майк - wp_debug видає помилку на цій функції: -------- функція swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); повернути $ розділ; } --- Примітка: Не визначена змінна: розділ
Q Studio

21

Ось короткий огляд того, як побудовано адміністраторське меню WordPress - я не кажу про add_menu_pageAPI, я маю на увазі фактичне меню 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');

Решта меню не вплине, але ваша власна сторінка для редагування буде переміщена в той самий розділ, що і приладова панель, і відобразиться безпосередньо під нею. Ви можете використовувати це для переміщення власних типів публікацій до будь-якого розділу меню адміністратора та розміщення їх у будь-якому порядку. Ви також можете переміщати стандартні елементи меню приблизно таким же чином.

Просто переконайтеся, що ви вказали порядок усіх пунктів меню в даному розділі , інакше ваше меню може зазнати певної несподіванки.


У вашому прикладі коду є невелика помилка під заголовком "Замовлення користувальницьких меню", якщо в умовному заяві відсутнє $ім'я змінної ... (Хоча велика відповідь) ..
t31os

Як би ви додали спеціальний тип публікації для "Питання обміну стеками" до розділу, розташованого під секцією "Інформаційна панель"?
epaps

Привіт EAMann - швидке запитання. Оскільки в новітній версії wordpress цей процес взагалі змінився чи став простішим?
NetConstructor.com

Як щодо підменю ? Чи існує подібний спосіб переставити елементи підменю ?
Гіральді

@GiraldiMaggio Будь ласка, задайте нове запитання та посилайтеся на це.
EAMann

18

Я усвідомлюю, що це стара нитка, але я думаю, що варто оновити СТОЛЬКО простіше рішення. Зверніть увагу, що це працює з 3.5 та не перевірено жодною іншою версією. Наступний код може бути розміщений у плагіні або файлі function.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');

Будь-які елементи в меню адміністратора, які не вказані тут, не будуть видалені. Вони будуть додані в нижній частині меню.


1
Так, це набагато краще, також для повторного замовлення елементів підменю ви можете зняти, а потім скинути їх.
Вік

2

Я розумію, ви не хочете користуватися плагіном, але для чистої спроби спробуйте плагін Admin Menu Editor від Janis Elsts. Переставляйте меню адміністратора будь-яким способом; також можна приховати пункти меню.


Я випробував цей плагін у встановленні багатосторонніх сайтів. Він працює найкраще. Але нам потрібно вручну налаштувати параметри для кожного під-сайту, якщо у нас встановлена ​​багатомістова установка.
користувач391

2

Для переміщення елементів меню навколо мені подобається використовувати $menuзмінну Global .

Наприклад, якщо я хотів би перемістити меню "Сторінки" в нижню частину меню, я б використав це в functions.phpабо плагіні:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

і якщо я хотів поміняти меню "Повідомлення та посилання":

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

Нещодавно використовували цей трюк, лише тестували WP 3.4.1


Я знаю, що це старіший пост, але щодо вашого першого фрагмента я зіткнувся з проблемою з останнім рядком у admin_menu_itemsфункції, яку було виправлено замінивши їїunset($menu[20]);
hot_barbara

0

Дивовижно. Дуже дякую. Я просто помістив кілька рядків коду в свої функції.php

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

Плюс розміщення wp-admin-menu-groups.php у моїй темі папки, і тепер кнопка 'posts' перемикається кнопкою 'pages'.

Я сподіваюсь, що це стане частиною основної частини незабаром і таким чином, що нам не потрібно буде писати все меню в рамках функції, щоб просто змінити порядок двох кнопок.

Насправді було трохи складніше отримати більш визначений порядок на 4 кнопки. Щоб змінити чотири кнопки на: Сторінки, Публікація, Медіа, Посилання, мені потрібно було скористатись наступним кодом:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.