使用MENU_POSITION在POST菜单上放置自定义POST类型菜单?

时间:2011-02-07 作者:janoChen

我刚刚发现menu_position parameter 看起来你几乎可以在任何地方放置自定义帖子类型的菜单。除了Posts菜单上方!

我如何才能做到这一点?

10 个回复
SO网友:Michael Ecklund

Positions for Core Menu Items

  • 2个仪表板
  • 4个分隔符
  • 5个帖子
  • 10个媒体
  • 15个链接
  • 20页
  • 25条评论
  • 59个分隔符
  • 60个外观
  • 65个插件
  • 70个用户
  • 75个工具
  • 80个设置
  • 99个分隔符

    Parameter description for "menu position"

    $position (integer) (可选)菜单顺序中的位置此菜单应显示。默认情况下,如果省略此参数,菜单将显示在菜单结构的底部。数字越大,其在菜单中的位置越低。

    WARNING: 如果两个菜单项使用相同的位置属性,其中一个菜单项可能会被覆盖,从而只显示一个菜单项!使用十进制而不是整数值可以减少冲突风险,例如63.3而不是63。

    默认:菜单结构的底部

SO网友:Chip Bennett

新的JetPack插件将其菜单链接放在仪表板链接的正下方。它是通过setting its menu order to 0, by filtering the $menu_order array:

