Làm cách nào tôi có thể kiểm soát vị trí trong menu quản trị của các mục được thêm bởi plugin?


8

Đã đọc ở đâu đó trên Stack của hai plugin WP buộc các vị trí menu giống hệt nhau (với khả năng một plugin không xuất hiện), tôi tự hỏi làm thế nào tôi có thể kiểm soát vị trí của các mục menu được thêm bởi plugin.

Tôi đã sử dụng một chức năng dường như xử lý các mục menu con như vậy trong 'cài đặt' và một chức năng khác để sắp xếp lại mặc định (bài viết, trang, chủ đề, plugin, cài đặt, v.v.) các mục 'cấp cao nhất' - nhưng không thay đổi định vị của các mục như vậy được thêm bởi các plugin.

function custom_menu_order() {
return array(
//Add items here in desired order.

);
}

add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', 'custom_menu_order' );

Ví dụ: trong số hai mục trình đơn cấp cao nhất được thêm bởi WooC Commerce, một mục xuất hiện phía trên mục được thêm bởi ContactForm7 và mục còn lại bên dưới, và thật tuyệt khi sắp xếp lại chúng theo cách phù hợp - và cũng có thể sắp xếp lại các mục tốt hơn mà không buộc một vị trí menu và thay vào đó xuất hiện ở phía dưới.

Tôi thấy nó thường hoạt động tốt khi đặt hàng lại mặc định và các mục 'edit.php? Post_type = ...', nhưng các mục có 'admin.php? Page = ...' không đặt hàng lại.

Khi chức năng đặt hàng lại của tôi bị vô hiệu hóa, hai mục WooC Commerce ('edit.php? Post_type = sản phẩm' và 'edit.php? Post_type = shop_order') cùng nhau như dự định, nhưng khi chức năng được kích hoạt lại, chúng sẽ bị chia tách bởi ContactForm7 ('admin.php? page = wpcf7').

Và, một ('edit.php? Post_type = shop_order') của CPT WooC Commerce sẽ không sắp xếp lại - mặc dù cái khác ('edit.php? Post_type = sản phẩm').

Câu trả lời:


8

Để thay đổi thứ tự trình đơn quản trị viên cấp cao nhất, bạn sẽ cần hai hooks, hai filtersvà một function. Đặt mã sau vào chủ đề hiện tại của bạn functions.php:

