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

<p>я немного расстроился из-за того, что провел несколько часов, пытаясь выполнить эту довольно простую задачу без какой-либо удачи.</p><p>по сути, у меня есть 5 пользовательских типов записей, которые я создал, и все, что я хочу сделать, это показать каждый из них в определенном порядке прямо под<em> "приборная панель" </em>.</p><p>из документации wordpress кажется, что вы не можете этого сделать, потому что самый высокий порядок меню, кажется, "5". и выше l</p><p>я предполагаю, что некоторые эксперты, читающие это, могут показать мне простой способ, которым я могу заказать меню администратора точно так, как я хочу, используя файл функций и не используя плагин (который, я знаю, существует).</p><p>пожалуйста, попробуйте создать 5 отдельных типов постов и включить их в определенном порядке прямо под панелью инструментов ... кажется, что это невозможно. ?? ... есть какой-то тип jquery-хака, чтобы кто-то сделал эту работу, чтобы кто-то могли бы поделиться со мной или желательно без использования jquery?</p>

<p>привет<strong> @binarybit: </strong></p><p>неудивительно, что вы немного расстроены; меню администратора - одна из самых тупых и разочаровывающих реализаций через ядро wordpress. честно говоря, я не знаю, о чем они думали, когда создавали это таким образом.</p><p><em>@eamann</em> выполнил<strong> <em>отлично</em> </strong>объяснил, как работают меню администратора в wordpress (хотелось бы прочитать это около 4 месяцев назад ... :)</p><p>тем не менее, после того, как я понял, как это работает, я все еще не мог работать с ним, не уделяя достаточно времени, чтобы держать голову прямо, пока я пытался делать простые вещи.<strong> так вот почему я создал api меню </strong>, который упрощает и упрощает работу с меню администратора wordpress.</p><p>они на 100% совместимы с существующими структурами wordpress и все еще в альфа-версии, так как я был единственным, кто использовал его. я уверен, что есть варианты использования, которые они еще не обрабатывают. но я опубликую код здесь для вас и других, чтобы попробовать.</p><p>вы можете<strong> скачать </strong>файл для перетаскивания в каталог вашей темы здесь: <a href="https://gist.github.com/792b7aa5b695d1092520"><strong> <em>wp-admin-menu-classes.php</em> </strong></a> и далее показано, как вы может вызвать функции в файле <code>functions.php</code> вашей темы:</p><pre><code><?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 } </code></pre><p>более того, эти функции даже <a href="http://core.trac.wordpress.org/ticket/12718"><strong> рассматриваются (в качестве основы) для включения в wordpress 3.1 </strong></a> поэтому, если нам повезет, они могут даже стать стандартными!</p>

