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


31

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ó một số loại hack jquery để làm cho công việc này mà ai đó làm có thể chia sẻ với tôi hoặc tốt nhất là không sử dụng jQuery?

Câu trả lời:


33

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àm một công việc tuyệt vời để 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 điều đó 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 đơ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ả vào thư mục chủ đề của mình tại đây: wp-admin-menu-class.php và phần tiếp theo cho thấy cách bạn có thể gọi các chức năng trong functions.phptệp 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!


Bổ sung tuyệt vời cho API! Tôi đã mất vài tháng để thêm phần menu tùy chỉnh đầu tiên của mình với khung hiện có (đó là lý do tại sao tôi đã nghiên cứu mã làm nhiều) ... nhưng API của bạn có vẻ trực quan hơn để sử dụng!
EAMann

@EAMann - Cảm ơn! Nếu bạn muốn đưa ra bất kỳ đề xuất nào hoặc thậm chí hợp tác để cải thiện nó, tôi rất muốn có được một cái gì đó được thiết lập có thể giúp mọi người dễ dàng hơn ngoại trừ chỉ một vài người tình cờ xem Q & A này.
MikeSchinkel

điều này có làm cho cốt lõi hay điều này hoặc một cái gì đó tương tự vẫn được yêu cầu để thao tác thứ tự các mục menu trong quản trị viên?
Q Studio

Theo như tôi đã tìm thấy, nó đã bị hoãn lại với WP 3.5
pixeline

Xin chào Mike - wp_debug đưa ra lỗi về hàm này: -------- function exchange_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> exchange_with ($ to_section); trả lại phần $; } --- Lưu ý: Biến không xác định: phần
Q Studio

21

Đâ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ề add_menu_pageAPI, ý tôi là menu WordPress mặc định thực tế.

Gọi tập tin menu

Các menu, rõ ràng, đượ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 các hệ thống menu, admin.phpchỉ requiremenu.php... xung quanh dòng 99 trong WordPress 3.0.

Đang tải Menu

Menu chính đượ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 gọi là $submenucác 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

Móc admin_menuđược gọi sau khi các menu được thiết lập nhưng trước khi mọi thứ đượ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 đượ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ờ truethay thế và xác định thứ tự menu 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ẽ đượchttp://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 đoạn mã sau trong functions.phptệp 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.


Có một lỗi nhỏ trong mã ví dụ của bạn dưới tiêu đề "Sắp xếp menu tùy chỉnh", câu lệnh if có điều kiện thiếu $tên biến ... (Mặc dù vậy, câu trả lời tuyệt vời) ..
t31os

Làm thế nào bạn có thể thêm loại bài đăng tùy chỉnh cho "Câu hỏi trao đổi ngăn xếp" vào một phần bên dưới phần Bảng điều khiển?
epaps

Xin chào EAMann - câu hỏi nhanh. Vì phiên bản mới nhất của wordpress có quá trình này thay đổi hoàn toàn hay trở nên đơn giản hơn?
NetConstructor.com

Làm thế nào về các menu con ? Có một phương pháp tương tự để sắp xếp lại các mục menu con ?
Giraldi

@GiraldiMaggio Vui lòng đặt câu hỏi mới và tham khảo câu hỏi này.
EAMann

18

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ù vậy, 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.


1
Vâng, điều này tốt hơn nhiều, cũng để đặt hàng lại các mục menu con bạn có thể bỏ đặt và sau đó đặt lại chúng.
Wyck

2

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.


Tôi đã thử plugin này trong cài đặt nhiều trang. Nó hoạt động tốt nhất. Nhưng chúng tôi cần phải cấu hình thủ công các tùy chọn cho mọi trang web phụ nếu chúng tôi có Cài đặt nhiều trang.
dùng391

2

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

Ví dụ: nếu tôi muốn di chuyển menu "Trang" xuống cuối menu, tôi sẽ sử dụng cái này trong functions.phphoặc một 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


Tôi biết đây là một bài viết cũ hơn nhưng liên quan đến đoạn trích đầu tiên của bạn, tôi đã gặp phải một vấn đề với dòng cuối cùng trong admin_menu_itemschức năng đã được khắc phục bằng cách thay thế nó bằngunset($menu[20]);
hot_barbara

0

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 nào đó để 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');
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.