将分隔符添加到管理菜单?


Answers:


33

这是一种获取所需内容的快捷方法。

背景

WordPress将管理菜单部分存储在名为的全局数组中$menu。要添加分隔符,请$menu使用要分隔的选项的索引之间的索引将元素添加到数组。

使用add_admin_menu_separator()功能

因此,我编写了一个函数来封装我称之为的逻辑add_admin_menu_separator()。你需要选择一个数组索引号比选择高之后,要添加一个分隔符,然后调用函数add_admin_menu_separator()的让所述指数作为参数。

例如:

add_admin_menu_separator(37);

add_admin_menu_separator()函数本身

这是add_admin_menu_separator()可以复制到主题functions.php文件中的函数的定义。是的,这是奥秘的,但是创建和使用全局$menu数组的代码也是如此。(谢天谢地,计划最终弃用它,但这可能需要几年时间。)

function add_admin_menu_separator($position) {
  global $menu;
  $index = 0;
  foreach($menu as $offset => $section) {
    if (substr($section[2],0,9)=='separator')
      $index++;
    if ($offset>=$position) {
      $menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
      break;
    }
  }
  ksort( $menu );
}

找到$menu您需要的索引

找出你需要,你可以做一个什么指数var_dump()$GLOBALS['menu']由内admin_init钩。这是一些代码,您可以functions.php暂时将它们放入主题文件中,以查看值是什么。这仅在请求以以下内容开头的URL时才有效/wp-admin/ (但请确保与FTP关联,而不与内置主题编辑器关联,否则,您将失去对站点的访问权限,至少直到获得对主题functions.php文件的FTP访问权限为止!)

add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
  if (is_admin()) {
    header('Content-Type:text/plain');
    var_dump($GLOBALS['menu']);
    exit;
  }
}

也可以看看:

顺便说一句,您可能会发现这些链接通常对于使用管理菜单很有用:

尽管我的管理菜单类目前尚不提供添加分隔符的简便方法,但我认为我现在有空时会添加分隔符。


谢谢迈克,我整夜都在研究全局var菜单,但是我没有设法添加分隔符,现在对我来说,菜单在wp中的工作方式更加清晰了。
user1147 2010年

@ user1147,您好:是的,很难弄清楚。当我第一次需要它时,我花了很多时间,但我仍在与他们斗争。因此,为什么要编写这些函数,所以从现在开始我可以通过简单的方法来完成它!无论如何,很高兴我的回答有所帮助。
MikeSchinkel

1
@MikeSchinkel此方法不适用于Wordpress 3.3.1。
Jim Geurts 2012年

1
@JimGeurts-这对我也不起作用:/
Evan Mattson

2
我刚刚对其进行了测试,它在4.5中确实可以“运行”,但是WordPress决定摆脱这些限制,因为它们不再出现了。我认为如果要添加CSS的解决方案,但是对我而言,由于我是后端开发人员并且精通CSS,因此我不知道要添加什么CSS。也许其他人可以建议?
MikeSchinkel '16

4

很简单,因为:

add_action( 'admin_init', 'add_sep' );
function add_sep() {

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // that's the default separator
    $pos = 6; // change it for the desired position
    $menu = array_merge(
        array_slice( $menu, 0, $pos ),
        array( $sep ),
        array_slice( $menu, $pos + 1, -1)
    );
    $menu[ $pos - 1 ][4] .= ' menu-top-last';
    $menu[ $pos + 1 ][4] .= ' menu-top-first';

}

注意:默认分隔符位置($menu[4])可能会有所不同,具体取决于您(或您的插件)在执行此挂钩之前所做的配置。

当然,您也可以调整menu-top-firstmenu-top-last类自省。


2

如果没有添加分隔符的一些问题,那是由于wordpress删除重复的分隔符的方式。添加ksort($menu);到函数底部可更正此问题。


1

这建立在MastaBaba的答案上,但不会在您指定的位置替换任何内容-只会在之后添加分隔符。

还使用匿名函数,因此仅与PHP 5.3及更高版本兼容。

add_action( 'admin_menu', function () {
    $position = 29;
    global $menu;
    $separator = [
        0 => '',
        1 => 'read',
        2 => 'separator' . $position,
        3 => '',
        4 => 'wp-menu-separator'
    ];
    if (isset($menu[$position])) {
        $menu = array_splice($menu, $position, 0, $separator);
    } else {
        $menu[$position] = $separator;
    }
});

0

确定您要执行的操作有些困难,但我认为您正在寻找在WordPress管理菜单中添加顶级条目的功能。

请参阅WordPress Codex中的此文档

简而言之,您正在寻找该add_menu_page()函数的用法,该函数需要多个参数,并在管理菜单中显示其他项作为“仪表板”,“帖子”,“媒体”等的同级。

希望我做对了。:-)


我只是想添加一个管理菜单分隔符。在发布我尝试使用的问题之前add_menu_page()
user1147 2010年

看起来MikeSchinkel可以让您很好地覆盖。对不起,误会。祝好运!
dgw

0

以下广告将呈现管理菜单时运行的Wordpress操作。管理菜单是一个数组,您要做的就是在您指定的位置添加一个定义分隔符的数组元素。

这里

add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0   =>  '',
1   =>  'read',
2   =>  'separator' . $position,
3   =>  '',
4   =>  'wp-menu-separator'
);
}

请注意,尽管这与当前接受的答案很像,但是当前接受的答案对我不起作用(从评论中可以看出,对于其他几个答案)。


现有的已接受答案没有任何区别,只不过您没有给出任何解释。请阅读“ 如何回答”
fuxia

@toscho:嗯,这对我有用,但被接受的答案无效。
MastaBaba '16
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.