Conectar a add_submenu_page

2

¿Alguna vez te has encontrado con un complemento que usa la capacidad manage_options para una página que ... realmente no necesita ser? Bueno, me he topado con eso.

Esto puede ser más una pregunta general acerca de enganchar en add_submenu_page , así que no solo específico para mi caso de uso.

Observé add_dashboard_page , que es simplemente un contenedor para 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;
}

Honestamente, no parece que haya algo que pueda conectar con una página del panel de control existente para cambiar la capacidad. Así que estoy tratando de decidir si es mejor usar remove_submenu_page y luego intentar volver a declarar ese mismo submenú. Sé que habrá cosas que debo tener en cuenta (si la función de visualización utilizada para la página tiene algo que también comprueba la capacidad o muestra algo vital para el sitio). Siempre es útil tener un segundo par de ojos en estos para que no complique más las cosas. ¡Gracias a todos!

Actualizar

Gracias a ambos, @toscho y @userabuser, esto es lo que obtuve:

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 ejecuto la capacidad de 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 the analytics_360 '(usé el complemento Miembros para crear). Posiblemente disparar demasiado tarde? Definitivamente un poco extraño. Gracias como siempre!

El código de Actualizar funciona para cualquier persona que se encuentre con esto. Fue un cheque innecesario alrededor de add_dashboard_page() que me dio el problema.

    
pregunta Zach 02.11.2012 - 14:40

1 respuesta

4

Enganche a admin_head , la última acción antes de que se muestre el menú, y cambia el $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';
        }
    }
}
    
respondido por el fuxia 02.11.2012 - 15:18

Lea otras preguntas en las etiquetas