Reorder custom submenu item

时间:2016-09-19 作者:Ethan O\'Sullivan

在设置菜单中,我列出了以下菜单项:

Settings
-- General
-- Writing
-- Reading
-- Discussion
-- Media
-- Permalinks
-- Blogging
我想写博客(options-general.php?page=blogging) 在“常规”下方重新排序,而不是在底部。这是与add_options_page() 作用

通过一些研究,我得出以下结论:

add_filter( \'custom_menu_order\', array( $this, \'submenu_order\' ) );
function submenu_order( $menu_order ) {
    global $submenu;
    $order = array();
    $order[] = $submenu[\'options-general.php\'][10];
    $order[] = $submenu[\'options-general.php\'][41];
    $submenu[\'options-general.php\'] = $order;
    return $menu_order;
}
这是可行的,但它只显示常规和博客,其余的都被删除了:

Settings
-- General
-- Blogging
此外,$submenu[\'options-general.php\'][41] 当前是索引位置41 对我来说。这是否意味着其他所有人的索引位置都相同,即使他们列出了其他插件设置?

2 个回复
最合适的回答,由SO网友:Ethan O\'Sullivan 整理而成

知道了,多亏了cjbj\'在s的帮助下,我得到了最终的解决方案:

add_filter( \'custom_menu_order\', \'submenu_order\' );
function submenu_order( $menu_order ) {
    # Get submenu key location based on slug
    global $submenu;
    $settings = $submenu[\'options-general.php\'];
    foreach ( $settings as $key => $details ) {
        if ( $details[2] == \'blogging\' ) {
            $index = $key;
        }
    }
    # Set the \'Blogging\' menu below \'General\'
    $submenu[\'options-general.php\'][11] = $submenu[\'options-general.php\'][$index];
    unset( $submenu[\'options-general.php\'][$index] );
    # Reorder the menu based on the keys in ascending order
    ksort( $submenu[\'options-general.php\'] );
    # Return the new submenu order
    return $menu_order;
}

SO网友:cjbj

您得到的结果并不奇怪,因为您直接操作了一个全局变量。您正在替换$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是一个未使用的偏移量。