Obtener un elemento de submenú de administrador personalizado para resaltar cuando esté activo

9

Tengo un tipo de publicación personalizada, Trabajos, con 3 taxonomías debajo de él en el menú Administración.

Una de las taxonomías es el estado, que está activo o cerrado. Quiero un elemento de menú en Trabajos para trabajos activos. Lo creé con este código

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

Esto funciona perfectamente, excepto que el elemento del menú Trabajos permanece resaltado cuando la opción de menú Trabajos activos está activa. Ver captura de pantalla

Leíenesteartículo Clase actual en el menú de administración usando add_submenu_page () para no incluir el slug padre como primer parámetro. No sé cómo hacer que el submenú aparezca en la sección de navegación correcta cuando elimino la barra de nombre de archivo.

En este momento no estoy usando una función de devolución de llamada, simplemente estoy ejecutando la misma URL que la opción de submenú de trabajos predeterminada, excepto con los parámetros de consulta que filtran las publicaciones mostradas. Si mover esto a una función de devolución de llamada resolverá el problema, puedo hacerlo. Pero no sé qué debería ir en la función de devolución de llamada. Quiero mostrar la página estándar de edición de publicación personalizada, solo con un filtro de taxonomía en su lugar. gracias por la asistencia

    
pregunta stvwlf 02.03.2012 - 23:07

3 respuestas

5

Hice este trabajo utilizando los menús de Publicaciones y el estado de Borrador. Se basa en jQuery para modificar las clases de elementos de la lista. Adáptate para trabajar con tu tipo de publicación y URL.

Este es el resultado:

add_action('admin_menu','wpse_44270_menu_admin');add_action('admin_head-edit.php','wpse_44270_highlight_menu_item');functionwpse_44270_menu_admin(){add_submenu_page('edit.php','Drafts','<spanid="my-draft-posts">Drafts</span>', 
        'edit_pages', 
        'edit.php?post_status=draft&post_type=post'
    );
}

function wpse_44270_highlight_menu_item()
{
    global $current_screen;

    // Not our post type, exit earlier
    if( 'post' != $current_screen->post_type )
        return;

    if( isset( $_GET['post_status'] ) && 'draft' == $_GET['post_status'] )
    {       
        ?>
        <script type="text/javascript">
            jQuery(document).ready( function($) 
            {
                var reference = $('#my-draft-posts').parent().parent();

                // add highlighting to our custom submenu
                reference.addClass('current');

                //remove higlighting from the default menu
                reference.parent().find('li:first').removeClass('current');             
            });     
        </script>
        <?php
    }
}
    
respondido por el brasofilo 08.12.2012 - 22:24
3

Aquí hay una solución que se me ocurrió y que no usa jQuery:

Hay un filtro parent_file en wp-admin/menu-header.php que se ejecuta justo antes de mostrar el menú. El comentario en línea dice:

  

Para que los complementos muevan las pestañas de los submenús.

Es solo un filtro en la variable global $parent_file y no estoy seguro de lo que hace, pero usaremos este filtro para alterar la variable global $submenu_file en su lugar, que establece el submenú resaltado. Así que esta será la solución en tu caso:

add_filter('parent_file', 'wpse44270_parent_file');

function wpse44270_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET['jobstatus']) && $_GET['jobstatus'] == 67) $submenu_file = 'edit.php?post_type=jobs&jobstatus=67';

    return $parent_file;
}

Puedes adaptar esto con cualquier formato de URL. Por ejemplo, uso el formato admin.php?page=my_plugin_slug&action=myaction para los submenús de mis complementos, así que lo usé para resaltar mis submenús:

add_filter('parent_file', 'wpse44270_1_parent_file');

function wpse44270_1_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET['page']) && isset($_GET['action'])) $submenu_file = $_GET['page'] . '&action=' . $_GET['action'];

    return $parent_file;
}

PS: También probé la acción admin_menu para configurar $submenu_file , y funcionó en mi caso (página de plugin personalizado / slug) pero no para los submenús edit.php (su caso). Así que busqué otra acción / filtro que se ejecute más tarde y fue el filtro parent_file .

    
respondido por el Parham 30.01.2014 - 20:58
0

Descubrí que también necesitas usar entidades html para tu enlace. ya que tienes

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

puede intentar cambiar el símbolo y su equivalente de entidad html

&amp;

para que tuvieras

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&amp;jobstatus=67'
);

esto me funcionó ... también probé la cadena de salida para el submenú y el menú principal y verifiqué si coinciden. Esto puede ser una pequeña función de utilidad para revisar estas cosas

add_filter( 'parent_file', 'test_taxonomy_highlight' );
function test_taxonomy_highlight( $parent_file ){
   global $submenu_file;
   echo '<pre>', var_dump( $submenu_file, htmlentities( $submenu_file ) ), '</pre>';
   echo '<pre>', var_dump( $parent_file, htmlentities( $parent_file ) ), '</pre>';
   return $parent_file;
}
    
respondido por el Mujnoi Gyula Tamas 03.04.2015 - 12:34

Lea otras preguntas en las etiquetas