function jetpack_menu_order( $menu_order ) {
        $jp_menu_order = array();

        foreach ( $menu_order as $index => $item ) {
            if ( $item != \'jetpack\' )
                $jp_menu_order[] = $item;

            if ( $index == 0 )
                $jp_menu_order[] = \'jetpack\';
        }

        return $jp_menu_order;
    }
出于好奇,如果您尝试将0作为menu\\u位置,会发生什么?

SO网友:Nolan Crochot

正在网上寻找解决方案,但没有找到。简单地做到这一点(例如)。这里有本地职位列表:

如果您有更多项目,请访问2个仪表板4个分隔符5个帖子10个媒体15个链接20个页面25个评论59个分隔符60个外观65个插件70个用户75个工具80个设置99个分隔符,通过打印全局$菜单,可以读取每个项目的当前位置:

global $menu; 
print_r($menu); 
因此,如果我能很好地理解,没有什么可以阻止我们按照自己的意愿重新订购菜单:

function re_order_menu () {
    // ------- Put away items 
    $dashboard = $menu[2]
    $separator1 = $menu[4]
    $posts = $menu[5]
    $media = $menu[10]
    $links = $menu[15]
    $pages = $menu[20]
    $comments = $menu[25]
    $separator2 = $menu[59]
    $appearance = $menu[60]
    $plugins = $menu[65]
    $users = $menu[70]
    $tools = $menu[75]
    $settings = $menu[80]
    $separator3 = $menu[99]

    // -------- Reset menu  
    unset($menu[2]);
    unset($menu[4]);
    unset($menu[5]);
    unset($menu[10]);
    unset($menu[15]);
    unset($menu[20]);
    unset($menu[25]);
    unset($menu[59]);
    unset($menu[60]);
    unset($menu[65]);
    unset($menu[70]);
    unset($menu[75]);
    unset($menu[80]);
    unset($menu[99]);

    // -------- Re-order menu as you want
    $dashboard = $menu[2];
    $separator1 = $menu[4]
    $posts = $menu[5];
    $books = $menu[6];
    /* my tons of custom items */
    $authors  = $menu[7];
    $requests = $menu[8];
    $clients = $menu[9];
    $sellers  = $menu[10];
    $services = $menu[11];
    $schedules = $menu[12];
    /* let some space after */ 
    $media = $menu[30];
    $links = $menu[31];
    $pages = $menu[32];
    $comments = $menu[33];
    $separator2 = $menu[59];
    $appearance = $menu[60];
    $plugins = $menu[65];
    $users = $menu[70];
    $tools = $menu[75];
    $settings = $menu[80]
    $separator3 = $menu[99];

} 
add_action(\'admin_menu\', \'re_order_menu\');
这对我来说很好,所以,我认为这是合法的,我错了?

SO网友:jaredwilli

我使用了“menu\\u position”=>0、1、2、3、4。

真的没关系。如果你玩弄它,你很容易就能弄明白。

使用“menu\\u position”(菜单位置)=>1应将其放置在分隔符上方的仪表板菜单项下方。0应将其放置在仪表板上方

SO网友:Merne

这是WordPress中的一个bug。请在Trac中查看此线程:http://core.trac.wordpress.org/ticket/14755

已在4.4中修复。。。

https://developer.wordpress.org/reference/functions/add_menu_page/#notes

SO网友:eduardogoncalves

您可以使用此选项:

function my_move_post () {
    global $menu;
    $menu[6] = $menu[5]; //move post from post 5 to 6
    unset($menu[5]); //free the position 5 so you can use it!
}
add_action(\'admin_menu\', \'my_move_post\');
现在,您可以使用位置5将菜单添加到Post菜单上方。

SO网友:Artistan

这是整个问题的警告。。。

WordPress 4.9.2

wp管理/菜单。php:

// If we\'re to use $_wp_last_object_menu, increment it first.
$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu; 
注意:必须是整数且尚未设置,否则它将位于列表底部。

SO网友:Walf

对于WordPress 5及以下版本中的工作解决方案,请使用以下代码重新定位:

add_filter(\'custom_menu_order\', \'__return_true\');
add_filter(\'menu_order\', function($menu_order) {
    if (
        false !== ($k1 = array_search($v1 = \'edit.php\', $menu_order))
        && false !== ($k2 = array_search($v2 = \'edit.php?post_type=foo\', $menu_order))
    ) {
        array_splice($menu_order, $k1, 0, $v2);
        array_splice($menu_order, $k2 + 1, 1);
    }
    return $menu_order;
});
这假设您没有多个菜单项来竞争极点位置。

SO网友:Zack

在你链接的同一个链接上,它写着:

menu_position
(integer) (optional) The position in the menu order the post type should appear.
Default: null - defaults to below Comments
5 - below Posts
10 - below Media
20 - below Pages
60 - below first separator
100 - below second separator
所以,如果你menu_position 大概是4, 然后它应该把它放在柱子上面。

职位-1 将其置于Dashboard 链接

SO网友:Vladan

可以使用十进制值(作为字符串)。例如,我在菜单的最后一个位置(100001、100002、100003)放置了一些自定义帖子类型。

然后,只需将此代码移动到帖子上方和仪表板下方。

function reorder_admin_menu() {

  global $menu;

  // Add one separator

  $menu["3.1"] = array(
    0 =>  \'\',
    1 =>  \'read\',
    2 =>  \'separator_\' . "anything_unique",
    3 =>  \'\',
    4 =>  \'wp-menu-separator\'
    );

  // I have put my menu items waay at the end (exactly these values), so move them up

  $menu["3.2"] = $menu[100001];
  $menu["3.3"] = $menu[100002];
  $menu["3.4"] = $menu[100003];

  unset($menu[100001]);
  unset($menu[100002]);
  unset($menu[100003]);

  // move Media menu (position 10) item to front, in the same group
  $menu["3.5"] = $menu[10];
  unset($menu[10]);

  // Debug: ksort($menu); error_log( var_export( $menu, true ) );
}

add_action( \'admin_menu\', \'reorder_admin_menu\', 999 );

结束

相关推荐

Creating a custom Admin panel

我正在构建一个Wordpress插件,它有两个表和一些数据。现在,为了显示和更改数据,我正在使用wpdb函数并手动创建用户界面(模仿默认界面)。然而,我看到其他插件与它们的表有着更加一致的风格和相同的特性(比如批量按钮)。我开始怀疑Wordpress的分类法。我读过,但到目前为止,分类法似乎以某种方式与帖子相关。我的数据与帖子无关,完全独立。我还能使用Wordpress分类法吗?分类法可以帮助我构建一致的接口吗?