如何创建带有URL参数的子菜单?

时间:2013-09-19 作者:user1452062

我想为子菜单添加参数,但当我单击管理页面时,我收到以下消息:

您没有足够的权限访问此页面。

Code:

add_submenu_page(  
\'sandbox\',                  
\'Sandbox Options\',          
\'Options\',                  
\'administrator\',            
\'sandbox_options&tab=4\',    
\'sandbox_options_display\'
); 
不带(&e);tab=4一切正常。

3 个回复
最合适的回答,由SO网友:brasofilo 整理而成

你必须操纵全局$submenu 并修改其中的链接。或者使用jQuery。

以下示例在仪表板菜单中添加了一个子菜单,并在其后更改了目标链接。子菜单页将转储全局变量的内容。

add_action( \'admin_menu\', function()
{
    add_submenu_page(  
        \'index.php\',                  
        \'Sandbox Options\',          
        \'Options\',                  
        \'administrator\',            
        \'sandbox_options\',    
        function() { global $submenu; var_dump($submenu); }
    );
    global $submenu; 
    $submenu[\'index.php\'][11][2] = \'index.php?page=sandbox_options&tab=3\';
});
[更新]

给出的示例,Redux Framework, 使用以下技术:

添加带有slug的菜单页example_slug.

添加子菜单页并使用相同的slugexample_slug + &tab=N.

所有菜单和子菜单页面都使用menu 回调。子菜单具有null 回调。

示例:

add_submenu_page(  
    \'sandbox\',                  
    \'Sandbox Options\',          
    \'Options\',                  
    \'add_users\',            
    \'sandbox&tab=4\',    
    \'__return_null\'
); 

SO网友:Dan Ștefancu

基本上,您需要重建url,因为plugin_basename 使用查询参数注册页面后,将删除额外的查询参数。

完整(工作/测试)解决方案如下:

define( \'PARENT_SLUG\', \'index.php\' ); // where to put the submenu
define( \'PAGE_SLUG\', \'wp190913_options\' ); // submenu slug
define( \'EXTRA_ARG\', \'tab\' );
define( \'EXTRA_ARG_VALUE\', 4 );

add_action( \'admin_menu\', \'wp190913_add_page\', 11 );
add_action( \'admin_menu\', \'wp190913_add_page_args\', 12 );

/**
 * Register submenu page
 */
function wp190913_add_page() {
    add_submenu_page(
        PARENT_SLUG,
        __(\'wp190913 Options\', \'wp190913_textdomain\' ),
        __(\'wp190913 Options\', \'wp190913_textdomain\'),
        \'manage_options\',
        PAGE_SLUG,
        \'wp190913_display_page\'
    );
}

/**
 * Add extra query arg for submenu page
 */
function wp190913_add_page_args() {
    global $submenu;

    $position = wp190913_search_submenu( PAGE_SLUG, PARENT_SLUG );

    // make sure we modify our page
    if ( is_int($position) && $submenu[PARENT_SLUG][$position][2] == PAGE_SLUG ) {
        // we will recompose the whole url, starting with parent
        $submenu[PARENT_SLUG][$position][2] = add_query_arg( \'page\', PAGE_SLUG, PARENT_SLUG );
        $submenu[PARENT_SLUG][$position][2] = add_query_arg( EXTRA_ARG, EXTRA_ARG_VALUE, $submenu[PARENT_SLUG][$position][2] );
    }

}

/**
 * Find submenu key in it\'s parent array.
 *
 * @param string $page_slug
 * @param string $parent_slug
 *
 * @return null
 */
function wp190913_search_submenu( $page_slug, $parent_slug ) {
    global $submenu;

    if ( !isset( $submenu[$parent_slug] ) )
        return null;

    foreach ( $submenu[$parent_slug] as $i => $item ) {
        if ( $page_slug == $item[2] ) {
            return $i;
        }
    }

    return null;
}

/**
 * Submenu page content.
 */
function wp190913_display_page() {
    // Do stuff

    echo \'wp190913_display_page\';
}

SO网友:Jonas

我是这样解决的:

class Banner{
    
    function __construct(){
        
        add_action(\'admin_menu\', array($this,\'adminmenu\'), 200);
        
    }
    
    function adminmenu(){
        
        add_submenu_page( 
                            \'adrotate\', 
                            \'AdRotate Pro · \' . __(\'Banner Tags\', \'adrotate-pro\'), 
                            __(\'Banner Tags\', \'adrotate-pro\'), 
                            \'adrotate_ad_manage\', 
                            \'adrotate-banner-tags\', 
                            array($this,\'adrotate_banner_tags\')
                    );
    }
    
    function adrotate_banner_tags(){
        
        wp_safe_redirect(admin_url(\'/edit-tags.php?taxonomy=\' . TAX_TAGS));
        exit;
        
    }
}
new Banner();

结束

相关推荐

WordPress子域wp-admin重定向到主域

我们在地址www.example上安装了wordpress。com。我们希望有一个作为子域的开发站点,所以我们创建了一个子域dev.example。cpanel上的com。创建了其数据库的副本,并将文件复制到dev.example的根目录中。com。然后修改wp配置。php指向重复的db。现在的问题是,当我们尝试访问dev.example时。com/wp管理员,它重定向到https://www.example.com/wp-login.php?redirect_to=https%3A%2F%2Fdev.e