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

时间:2017-08-08 作者:glvr

阅读了两个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添加的项目上方,另一个显示在下方,因此最好对它们进行相应的重新排序,并且能够更好地重新排序不强制菜单位置而显示在底部的项目。

我发现它通常可以很好地重新排序默认值和“编辑”。php?post\\u类型=…\'项目,但带有“admin”的项目。php?页码=…\'不要重新订购。

当我的重新订购功能被禁用时,两个WooCommerce项目(“edit.php?post\\u type=product”和“edit.php?post\\u type=shop\\u order”)按预期组合在一起,但当该功能被重新激活时,它们会被ContactForm7(“admin.php?page=wpcf7”)拆分。

而且,WooCommerce CPT中的一个(\'edit.php?post\\u type=shop\\u order\')不会重新订购,而另一个(\'edit.php?post\\u type=product\')会重新订购。

4 个回复
最合适的回答,由SO网友:Frank P. Walentynowicz 整理而成

要更改顶级管理菜单项的顺序,您需要两个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 );
上面返回的顶级管理菜单项数组表示core按默认顺序插入的菜单项。要包含插件添加的菜单项,我们必须将它们添加到此数组中。假设我们添加并激活了两个插件(例如: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
);
现在,我们可以上下移动此阵列的项目,以获得最终订单。

Note: 您可以使用Admin Menu Editor 插件,便于拖放操作。

SO网友:rassoh

现有答案很好,但如果要添加新的自定义帖子类型,则必须反复重新编辑这些函数。

为了解决这个问题,我开发了这个小函数。只需定义$new_positions 内部my_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;
};

SO网友:rudtek

使用register\\u post\\u type()创建帖子类型时,可以设置菜单位置:

menu\\u position(integer)(可选)post类型在菜单顺序中的位置。show\\u in\\u 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
如果项目具有相同的菜单位置,则按字母顺序排序。

您可以在自己的插件中设置级别。如果您试图更改尚未创建的插件的菜单位置,许多插件可能具有可插入性,或者您可以编辑其调用。

SO网友:eCommerce Phil

感谢rassoh提供了一个不错的选择。

这是一个修订版,其中包含一个页面列表,可能应该始终保持在顶部。。。

/**
 * These 2 filters and 1 function move the built in WordPress admin pages to
 * the top so they don\'t get pushed down the menu every time a new plugin is installed.
 * 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(
    \'index.php\' => 1,  // Dashboard
    \'edit.php\' => 2,  // Posts
    \'upload.php\' => 3,  // Media
    \'edit.php?post_type=page\' => 4,  // Pages
    \'edit-comments.php\' => 5  // Comments
  );
  // 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;
};

结束

相关推荐

如何301重定向到子目录但保持对主域wp-admin访问

我想将主域重定向到一个子目录,但要在主域的后端继续工作。我想编辑我的。htaccess文件。因此:实例com公司应重定向到301实例com/子目录但请以我的访问权限为例。com/wp管理并继续在后端工作,而不被重定向如何修复此问题?