it-swarm-vi.tech

Thay đổi thứ tự các phần Menu Admin?

Tôi cảm thấy hơi thất vọng ở đây sau khi đã dành vài giờ cố gắng để hoàn thành nhiệm vụ khá đơn giản này mà không gặp may mắn.

Về cơ bản tôi có 5 loại bài đăng tùy chỉnh mà tôi đã tạo và tất cả những gì tôi muốn làm là hiển thị từng loại theo thứ tự cụ thể ngay dưới "bảng điều khiển" .

Từ tài liệu WordPress, có vẻ như bạn không thể thực sự làm điều này bởi vì thứ tự menu cao nhất dường như là "5". Và trên L

Tôi đoán một số chuyên gia đọc nó có thể chỉ cho tôi cách đơn giản để tôi có thể yêu cầu menu quản trị chính xác theo cách tôi muốn bằng cách sử dụng tệp chức năng và không sử dụng plugin (mà tôi biết có tồn tại).

Vui lòng tiếp tục và cố gắng tạo 5 loại bài đăng riêng biệt và đưa chúng vào một thứ tự cụ thể ngay dưới bảng điều khiển ... có vẻ như điều này là không thể. ?? ... có thể chia sẻ với tôi hoặc tốt nhất là không sử dụng jQuery?

31
Binarybit

Xin chào @BinaryBit:

Không có gì ngạc nhiên khi bạn có một chút thất vọng; menu quản trị là một trong những triển khai khó hiểu và bực bội nhất thông qua cốt lõi WordPress. Thành thật mà nói, tôi không biết họ nghĩ gì khi họ thiết kế theo cách đó.

@EAMann đã làmxuất sắccông việc giải thích cách các menu quản trị hoạt động trong WordPress (tôi ước tôi có thể đọc được khoảng 4 tháng trước ... :)

Tuy nhiên, sau khi tôi nhận ra nó hoạt động như thế nào, tôi vẫn không thể làm việc với nó mà không dành đủ thời gian để giữ cho đầu mình thẳng trong khi tôi cố gắng làm những việc đơn giản. Vì vậy, đó là lý do tại sao tôi xây dựng API Menu giúp đơn giản hóa và hợp lý hóa hoạt động với menu quản trị viên WordPress.

Chúng tương thích 100% với các cấu trúc hiện có của WordPress và vẫn còn rất nhiều trong giai đoạn alpha vì tôi là người duy nhất sử dụng nó. Tôi chắc chắn có những trường hợp sử dụng mà họ chưa xử lý. Nhưng tôi sẽ đăng mã ở đây để bạn và những người khác dùng thử.

Bạn có thể tải xuống tệp để thả trong thư mục chủ đề của bạn tại đây: wp-admin-menu-class.php và những gì sau đây cho thấy bạn thế nào có thể gọi các chức năng trong tệp functions.php của chủ đề của bạn:

<?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 là chẵn đ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 điều này thậm chí có thể trở thành tiêu chuẩn!

33
MikeSchinkel

Đây là hướng dẫn nhanh về cách xây dựng menu quản trị viên WordPress - Tôi không nói về API add_menu_page, ý tôi là menu WordPress mặc định thực tế.

Gọi tập tin menu

Rõ ràng, menu được tải bởi wp-admin/admin.php. Nhưng nó không được tải thông qua API tiêu chuẩn mà chúng tôi đã sử dụng dựa trên tài liệu WordPress. Thay vào đó, toàn bộ menu (tất cả các tùy chọn có thể, menu con, v.v.) được tải thông qua một mảng đơn giản được xác định trong wp-admin/menu.php.

Vì vậy, để tải hệ thống menu, admin.php chỉ cần requires menu.php ... khoảng dòng 99 trong WordPress 3.0.

Đang tải Menu

Bản thân menu được lưu trữ trong mảng toàn cầu $menu. Theo tài liệu trực tuyến, mảng menu có các yếu tố sau:

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

Bảng điều khiển, ví dụ, là:

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

Tệp đi qua và tải từng mục menu vào mảng và tải tất cả các mục menu phụ của chúng vào một mảng có tên $submenu lập chỉ mục dựa trên url của menu cha. Vì vậy, mục menu con của Bảng điều khiển được gọi là "Bảng điều khiển" là:

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

