Sortir item menu admin

8

Pada catatan terkait dengan " Mengubah Urutan Bagian Menu Admin? ", Saya sedang mencari cara untuk mengurutkan entri menurut abjad di setiap sub-bagian dari area admin WordPress.

Saat ini, setiap kali plugin baru ditambahkan, entri akan muncul di lokasi yang tampaknya acak di bawah Pengaturan / Alat / Plugin, dan seringkali sulit untuk menemukan item menu baru. (Saya sudah memiliki banyak plugin, jadi menu saya cukup lengkap.)

Menjadi yang saya tambahkan dan hapus plugin secara teratur, saya lebih suka tidak perlu terus-menerus masuk ke halaman pengaturan untuk plugin pemesanan menu dan menyesuaikan pesanan.

Maaf untuk pertanyaan panjang; Saya hanya ingin memperjelas apa yang saya cari.

Contoh

Dari pada:

    Pengaturan
    - Jenderal
    - Menulis
    - Bacaan
    - Diskusi
    - (sisa item inti)
    - Plugin 4
    - WP sesuatu
    - Sebuah plugin untuk membantu hal-hal
    - Plugin terkait Google
    - Plugin RSS
    - Plugin FeedBurner
    - dll.

Dapatkah saya membuat menu diurutkan sesuai abjad (atau dengan metode logis lain), misalnya:

    Pengaturan
    - Sebuah plugin untuk membantu hal-hal
    - Diskusi
    - Plugin FeedBurner
    - Jenderal
    - Plugin terkait Google
    - Plugin 4
    - Bacaan
    - (sisa item inti)
    - Plugin RSS
    - WP sesuatu
    - Menulis
    - dll.

Bahkan yang lebih baik adalah metode pengurutan yang membuat entri inti tetap di tempatnya secara default dan hanya mengurutkan item yang ditambahkan oleh plugin:

    Pengaturan
    - Jenderal
    - Menulis
    - Bacaan
    - Diskusi
    - (sisa item inti)
    - Sebuah plugin untuk membantu hal-hal
    - Plugin FeedBurner
    - Plugin terkait Google
    - Plugin 4
    - Plugin RSS
    - WP sesuatu
    - dll.
dgw
sumber

Jawaban:

4

Itu bisa dilakukan penyortiran global $submenu.

Penyortiran yang diterapkan me-reset nomor kunci dari sub-array $submenu['options-general.php'], yaitu:

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

dan menjadi:

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

Di sini, kami mempertimbangkan panjang item default sama dengan enam. Sebelum WordPress 3.5, ada 7 item, Privasi sekarang hilang dan tertanam dengan tab Reading .

Menguji secara lokal, ini tidak menghasilkan hasil yang tidak diharapkan dan berfungsi dengan baik. Mungkin jika sebuah plugin bergantung pada $submenu['options-general.php'][15]posisi itu sendiri atau sesuatu yang lain, bug dapat terjadi.

Sortir diterapkan secara terpisah untuk item default dan sisanya. Cukup nonaktifkan usortblok pertama dan Anda memiliki output yang Anda inginkan.

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;
}

item menu yang dipesan ulang

brasofilo
sumber
3

Saya sedang mencari hal yang sama dan berpikir saya akan menyalin kode yang disediakan oleh Mike di bawah ini yang menurutnya masih sangat banyak dalam alpha karena hanya dia yang telah menggunakannya.

Saya telah mengujinya dan tampaknya bekerja dengan baik untuk saya. Saya yakin ada kasus penggunaan yang belum mereka tangani.

Mungkin Mike akan berkomentar di sini dan memberikan bantuan tambahan tentang bagaimana Anda dapat menggunakan kelasnya untuk mencapai tujuan Anda.

Anda dapat mengunduh file untuk dimasukkan ke direktori tema Anda di sini: https://gist.github.com/792b7aa5b695d1092520

Apa yang berikut di bawah ini menunjukkan bagaimana Anda dapat memanggil fungsi dalam file functions.php tema Anda:

<?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
}

Terlebih lagi, fungsi-fungsi ini bahkan sedang dipertimbangkan (sebagai basis) untuk dimasukkan dalam WordPress 3.1 jadi jika kita beruntung ini bahkan mungkin menjadi standar!

NetConstructor.com
sumber
Kedengarannya seperti sedikit kode, tapi saya tidak melihat di mana secara otomatis mengurutkan sub-entri.
dgw
1

Kupikir ini bisa berguna sebagai pilihan lain. Ini adalah usort sederhana pada submenu $ global. Saya menggunakan kait admin_init, karena admin_menu mungkin masih memiliki plugin lain yang menambahkan item submenu (dalam kasus saya memang demikian, jadi itu terlalu dini untuk melakukan penyortiran). Perhatikan juga fungsi anonim (lambda) di usort membutuhkan 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] );
        } );
    }
}

Perhatikan bahwa $submenu_keyada $parent_slugdi add_submenu_page , yang sama dengan $menu_slugdi add_menu_page .

ryanm
sumber
1
Bagus dan ringkas. Apa yang $submenu_keymewakili? Apakah itu yang disebut WordPress $parent slugdalam dokumen add_submenu_page ?
random_user_name
@cale_b Pertanyaan bagus! Anda benar, ada $parent_slugdi add_submenu_page docs, yang sama dengan $menu_slugdi add_menu_page.
ryanm