web-dev-qa-db-ja.com

URLパラメータでサブメニューを作成する方法

サブメニューのパラメータを追加したいのですが、管理ページをクリックすると、次のメッセージが表示されます。

このページにアクセスするための十分な権限がありません。

コード:

add_submenu_page(  
'sandbox',                  
'Sandbox Options',          
'Options',                  
'administrator',            
'sandbox_options&tab=4',    
'sandbox_options_display'
); 

&tab = 4 がなければ、すべて問題ありません。

2
user1452062

グローバルな$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 の例では、次のテクニックを使用しています。

  • スラッグexample_slugを付けてメニューページを追加します。

  • サブメニューページを追加して、同じスラッグexample_slug + &tab=Nを使用してください。

  • すべてのメニューページとサブメニューページは、 menu コールバックでレンダリングされます。サブメニューにはnullコールバックがあります。

例:

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

私はこのように解決しました:

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));

    }
}
new Banner();
1
Jonas

plugin_basenameは、ページをquery argsで登録した後に余分なquery argsを削除するので、基本的にはURLを再構築する必要があります。

フル(動作中/テスト済み)ソリューションは次のとおりです。

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';
}
1
Dan Ștefancu