web-dev-qa-db-fra.com

Obtenir l’élément de sous-menu personnalisé de l’administrateur à mettre en évidence quand il est actif

J'ai un type de message personnalisé, Jobs, avec 3 taxonomies dans le menu Admin.

L'une des taxonomies est Statut, qui est soit actif, soit fermé. Je veux un élément de menu sous Emplois pour les emplois actifs. Je l'ai créé avec ce code

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

Cela fonctionne parfaitement, sauf que l'élément de menu Travaux reste en surbrillance lorsque l'option de menu Travaux actifs est active. Voir la capture d'écran

example of submenu display

J'ai lu dans cet article La classe actuelle dans le menu administrateur utilisant add_submenu_page () pour ne pas inclure le slug parent en tant que premier paramètre. Je ne sais pas comment faire en sorte que le sous-menu apparaisse dans la bonne section de navigation lorsque je supprime le nom du fichier.

À ce stade, je n'utilise pas de fonction de rappel, j'exécute simplement la même URL que l'option de sous-menu Travaux par défaut, à l'exception des paramètres de requête qui filtrent les publications affichées. Si le déplacer dans une fonction de rappel résoudra le problème, je peux le faire. Mais je ne sais pas ce qui devrait aller dans la fonction de rappel. Je souhaite afficher la page d'édition de type d'article personnalisé standard, avec simplement un filtre de taxonomie en place. merci pour l'aide

9
stvwlf

J'ai réalisé ce travail en utilisant les menus Posts et le statut Draft. Il repose sur jQuery pour modifier les classes d'éléments de liste. Adaptez-vous pour travailler avec votre type de message et vos URL.

Voici le résultat:
extra drafts submenu item

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
    }
}
5
brasofilo

Voici une solution que je viens de proposer et qui n’utilise pas jQuery:

Il existe un filtre parent_file dans wp-admin/menu-header.php qui s'exécute juste avant d'afficher le menu. Le commentaire en ligne dit:

Pour que les plugins déplacent les onglets de sous-menu.

C'est juste un filtre sur la variable globale $parent_file et je ne suis pas sûr de ce qu'il fait, mais nous allons utiliser ce filtre pour modifier la variable globale $submenu_file, qui définit le sous-menu en surbrillance. Donc ce sera la solution dans votre cas:

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;
}

Vous pouvez l'adapter à n'importe quel formatage d'URL. Par exemple, j'utilise le format admin.php?page=my_plugin_slug&action=myaction pour les sous-menus de mes plugins, je l'ai donc utilisé pour mettre en surbrillance mes sous-menus:

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: J'ai aussi essayé l'action admin_menu pour définir $submenu_file, et cela a fonctionné dans mon cas (page de plugin personnalisée/slug), mais pas pour les sous-menus edit.php (votre cas). J'ai donc cherché une autre action/filtre qui s'exécute plus tard et c'était le filtre parent_file.

3
Parham

j'ai découvert que vous devez également utiliser des entités HTML pour votre lien. depuis que tu as

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

vous pouvez essayer de changer l'esperluette en son équivalent d'entité html

&amp;

donc vous auriez

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

cela a fonctionné pour moi ... j'ai également testé la chaîne de sortie pour le sous-menu et le menu parent et vérifié si elles correspondent. cela peut être une petite fonction utilitaire pour vérifier ce genre de choses

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;
}
0