Resalte manualmente el elemento del menú de administración de WordPress

5 minutos de lectura

En el menú Páginas en la página de administración de WordPress, obtuve este diseño:

Paginas

  • Editar (url: edit-pages.php)
  • Agregar nuevo (url: página-nueva.php)
  • Páginas especiales (url: edit-pages.php?special-pages=true)

como puede ver, he agregado un nuevo elemento de submenú llamado Páginas especiales que es más o menos un enlace a la página Editar con filtro personalizado. Debido a que WordPress usa el nombre del archivo para identificar y resaltar el elemento del submenú, cada vez que hago clic en Páginas especiales, se selecciona el elemento del submenú Editar. ¿Hay alguna forma de obligar a WordPress a seleccionar el elemento de menú Páginas especiales en su lugar?

Salud

mejor solución:

add_filter('parent_file', 'my_plugin_select_submenu');
function my_plugin_select_submenu($file) {
        global $plugin_page;
        if ('__my-current-submenu-slug__' == $plugin_page) {
            $plugin_page="__my-submenu-slug-to-select__";
        }
        return $file;
}

  • En mi caso, estaba enlazando a la página de administración de taxonomía del administrador, la taxonomía no estaba adjunta a ningún tipo de publicación. tu código funcionó perfectamente. gracias.

    – wesamly

    13 de enero de 2016 a las 14:45

Para aclarar aún más la respuesta de Ken Vu, edite las variables globales $submenu_file y $parent_file. Por ejemplo, para resaltar su página:

global $submenu_file;
$submenu_file = "edit-pages.php?special-pages=true";

Si necesita cambiar el elemento de nivel superior resaltado, utilice $parent_file. Por ejemplo, resalte la página de configuración “Escritura”:

global $parent_file;
global $submenu_file;
$parent_file="options-general.php";
$submenu_file="options-writing.php";

  • ¿Me puede decir dónde colocar estos códigos idealmente? No pude hacerlos funcionar.

    – Musa Haidari

    5 de mayo de 2014 a las 7:20


  • Traté de implementar esto dentro de la función callaback del add_meta_boxes(), pero no resalta mi menú de administración de nivel superior. Puedo agregar que no tengo ningún submenú, solo un menú de administración de nivel superior.

    – Alexandre Bourlier

    18 de agosto de 2014 a las 14:20

  • Conseguí que funcionara correctamente. Escribiré otra respuesta para que otras personas puedan encontrarla más fácilmente.

    – Alexandre Bourlier

    18 de agosto de 2014 a las 14:39

Solución: utilice la variable $submenu_file

$submenu_file = “editar-pages.php?special-pages=true”

  • ¿Puedes publicar por favor un ejemplo de cómo usarlo? no puedo hacerlo funcionar

    – bluantinoo

    6 oct 2011 a las 16:41


Gracias Ken Vu y Jonathan Brinley. Usando sus respuestas, finalmente conseguí que el resaltado de mi menú de administración funcionara correctamente. Como luché un poco para que funcionara, pensé en publicar el resultado completo aquí, para que otras personas puedan encontrarlo más fácilmente:

La idea es llamar al parent_file filtro (indocumentado, como muchas partes de WordPress desafortunadamente). En mi caso, estaba agregando un menú personalizado en lugar del predeterminado generado al crear un tipo de publicación personalizada.

En mi código postal personalizado, llamo al add_meta_boxes acción. Dentro de este gancho, emito mi llamado a la parent_file filtro:

add_filter('parent_file',     array(&$this, 'highlight_admin_menu'));

_

Entonces así es como mi hightlight_admin_menu la función se parece a:

function highlight_admin_menu($some_slug){

  global $parent_file;

  $parent_file="post.php?post=149&action=edit";

  return $parent_file;
}

_

Esto hizo que mi menú se resaltara correctamente. Intente jugar con su propio código para saber dónde emitir el add_filter('parent_file', ...) código. Encuentre un poco de código ejecutado solo en esa carga de página en particular, pero lo suficientemente pronto como para que aún sea posible modificar el $parent_file variable.

¡Espero que esto ayude!

Para cambiar el elemento de menú resaltado por un elemento de submenú, el filtro adecuado es submenu_file.

add_filter('submenu_file', 'menuBold');

static function menuBold($submenu_file)
{
    if ( checkProperPage($_GET) ) {
        // The address of the link to be highlighted
        return 'post-new?post_type=foobar&foo=bar';
    }

    // Don't change anything
    return $submenu_file;
}

El cheque ocurre en WP’s ~/wp-admin/menu-header.php archivo en la línea 194 (WordPress 4.5.3):

if ( isset( $submenu_file ) ) {
    if ( $submenu_file == $sub_item[2] )
        $class[] = 'current';
...
}

avatar de usuario
Sajidur Rahman

Puede modificar este código para que funcione para usted. Puede cambiar tanto el menú principal como el submenú con eso. Código probado.

function change_active_parent($submenu_file)
{ 
    global $parent_file;

    $zone="edit-tags.php?taxonomy=zone&post_type=product";
    $storefront="edit-tags.php?taxonomy=storefront&post_type=product";
    $container="edit-tags.php?taxonomy=container&post_type=product";
    
    if (esc_html($zone) == $submenu_file) {
        $parent_file="parent";
        $submenu_file = $zone;
    }
    elseif (esc_html($storefront) == $submenu_file) {
        $parent_file="parent";
        $submenu_file = $storefront;
    }
    elseif (esc_html($container) == $submenu_file) {
        $parent_file="parent";
        $submenu_file = $container;
    }
    
    return $submenu_file;
}

add_filter( 'submenu_file', 'change_active_parent' );

avatar de usuario
muerte 1305

Utilizar el load-{$page_hook} gancho de acción y modificar los globales necesarios:

/**
 *  For giggles, lets make an admin page that is not "in the menu" to play with.
 */
add_action('admin_menu', 'mort1305_admin_menu');
function mort1305_admin_menu() {
    add_submenu_page(
        NULL,
        'Page Title',
        '',
        'administrator',
        'my_slug',
        'mort1305_page_content'
    );
}

/**
 *  The menu item to highlight and the submenu item to embolden.
 */
add_action('load-admin_page_my_slug', 'mort1305_on_page_load');
function mort1305_on_page_load(){
    global $plugin_file, $submenu_file, $title;
    $plugin_page="slug-of-menu-item-to-be-highlighted";
    $submenu_file="slug-of-submenu-item-to-be-bold";
    foreach($submenu[NULL] as $submenu_arr) {
        if($submenu_arr[2] === 'test_page_slug') {
            $title = $submenu_arr[3];
            break;
        }
    }
}

/**
 *  Page content to display.
 */
function mort_1305_page_content() {
    echo This is the '. get_admin_page_title() .' page.  The slug of my parent is '. get_admin_page_parent() .'.';
}

¿Ha sido útil esta solución?