您得到的结果并不奇怪,因为您直接操作了一个全局变量。您正在替换$submenu
仅带有键10和41的项目。如果要遵循此方法,则需要这样做(假设键11中没有任何内容):
$submenu[\'options-general.php\'][11] = $submenu[\'options-general.php\'][41];
unset ($submenu[\'options-general.php\'][41]);
但是,请注意,您没有以任何方式使用过滤器功能。没有发生任何事情
$menu_order
您正在通过过滤器。所以,这不是一个非常干净的解决方案。
正如你所看到的,add_submenu_page
只需按照调用函数的顺序在数组末尾添加一个子菜单。该行:
$submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title );
如果一个新插件调用
add_submenu_page
在此之前,41的键很可能是另一个键。要防止这种情况,您必须循环
$submenu
找到正确的钥匙。快速脏版:
for ( $i = 1; $i <= 100; $i++ ) {
if ( array_key_exists( $submenu[\'options-general.php\'][$i] ) ) {
if ( $submenu[\'options-general.php\'][$i][2] == \'my-custom-slug\' ) {
$the_desired_key = $i;
// [2] because that is the index of the slug in the submenu item array above
}
}
}
UPDATE
后一个循环的更好版本:
$sub = $submenu[\'options-general.php\'];
foreach ( $sub as $key => $details ) {
if ( $details[2] == \'my-custom-slug\' ) {
$the_desired_key = $key;
}
}
查找后
$the_desired_key
这样,您就可以安全地使用上面的set+unset方法。我已经验证了11是一个未使用的偏移量。