Сортировать пункты меню администратора

8

В связанной заметке « Изменение порядка разделов меню администратора? » Я ищу способ сортировки записей по алфавиту в каждом подразделе области администрирования WordPress по алфавиту.

В настоящее время всякий раз, когда добавляется новый плагин, его запись будет отображаться в кажущемся случайном месте в меню «Настройки» / «Инструменты» / «Плагины», и часто трудно найти новый пункт меню. (У меня уже есть много плагинов, поэтому мои меню довольно полные.)

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

Извините за длинный вопрос; Я просто хочу прояснить, что я ищу.

пример

Вместо:

    настройки
    - Генеральный
    - Письмо
    - Чтение
    - обсуждение
    - (остальные основные предметы)
    - Плагин 4
    - WP что-то
    - Плагин, чтобы помочь с вещами
    - Плагин, связанный с Google
    - RSS плагин
    - Плагин FeedBurner
    - так далее.

Можно ли отсортировать меню по алфавиту (или другим логическим способом), например:

    настройки
    - Плагин, чтобы помочь с вещами
    - обсуждение
    - Плагин FeedBurner
    - Генеральный
    - Плагин, связанный с Google
    - Плагин 4
    - Чтение
    - (остальные основные предметы)
    - RSS плагин
    - WP что-то
    - Письмо
    - так далее.

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

    настройки
    - Генеральный
    - Письмо
    - Чтение
    - обсуждение
    - (остальные основные предметы)
    - Плагин, чтобы помочь с вещами
    - Плагин FeedBurner
    - Плагин, связанный с Google
    - Плагин 4
    - RSS плагин
    - WP что-то
    - так далее.
DGW
источник

Ответы:

4

Это можно сделать сортировкой по всему миру $submenu.

Применяемая сортировка сбрасывает номер ключа подмассива $submenu['options-general.php']:

array
  'options-general.php' => 
    array
      10 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      15 => 
        array
          0 => string 'Writing'
          1 => string 'manage_options'
          2 => string 'options-writing.php'
      // etc

и становится:

array
  'options-general.php' => 
    array
      0 => 
        array
          0 => string 'Discussion'
          1 => string 'manage_options'
          2 => string 'options-discussion.php'
      1 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      // etc

Здесь мы рассматриваем длину элементов по умолчанию, равную шести. До WordPress 3.5 было 7 пунктов, теперь конфиденциальность исчезла и встроена во вкладку « Чтение ».

Локальное тестирование не дает неожиданного результата и работает нормально. Может быть, если плагин зависит от того, $submenu['options-general.php'][15]чтобы позиционировать себя или что-то еще, ошибки могут возникнуть.

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

add_action( 'admin_menu', 'sort_settings_menu_wpse_2331', 999 );

function sort_settings_menu_wpse_2331() 
{
    global $submenu;

    // Sort default items
    $default = array_slice( $submenu['options-general.php'], 0, 6, true );
    usort( $default, 'sort_arra_asc_so_1597736' );

    // Sort rest of items
    $length = count( $submenu['options-general.php'] );
    $extra = array_slice( $submenu['options-general.php'], 6, $length, true );
    usort( $extra, 'sort_arra_asc_so_1597736' );

    // Apply
    $submenu['options-general.php'] = array_merge( $default, $extra );
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 )
{
    if ($item1[0] == $item2[0]) return 0;
    return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

переупорядоченные пункты меню

brasofilo
источник
3

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

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

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

Вы можете скачать файл для добавления в каталог вашей темы здесь: https://gist.github.com/792b7aa5b695d1092520

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

NetConstructor.com
источник
Это звучит как большой кусок кода, но я не вижу, где он автоматически сортирует вложенные записи.
DGW
1

Думал, что это может быть полезным в качестве другого варианта. Вот простой usort в глобальном подменю $. Я использую ловушку admin_init, потому что admin_menu может иметь другие плагины, добавляющие элементы подменю (в моем случае это было сделано, так что было слишком рано делать сортировку). Также обратите внимание, что анонимная (лямбда) функция в usort требует PHP 5.3+.

<?php 
add_action('admin_init','my_admin_init');
function my_admin_init() {
    global $submenu;
    $submenu_key = 'my_key'; // See note below on $submenu_key
    if ( array_key_exists( $submenu_key, $submenu ) ) {
        // alphabetize submenu items
        usort( $submenu[ $submenu_key ], function ( $a, $b ) {
            // format of a submenu item is [ 'My Item', 'read', 'manage-my-items', 'My Item' ]
            return strcasecmp( $a[0], $b[0] );
        } );
    }
}

Обратите внимание, что $submenu_keyэто $parent_slugна странице add_submenu_ , которая такая же, как $menu_slugна странице add_menu_page .

ryanm
источник
1
Красиво и компактно. Что $submenu_keyпредставляет? Это то, что WordPress вызывает $parent slugв документах add_submenu_page ?
random_user_name
@cale_b Отличный вопрос! Вы правы, это $parent_slugв документах add_submenu_page, как и $menu_slugв add_menu_page.
17