it-swarm-ru.tech

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

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

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

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

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

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

31
Binarybit

Привет @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 поэтому, если нам повезет, они могут даже стать стандартными!

33
MikeSchinkel

Вот краткий обзор того, как строится меню администратора WordPress - я не говорю об API add_menu_page, я имею в виду фактическое меню 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');

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

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

21
EAMann

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

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

18
Matt

Для перемещения пунктов меню мне нравится использовать глобальную переменную $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

2
forlogos

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

2
Ray Gulick

Потрясающие. Огромное спасибо. Я просто поместил несколько строк кода в мои 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');
0
Sebastian