如何控制插件添加的项目在管理菜单中的位置?


8

在阅读了两个WP插件堆栈中的其他文章之后,它们强制设置了相同的菜单位置(可能出现一个菜单然后不再出现),我想知道如何控制插件添加的菜单项的位置。

我已经使用了一个似乎可以处理“设置”中此类子菜单项的函数,以及一个用于对默认项(帖子,页面,主题,插件,设置等)进行重新排序的另一个函数,但该函数不会改变位置插件添加的此类项目。

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

例如,在WooCommerce添加的两个顶级菜单项中,一个出现在ContactForm7添加的项的上方,另一个出现在下方,因此最好对它们进行重新排序-以便更好地对项目进行重新排序不会强制菜单位置,而是显示在底部。

我发现通常可以对默认项和'edit.php?post_type = ...'项目进行重新排序,但是对于那些具有'admin.php?page = ...'的项目则无需重新排序。

禁用我的重新排序功能后,两个WooCommerce项目(“ edit.php?post_type = product”和“ edit.php?post_type = shop_order”)会按预期分组在一起,但是当重新激活该功能时,它们将被拆分通过ContactForm7('admin.php?page = wpcf7')。

而且,一个('edit.php?post_type = shop_order')WooCommerce CPT不会重新排序-尽管另一个('edit.php?post_type = product')可以重新排序。

Answers:


9

要更改顶级管理菜单项的顺序,您需要两个hooks,两个filters和一个function。将以下代码放入当前主题中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 );

上面返回的顶级管理菜单项的数组表示核心按其默认顺序插入的菜单项。要包括插件添加的菜单项,我们必须将其添加到此数组中。假设我们添加并激活了两个插件(例如:WordfenceNextCellent Gallery)。首先,我们必须找到这些菜单项的名称。当我们单击Wordfence顶级菜单项时,结果URL将以结尾?page=Wordfence。后面的部分?page=是我们的名称(Wordfence)。为NextCellent Gallery,名称将是nextcellent-gallery-nextgen-legacy。现在,让我们将这些项添加到数组中:

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

现在,我们可以上下移动此数组的项目,以获取最终订单。

注意:您也可以使用Admin Menu Editor插件,也可以轻松进行拖放操作。


1
@ Frank P. Walentynowicz ...感谢您的全面回答。我更新了原始帖子以进行澄清,您的建议是使用“?page =之后的部分”非常有帮助,并且可以解决我的问题-除了两个WooCommerce项目之一。
glvr

快速添加到我的上述评论中:我以前使用过“管理菜单编辑器”,但是更喜欢硬编码功能。
glvr

11

现有答案很好,但是如果您要添加新的自定义帖子类型,则必须一次又一次地重新编辑这些功能。

为了解决这个问题,我开发了这个小功能。只需$new_positionsmy_new_menu_order函数内部定义:

/**
 * 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
这太棒了-因此,当将来将新项目作为菜单项添加时,例如自定义帖子类型(如您所建议的),新插件或什至是新的内置选项时,它将像往常一样添加?
Brett

@Brett看起来像那样工作。
戴维

6

使用register_post_type()创建帖子类型时,可以设置菜单位置:

menu_position(整数)(可选)应在菜单顺序中显示帖子类型的位置。show_in_menu必须为true。

    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

如果项目具有相同的菜单位置,它们将按字母顺序排序。

在您自己的插件中,您可以设置级别。如果您尝试更改尚未创建的插件的菜单位置,则其中许多插件可能都可插入,也可以编辑其调用。


@ rudtek ...谢谢。在我自己的CPT中,我避免了设置菜单位置,而宁愿使用菜单重新排序,因此“将所有内容都放在同一位置”并且以后更容易更改。没有我要为其设置菜单位置的插件,它用于第三方插件-对于它们,我对“可插拔”或编辑其调用的了解不多(可能会在更新时被覆盖)。
glvr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.