<p>вот краткий обзор того, как строится меню администратора wordpress - я не говорю об api <code>add\_menu\_page</code>, я имею в виду фактическое меню wordpress по умолчанию.</p><h2>вызов файла меню</h2><p>меню, очевидно, загружается <code>wp-admin/admin.php</code>. но он не загружается через стандартный api, который мы привыкли использовать на основе документации wordpress. скорее, все меню (все возможные опции, подменю и т.д.) загружается через простой массив, определенный в <code>wp-admin/menu.php</code>.</p><p>таким образом, чтобы загрузить систему меню, <code>admin.php</code> просто <code>require</code>s <code>menu.php</code> ... вокруг строки 99 в wordpress 3.0.</p><h2>загрузка меню</h2><p>само меню хранится в глобальном массиве <code>$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' ); </code></pre><p>файл проходит и загружает каждый элемент меню в массив и загружает все их элементы подменю в массив с именем <code>$submenu, который индексируется на основе url родительского меню. итак, элемент подменю dashboard под названием "dashboard": $submenu[ 'index.php' ][0] = array( \_\_('dashboard'), 'read', 'index.php' ); </code></pre><p>после того, как система завершит загрузку всех меню (их не так много, но система последовательно просматривает индекс на 5 или 10 ... обратите внимание, что панель инструментов, даже если это первый элемент меню, все еще индексируется как пункт "2" (массивы php начинаются с индекса 0 ... так что это дает вам некоторое пространство для маневрирования).</p><p>в этот момент система вызывает <code>wp-admin/includes/menu.php</code>.</p><h2>пошаговое меню</h2><p>этот третий файл проходит через каждый пункт меню и, основываясь на привилегиях, назначенных текущему пользователю, либо использует меню, либо удаляет его. сначала он просматривает все подменю и удаляет страницы, к которым у пользователя нет доступа. затем он перебирает родительские страницы и делает то же самое. затем он удаляет все повторяющиеся разделители, которые остаются после устранения меню.</p><p>наконец, он сортирует меню в соответствии с назначенным им порядком меню.</p><h2>заказ пользовательских меню</h2><p>хук <code>admin\_menu</code> вызывается после того, как меню настроены, но<em> перед </em>все заказано. таким образом, можно заказать всю систему меню wordpress без "взлома" api.</p><p>после запуска действия <code>admin\_menu</code> ваши пользовательские страницы загружаются в систему. следующее, что происходит: wordpress проверяет фильтр с именем <code>custom\_menu\_order</code> ... этот фильтр всегда возвращается <code>false</code> и сообщает wordpress, хотите ли вы использовать пользовательский порядок.</p><p>добавьте следующее в вашу тему, чтобы вместо этого установить флаг <code>true</code> и определить явный порядок меню:</p><pre><code>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'); </code></pre><p>укажите порядок, который вы хотите для всех меню (я предоставил ссылки на файл загрузки меню, чтобы вы могли получить список имен файлов), и об этом нужно позаботиться.</p><hr><h2>редактировать (02.09.2010):</h2><p>чтобы указать порядок экрана редактирования пользовательского типа записи, используя этот метод, вам нужно знать url-адрес экрана редактирования. в большинстве случаев это будет <code>http://blog.url/wp-admin/edit.php?post\_type=post\_type</code>. это зависит от того, как wordpress настроен на вашем сайте (если он установлен в корне или в подпапке) и от выбранного вами типа публикации.</p><h3>например...</h3><p>допустим, у вас есть собственный тип публикации для "stack exchange questions", и вы хотите, чтобы редактор отображался в том же разделе, что и панель мониторинга, прямо под значком панели инструментов. вы использовали бы следующий код в файле <code>functions.php</code> своей темы:</p><pre><code>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'); </code></pre><p>на остальное меню это не повлияет, но ваша пользовательская страница редактирования будет перемещена в тот же раздел, что и панель мониторинга, и появится сразу под ней. вы можете использовать это для перемещения ваших пользовательских типов сообщений в любой раздел меню администратора и размещать их в любом порядке. вы также можете перемещать стандартные пункты меню примерно так же.</p><p><em> просто убедитесь, что вы указали порядок всех пунктов меню в данном разделе </em>, иначе ваше меню может подвергнуться какой-то неожиданной странности.</p>

<p>я понимаю, что это старый поток, но я думаю, что стоит обновить с гораздо более простым решением. обратите внимание, что это работает с 3.5 и не было протестировано ни с какой другой версией. следующий код может быть помещен в плагин или файл functions.php.</p><p>смотрите: <a href="http://codex.wordpress.org/plugin\_api/filter\_reference/menu\_order">http://codex.wordpress.org/plugin\_api/filter\_reference/menu\_order</a> . немного изменен в соответствии с потребностями оригинального плаката (хотя, я надеюсь, он уже нашел решение ...).</p><pre><code> // 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'); </code></pre><p>любые элементы в меню администратора, которые не перечислены здесь, не будут удалены. они будут добавлены в нижней части меню.</p>

<p>для перемещения пунктов меню мне нравится использовать глобальную переменную <code>$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'); </code></pre><p>некоторое время использовал этот трюк, только что протестировал с wp 3.4.1</p>

<p>я понимаю, что вы не хотите использовать плагин, но для простоты попробуйте плагин admin menu editor от janis elsts. перестройте меню администратора так, как вам нравится; можно также скрыть пункты меню.</p>

<p>потрясающие. огромное спасибо. я просто поместил несколько строк кода в мои functions.php</p><pre><code>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 } </code></pre><p>кроме того, поместив <a href="https://gist.github.com/792b7aa5b695d1092520">wp-admin-menu-classes.php</a> в папку с моей темой, теперь кнопка "сообщения" нажата кнопкой "страницы".</p><p>я надеюсь, что это скоро станет частью ядра, так что нам не нужно писать целое меню внутри функции, чтобы просто изменить порядок двух кнопок.</p><p>на самом деле было немного сложно получить более точный порядок для 4 кнопок. чтобы изменить 4 кнопки на: страницы, почта, медиа, ссылки, мне нужно было использовать следующий код:</p><pre><code> swap\_admin\_menu\_sections('pages','posts'); swap\_admin\_menu\_sections('media','links'); swap\_admin\_menu\_sections('posts','links'); </code></pre>