dgw
  • 0
Учитель

Сортировать элементы меню администратора

  • 0

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

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

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

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

Пример

Вместо:

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

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

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

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

    Настройки
    - Общий
    - Пишу
    - Чтение
    - Обсуждение
    - (остальные основные предметы)
    - Плагин, чтобы помочь с вещами
    - Плагин FeedBurner
    - Плагин, связанный с Google
    - Плагин 4
    - RSS-плагин
    - ВП что-то
    - так далее.
Share
  1. Это можно сделать, отсортировав глобальные файлы $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;
    }
    

    изменен порядок пунктов меню

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

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

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

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

    • 0
  3. Думал, что это может быть полезно как еще один вариант. Вот простой пример использования глобального подменю $. Я использую хук 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_page, то же самое, что и $menu_slug в add_menu_page.

    • 0

Оставить ответ

You must login to add an answer.