Sắp xếp các mục menu quản trị


8

Trên một lưu ý liên quan đến " Thay đổi thứ tự các phần menu của quản trị viên? ", Tôi đang tìm cách sắp xếp theo thứ tự bảng chữ cái trong mỗi phần phụ của khu vực quản trị của WordPress.

Hiện tại, bất cứ khi nào một plugin mới được thêm vào, mục nhập của nó sẽ xuất hiện ở một vị trí dường như ngẫu nhiên trong Cài đặt / Công cụ / Plugin và thường rất khó để xác định mục menu mới. (Tôi đã có rất nhiều plugin, vì vậy các menu của tôi khá đầy đủ.)

Do tôi thêm và xóa các plugin khá thường xuyên, tôi không cần phải liên tục vào trang cài đặt cho một plugin đặt hàng menu và điều chỉnh thứ tự.

Xin lỗi vì câu hỏi dài; Tôi chỉ muốn làm rõ những gì tôi đang tìm kiếm.

Thí dụ

Thay vì:

    Cài đặt
    - Chung
    - Viết
    - Đọc hiểu
    - Thảo luận
    - (phần còn lại của các mục cốt lõi)
    - Plugin 4
    - WP gì đó
    - Một plugin để giúp với công cụ
    - Plugin liên quan đến Google
    - Plugin RSS
    - Plugin FeedBurner
    - Vân vân.

Tôi có thể sắp xếp menu theo thứ tự bảng chữ cái (hoặc theo phương pháp logic khác), vd:

    Cài đặt
    - Một plugin để giúp với công cụ
    - Thảo luận
    - Plugin FeedBurner
    - Chung
    - Plugin liên quan đến Google
    - Plugin 4
    - Đọc hiểu
    - (phần còn lại của các mục cốt lõi)
    - Plugin RSS
    - WP gì đó
    - Viết
    - Vân vân.

Thậm chí tốt hơn sẽ là một phương thức sắp xếp giữ các mục cốt lõi theo mặc định chúng và chỉ sắp xếp các mục được thêm bởi các plugin:

    Cài đặt
    - Chung
    - Viết
    - Đọc hiểu
    - Thảo luận
    - (phần còn lại của các mục cốt lõi)
    - Một plugin để giúp với công cụ
    - Plugin FeedBurner
    - Plugin liên quan đến Google
    - Plugin 4
    - Plugin RSS
    - WP gì đó
    - Vân vân.

Câu trả lời:


4

Nó có thể được thực hiện sắp xếp toàn cầu $submenu.

Việc sắp xếp được áp dụng đặt lại số khóa của mảng con $submenu['options-general.php'], đó là:

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

và trở thành:

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

Ở đây, chúng tôi đang xem xét độ dài của các mục mặc định bằng sáu. Trước WordPress 3.5, đã có 7 mục, Quyền riêng tư hiện đã biến mất và được nhúng với tab Đọc .

Thử nghiệm cục bộ, điều này không tạo ra bất kỳ kết quả bất ngờ nào và hoạt động tốt. Có thể nếu một plugin phụ thuộc vào $submenu['options-general.php'][15]vị trí của chính nó hoặc một cái gì đó khác, lỗi có thể xảy ra.

Sắp xếp đang được áp dụng riêng cho các mục mặc định và cho phần còn lại của chúng. Chỉ cần vô hiệu hóa usortkhối đầu tiên và bạn có đầu ra mong muốn.

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

các mục menu được sắp xếp lại


3

Tôi đang tìm kiếm điều tương tự và hình dung rằng tôi sẽ sao chép mã do Mike cung cấp bên dưới mà anh ta tuyên bố vẫn còn rất nhiều trong bản alpha vì chỉ có anh ta mới sử dụng nó.

Tôi đã thử nghiệm nó và nó dường như hoạt động tốt cho tôi. Tôi chắc chắn có những trường hợp sử dụng mà họ chưa xử lý.

Có thể Mike sẽ bình luận ở đây và cung cấp trợ giúp thêm về cách bạn có thể sử dụng lớp học của anh ấy để đạt được mục tiêu của mình.

Bạn có thể tải xuống tệp để thả vào thư mục chủ đề của mình tại đây: https://gist.github.com/792b7aa5b695d1092520

Những gì sau đây cho thấy cách bạn có thể gọi các hàm trong tệp tin.php của chủ đề:

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

Hơn nữa, các chức năng này thậm chí đang được xem xét (làm cơ sở) để đưa vào WordPress 3.1, vì vậy nếu chúng ta may mắn thì những chức năng này thậm chí có thể trở thành tiêu chuẩn!


Nghe có vẻ như một đoạn mã tuyệt vời, nhưng tôi không thấy nó tự động sắp xếp các mục con.
dgw

1

Nghĩ rằng điều này có thể hữu ích như là một lựa chọn khác. Đây là một ứng dụng đơn giản trên menu con $ toàn cầu. Tôi sử dụng hook admin_init, bởi vì admin_menu vẫn có thể có các plugin khác thêm các mục menu con (trong trường hợp của tôi, vì vậy còn quá sớm để thực hiện sắp xếp). Cũng lưu ý hàm nặc danh (lambda) trong ứng dụng yêu cầu 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] );
        } );
    }
}

Lưu ý rằng $submenu_key$parent_slugtrong add_submenu_page , mà là giống như $menu_slugtrong add_menu_page .


1
Đẹp và nhỏ gọn. $submenu_keyĐại diện là gì? Có phải đó là những gì WordPress gọi $parent slugtrong tài liệu add_submenu_page ?
Random_user_name

@cale_b Câu hỏi hay! Bạn đã đúng, nó nằm $parent_slugtrong tài liệu add_submenu_page, giống như $menu_slugtrong add_menu_page.
ryanm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.