function wpse_custom_menu_order( $menu_ord ) {
    if ( !$menu_ord ) return true;

    return array(
        'index.php', // Dashboard
        'separator1', // First separator
        'edit.php', // Posts
        'upload.php', // Media
        'link-manager.php', // Links
        'edit-comments.php', // Comments
        'edit.php?post_type=page', // Pages
        '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', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

Mảng trả về của các mục menu quản trị viên cấp cao nhất, ở trên, biểu thị các mục menu được chèn theo lõi, theo thứ tự mặc định của chúng. Để bao gồm các mục menu được thêm bởi các plugin, chúng ta phải thêm chúng vào mảng này. Giả sử chúng ta có hai plugin được thêm và kích hoạt (ví dụ: WordfenceNextCellent Gallery). Trước tiên, chúng ta phải tìm tên của các mục menu này. Khi chúng tôi nhấp vào Wordfencemục menu cấp cao nhất, URL kết quả sẽ kết thúc bằng ?page=Wordfence. Phần sau ?page=là tên của chúng tôi ( Wordfence). Đối với NextCellent Gallery, tên sẽ được nextcellent-gallery-nextgen-legacy. Bây giờ, hãy thêm các mục này vào mảng của chúng tôi:

return array(
    'index.php', // Dashboard
    'separator1', // First separator
    'edit.php', // Posts
    'upload.php', // Media
    'link-manager.php', // Links
    'edit-comments.php', // Comments
    'edit.php?post_type=page', // Pages
    'separator2', // Second separator
    'themes.php', // Appearance
    'plugins.php', // Plugins
    'users.php', // Users
    'tools.php', // Tools
    'separator3', // Third separator
    'options-general.php', // Settings
    'separator-last', // Last separator
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Bây giờ chúng ta có thể di chuyển các mục của mảng này, lên và xuống, để có được thứ tự cuối cùng.

Lưu ý : bạn cũng có thể sử dụng plugin Admin Menu Editor , để dễ dàng kéo và thả hành động.


1
@ Frank P. Walentynowicz ... cảm ơn vì câu trả lời toàn diện. Tôi đã cập nhật bài viết gốc của mình để làm rõ và đề xuất của bạn về việc sử dụng 'phần sau? Page =' rất hữu ích và giải quyết vấn đề của tôi - ngoại trừ một trong hai mục WooC Commerce.
glvr

Thêm nhanh vào nhận xét trên của tôi: Trước đây tôi đã sử dụng Trình chỉnh sửa Menu Admin, nhưng thích chức năng mã hóa cứng hơn.
glvr

11

Các câu trả lời hiện có đều ổn, nhưng nếu bạn thêm một loại bài đăng tùy chỉnh mới, bạn sẽ phải chỉnh sửa lại các chức năng đó nhiều lần.

Để khắc phục điều này, tôi đã phát triển chức năng nhỏ này. Chỉ cần xác định $new_positionsbên trong my_new_menu_orderchức năng của bạn :

/**
 * Activates the 'menu_order' filter and then hooks into 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filters WordPress' default menu order
 */
function my_new_admin_menu_order( $menu_order ) {
  // define your new desired menu positions here
  // for example, move 'upload.php' to position #9 and built-in pages to position #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // helper function to move an element inside an array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // traverse through the new positions and move 
  // the items if found in the original menu_positions
  foreach( $new_positions as $value => $new_index ) {
    if( $current_index = array_search( $value, $menu_order ) ) {
      move_element($menu_order, $current_index, $new_index);
    }
  }
  return $menu_order;
};

1
Điều này thật tuyệt vời - vì vậy khi các mục mới được thêm vào dưới dạng một mục menu như loại bài đăng tùy chỉnh (như bạn đề xuất) hoặc một plugin mới hoặc thậm chí là một tùy chọn tích hợp mới trong tương lai, nó sẽ được thêm vào tốt như bình thường ?
Brett

@Brett Có vẻ như nó sẽ hoạt động như vậy.
Davey

6

khi bạn đang tạo loại bài đăng với register_post_type (), bạn có thể đặt vị trí menu:

menu_poseition (số nguyên) (tùy chọn) Vị trí trong menu sắp xếp loại bài đăng sẽ xuất hiện. show_in_menu phải đúng

    Default: null - defaults to below Comments 

    5 - below Posts
    10 - below Media
    15 - below Links
    20 - below Pages
    25 - below comments
    60 - below first separator
    65 - below Plugins
    70 - below Users
    75 - below Tools
    80 - below Settings
    100 - below second separator

Nếu các mục có cùng vị trí menu, chúng được sắp xếp theo thứ tự abc.

trong plugin của riêng bạn, bạn có thể thiết lập cấp độ. nếu bạn đang cố gắng thay đổi vị trí menu của một plugin bạn chưa tạo, nhiều người trong số họ có thể cắm nó hoặc bạn có thể chỉnh sửa các cuộc gọi của họ.


@ rudtek ... cảm ơn. Trong các CPT của riêng tôi, tôi đã tránh cài đặt các vị trí menu, thay vào đó, tốt hơn là sử dụng thứ tự lại menu và do đó 'có tất cả ở cùng một vị trí' và sau đó dễ dàng thay đổi hơn. Không có plugin riêng mà tôi đang cố gắng đặt vị trí menu, đó là các plugin của bên thứ ba - mà tôi không biết đủ về 'có thể cắm' hoặc để chỉnh sửa các cuộc gọi của họ (có lẽ sẽ bị ghi đè khi cập nhật).
glvr
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.