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


31

Я немного расстроился из-за того, что провел несколько часов, пытаясь выполнить эту довольно простую задачу без какой-либо удачи.

По сути, у меня есть 5 пользовательских типов записей, которые я создал, и все, что я хочу сделать, это показать каждый из них в определенном порядке прямо под «панелью» .

Из документации WordPress кажется, что вы не можете этого сделать, потому что самый высокий порядок меню, кажется, "5". И выше L

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

Пожалуйста, попробуйте создать 5 отдельных типов постов и включить их в определенном порядке прямо под панелью инструментов ... кажется, что это невозможно. ?? ... есть какой-то тип jquery-хака, чтобы кто-то сделал эту работу, чтобы кто-то могли бы поделиться со мной или желательно без использования JQuery?

Ответы:


33

Привет @BinaryBit:

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

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

Тем не менее, после того, как я понял, как это работает, я все еще не мог работать с ним, не уделяя достаточно времени, чтобы держать голову прямо, пока я пытался делать простые вещи. Вот почему я создал API меню, которое упрощает и упрощает работу с меню администратора WordPress.

Они на 100% совместимы с существующими структурами WordPress и все еще в альфа-версии, так как я был единственным, кто использовал его. Я уверен, что есть варианты использования, которые они еще не обрабатывают. Но я опубликую код здесь для вас и других, чтобы попробовать.

Вы можете скачать файл, чтобы поместить его в каталог вашей темы, здесь: 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, так что если нам повезет, они могут даже стать стандартными!


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

@EAMann - Спасибо! Если вы хотите предложить какие-либо предложения или даже сотрудничать в его улучшении, я бы хотел получить что-то такое, что могло бы облегчить его для всех, кроме тех, кто случайно увидел эти вопросы и ответы.
Майк Шинкель

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

Насколько я нашел, он был отложен до WP 3.5
pixeline

Привет, Майк - wp_debug выдает ошибку в этой функции: -------- function 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); вернуть $ раздел; } --- Примечание: неопределенная переменная: section
Q Studio

21

Вот краткий обзор того, как строится меню администратора WordPress - я не говорю об add_menu_pageAPI, я имею в виду фактическое меню WordPress по умолчанию.

Вызов файла меню

Меню, очевидно, загружено wp-admin/admin.php. Но он не загружается через стандартный API, который мы привыкли использовать на основе документации WordPress. Скорее, все меню (все возможные опции, подменю и т. Д.) Загружаются через простой массив, определенный в wp-admin/menu.php.

Таким образом , чтобы загрузить систему меню, admin.phpпросто requireS 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');

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

Просто убедитесь, что вы указали порядок всех пунктов меню в данном разделе , в противном случае ваше меню может подвергнуться какой-то неожиданной странности.


В коде вашего примера есть небольшая ошибка под заголовком «Упорядочивание пользовательских меню», если в условном выражении if отсутствует $имя переменной ... (Отличный ответ) ..
t31os

Как бы вы добавили пользовательский тип поста «Вопросы об обмене стеками» в раздел под разделом «Панель инструментов»?
epaps

Привет EAMann - быстрый вопрос. Начиная с самой новой версии WordPress этот процесс изменился или стал проще?
NetConstructor.com

Как насчет подменю ? Есть ли подобный способ перестановки элементов подменю ?
Джиральди

@GiraldiMaggio Пожалуйста, задайте новый вопрос и укажите ссылку на него.
EAMann

18

Я понимаю, что это старый поток, но я думаю, что стоит обновить с гораздо более простым решением. Обратите внимание, что это работает с 3.5 и не было протестировано ни с какой другой версией. Следующий код может быть помещен в плагин или файл 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');

Любые элементы в меню администратора, которые не перечислены здесь, не будут удалены. Они будут добавлены в нижней части меню.


1
Да, это гораздо лучше, также можно изменить порядок пунктов подменю, которые можно отключить, а затем сбросить их.
Вик

2

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


Я попробовал этот плагин в многосайтовой установке. Он работает лучше всего. Но нам нужно вручную настроить параметры для каждого подузла, если у нас многосайтовая установка.
user391 13.10.10

2

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

Например, если бы я хотел переместить меню «Страницы» вниз меню, я бы использовал это в 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

Потрясающе. Огромное спасибо. Я просто поместил несколько строк кода в мои functions.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-classes.php в моей папке с темой, и теперь кнопка «сообщения» нажата кнопкой «страницы».

Я надеюсь, что это скоро станет частью ядра, так что нам не нужно писать целое меню внутри функции, чтобы просто изменить порядок двух кнопок.

На самом деле было немного сложно получить более точный порядок для 4 кнопок. Чтобы изменить 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.