Sau khi hệ thống tải xong tất cả các menu (không có nhiều, nhưng hệ thống bước qua chỉ mục vào lúc 5 hoặc 10 ... lưu ý rằng Bảng điều khiển, mặc dù đó là mục menu đầu tiên, vẫn được lập chỉ mục là mục "2" (mảng PHP bắt đầu ở chỉ số 0 ... vì vậy, điều này cung cấp cho bạn một số phòng điều động).

Tại thời điểm này, hệ thống gọi wp-admin/includes/menu.php.

Bước qua Menu

Tệp thứ ba này đi qua từng mục menu và, dựa trên các đặc quyền được gán cho người dùng hiện tại, sử dụng menu hoặc loại bỏ nó. Đầu tiên, nó lặp qua tất cả các menu phụ và xóa các trang mà người dùng không thể truy cập. Sau đó, nó lặp qua các trang cha và làm điều tương tự. Sau đó, nó loại bỏ bất kỳ phân tách trùng lặp vẫn còn từ việc loại bỏ các menu.

Cuối cùng, nó sắp xếp các menu dựa trên thứ tự menu được chỉ định của chúng.

Đặt menu tùy chỉnh

Hook admin_menu được gọi sau khi các menu được thiết lập nhưng trước bất cứ thứ gì được đặt hàng. Vì vậy, có thể đặt hàng toàn bộ hệ thống menu WordPress mà không cần "hack" API.

Sau khi hành động admin_menu được kích hoạt, các trang tùy chỉnh của bạn sẽ được tải vào hệ thống. Điều tiếp theo xảy ra là WordPress kiểm tra bộ lọc có tên custom_menu_order ... bộ lọc này luôn được trả về false và cho WordPress biết bạn có muốn sử dụng đơn hàng tùy chỉnh hay không.

Thêm phần sau vào chủ đề của bạn để đặt cờ thành true thay vào đó và xác định thứ tự trình đơn rõ ràng của bạn:

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');

Chỉ định thứ tự bạn muốn cho tất cả các menu (Tôi đã cung cấp các tham chiếu đến tệp tải menu để bạn có thể nhận được danh sách tên tệp) và điều này sẽ đảm nhiệm việc này.


EDIT (9/2/2010):

Để chỉ định thứ tự của màn hình chỉnh sửa loại bài đăng tùy chỉnh bằng phương pháp này, bạn cần biết URL của màn hình chỉnh sửa. Tôi hầu hết các trường hợp, nó sẽ là http://blog.url/wp-admin/edit.php?post_type=POST_TYPE. Điều này phụ thuộc vào cách WordPress được thiết lập trên trang web của bạn (nếu nó được cài đặt trong thư mục gốc hoặc trong thư mục con) và sên của loại bài đăng tùy chỉnh bạn đang sử dụng.

Ví dụ...

Giả sử bạn có loại bài đăng tùy chỉnh cho 'Câu hỏi trao đổi ngăn xếp' và bạn muốn trình chỉnh sửa xuất hiện trong cùng phần với bảng điều khiển ngay bên dưới biểu tượng bảng điều khiển. Bạn sẽ sử dụng mã sau trong tệp functions.php của chủ đề:

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');

Phần còn lại của menu sẽ không bị ảnh hưởng, nhưng trang chỉnh sửa tùy chỉnh của bạn sẽ được chuyển đến cùng phần với bảng điều khiển và sẽ xuất hiện ngay bên dưới nó. Bạn có thể sử dụng điều này để di chuyển các loại bài đăng tùy chỉnh của bạn đến bất kỳ phần nào trong menu quản trị và đặt chúng theo bất kỳ thứ tự nào. Bạn cũng có thể di chuyển các mục menu tiêu chuẩn xung quanh theo cùng một cách.

Chỉ cần đảm bảo rằng bạn chỉ định thứ tự của tất cả các mục menu trong phần nhất định , nếu không, menu của bạn có thể phải chịu một số điều kỳ lạ không mong muốn.

21
EAMann

Tôi nhận ra đây là một chủ đề cũ, nhưng tôi nghĩ rằng nó đáng để cập nhật với một giải pháp dễ dàng hơn. Xin lưu ý rằng điều này hoạt động với 3.5 và chưa được thử nghiệm với bất kỳ phiên bản nào khác. Đoạn mã sau có thể được đặt trong một plugin hoặc tệp tin.php.

Xem: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Sửa đổi một chút để phù hợp với nhu cầu của người gửi ban đầu (mặc dù, tôi hy vọng anh ta đã tìm ra giải pháp cho đến bây giờ ...).

  // 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');

Bất kỳ mục nào trong menu quản trị không được liệt kê ở đây sẽ không bị xóa. Chúng sẽ được thêm vào dưới cùng của menu.

18
Matt

Để di chuyển các mục menu xung quanh, tôi thích sử dụng biến Toàn cầu $menu.

Ví dụ: nếu tôi muốn di chuyển menu "Trang" xuống cuối các menu, tôi sẽ sử dụng menu này trong functions.php hoặc plugin:

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');

và nếu tôi muốn trao đổi các menu Bài viết và Liên kết:

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');

Đã sử dụng thủ thuật này một chút, chỉ cần thử nghiệm với WP 3.4.1

2
forlogos

Tôi hiểu rằng bạn không muốn sử dụng một plugin, nhưng để đơn giản, hãy thử plugin Trình chỉnh sửa Menu Admin của Janis Elsts. Sắp xếp lại các menu quản trị của bạn theo bất kỳ cách nào bạn muốn; cũng có thể ẩn các mục menu.

2
Ray Gulick

Tuyệt vời. Cảm ơn bạn rất nhiều. Tôi chỉ cần đặt một số dòng mã vào hàm của mình.php

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
}

Cộng với việc đặt wp-admin-menu-class.php trong thư mục chủ đề của tôi và bây giờ nút 'bài viết' được vuốt bằng nút 'trang'.

Tôi hy vọng điều này sẽ sớm trở thành một phần của cốt lõi và theo cách mà chúng ta không cần phải viết toàn bộ menu trong một chức năng để chỉ cần sắp xếp lại hai nút.

Trong thực tế, có một chút khó khăn để có được một thứ tự cụ thể hơn cho 4 nút. Để thay đổi 4 nút thành: Trang, Bài đăng, Phương tiện, Liên kết tôi cần sử dụng mã folowing:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
0
Sebastian