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 en el menú Admin.

Una de las taxonomías es Estado, que es 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 del menú Trabajos activos está activa. Ver captura de pantalla

ejemplo de visualización de submenú

Leí en este artículo Clase actual en el menú de administración usando add_submenu_page () para no incluir la babosa principal como primer parámetro. No sé cómo hacer que el submenú aparezca en la sección de navegación correcta cuando elimino la babosa del 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 predeterminada del submenú Trabajos, excepto con parámetros de consulta que filtran las publicaciones que se muestran. 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 de edición de tipo de publicación personalizada estándar, solo con un filtro de taxonomía en su lugar. gracias por la ayuda

stvwlf
fuente
Me interesaría saber qué soluciones surgen para esto, ya que parece bastante difícil de hacer. La forma de 'WordPress' sería agregar un menú de filtro desplegable como se muestra en la captura de pantalla.
Stephen Harris
Tienes un error en la url 'edit.php?&post_type=jobs&jobstatus=67' ... que primero &no debería estar allí, siguiendo el ?...
Mark Duncan
Mark: tienes razón, y lo he cambiado en el código de la publicación anterior y en el sitio en vivo. Sin embargo, eso no resuelve el problema. Gracias por señalar eso.
stvwlf

Respuestas:

5

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

Este es el resultado:
elemento de submenú de borradores adicionales

add_action( 'admin_menu', 'wpse_44270_menu_admin' );
add_action( 'admin_head-edit.php', 'wpse_44270_highlight_menu_item' );

function wpse_44270_menu_admin() 
{
    add_submenu_page(
        'edit.php',
        'Drafts', 
        '<span id="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
    }
}
brasofilo
fuente
5

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

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

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

Es solo un filtro en la variable global $parent_filey no estoy seguro de lo que hace, pero en su lugar utilizaremos este filtro para alterar la variable global $submenu_file, que establece el submenú resaltado. Entonces esta será la solución en su 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;
}

Puede adaptar esto con cualquier formato de URL. Por ejemplo, utilizo el formato admin.php?page=my_plugin_slug&action=myactionpara los submenús de mis complementos, así que utilicé esto 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: Yo también trató la acción admin_menude conjunto $submenu_file, y lo hizo el trabajo en mi caso (plug-in página personalizada / babosa), pero no para los edit.phpsubmenús (su caso). Así que busqué otra acción / filtro que se ejecute más tarde y fue el filtro parent_file.

Parham
fuente
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'
);

podría intentar cambiar el ampersand a su equivalente de entidad html

&amp;

entonces tendrías

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

esto funcionó para mí ... también probé la cadena de salida para el submenú y el menú principal y verifiqué si coinciden. esta puede ser una pequeña función de utilidad para verificar esto

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;
}
Mujnoi Gyula Tamas
fuente