web-dev-qa-db-fra.com

Connexion à add_submenu_page

Avez-vous déjà rencontré un plugin utilisant la capacité manage_options pour une page qui ... n'a pas vraiment besoin d'être? Eh bien, je suis juste tombé sur ça.

C’est peut-être davantage une question générale sur l’accrochage dans add_submenu_page, donc pas seulement spécifique à mon cas d’utilisation.

J'ai regardé add_dashboard_page qui est simplement un wrapper pour add_submenu_page:

function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
    global $submenu;
    global $menu;
    global $_wp_real_parent_file;
    global $_wp_submenu_nopriv;
    global $_registered_pages;
    global $_parent_pages;

    $menu_slug = plugin_basename( $menu_slug );
    $parent_slug = plugin_basename( $parent_slug);

    if ( isset( $_wp_real_parent_file[$parent_slug] ) )
        $parent_slug = $_wp_real_parent_file[$parent_slug];

    if ( !current_user_can( $capability ) ) {
        $_wp_submenu_nopriv[$parent_slug][$menu_slug] = true;
        return false;
    }

    // If the parent doesn't already have a submenu, add a link to the parent
    // as the first item in the submenu. If the submenu file is the same as the
    // parent file someone is trying to link back to the parent manually. In
    // this case, don't automatically add a link back to avoid duplication.
    if (!isset( $submenu[$parent_slug] ) && $menu_slug != $parent_slug ) {
        foreach ( (array)$menu as $parent_menu ) {
            if ( $parent_menu[2] == $parent_slug && current_user_can( $parent_menu[1] ) )
                $submenu[$parent_slug][] = $parent_menu;
        }
    }

    $submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title );

    $hookname = get_plugin_page_hookname( $menu_slug, $parent_slug);
    if (!empty ( $function ) && !empty ( $hookname ))
        add_action( $hookname, $function );

    $_registered_pages[$hookname] = true;
    // backwards-compatibility for plugins using add_management page. See wp-admin/admin.php for redirect from edit.php to tools.php
    if ( 'tools.php' == $parent_slug )
        $_registered_pages[get_plugin_page_hookname( $menu_slug, 'edit.php')] = true;

    // No parent as top level
    $_parent_pages[$menu_slug] = $parent_slug;

    return $hookname;
}

Honnêtement, il ne semble pas y avoir quoi que ce soit que je puisse réellement connecter à une page de tableau de bord existante pour modifier la capacité. J'essaie donc de décider s'il vaut mieux utiliser remove_submenu_page puis essayer de redéclarer le même sous-menu. Je sais qu'il y a des choses que je dois surveiller (si la fonction d'affichage utilisée pour la page contient quelque chose qui vérifie en plus la capacité ou affiche quelque chose de vital pour le site). Toujours utile d'avoir une deuxième paire d'yeux pour que je ne complique pas trop les choses. Merci a tous!

Mettre à jour

Merci à @toscho et @userabuser, voici ce que j'ai obtenu:

function wpse_71303_change_menu_cap()
{
    global $submenu;
    foreach ($submenu['index.php'] as $dashboard => $key) {
        if ($key[0] == 'Analytics360°') {
            $submenu['index.php'][$dashboard][1] = 'analytics';
        }
    }
}
add_action( 'admin_head', 'wpse_71303_change_menu_cap' );

Si je lance une capacité print_r($submenu) I do see the new capability - but I still can't access the menu item under the client role I created (with theanalytics_360`) (utilise le plugin Members pour créer). Peut-être tirer trop tard? Certainement un peu étrange. Merci comme toujours!

Le code de Update fonctionne pour tous ceux qui rencontrent cela. C'était une vérification inutile autour de add_dashboard_page() qui me donnait le problème.

2
Zach

Accrochez-vous dans admin_head, dernière action avant le rendu du menu, puis modifiez le $menu global:

add_action( 'admin_head', 'wpse_71303_change_menu_cap' );

/**
 * Change the capability to access an admin menu item.
 *
 * @wp-hook admin_head
 * @return void
 */
function wpse_71303_change_menu_cap()
{
    global $menu;

    foreach ( $menu as $key => $item )
    {
        // Find menu by name
        if ( 'Tools' === $item[0] ) // default cap: 'edit_posts'
        {
            $menu[ $key ][1] = 'new_capability';
        }
    }
}
4
fuxia