Obtention d'un élément de sous-menu d'administration personnalisé pour le mettre en surbrillance lorsqu'il est actif


9

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

L'une des taxonomies est le statut, qui est soit actif, soit fermé. Je veux un élément de menu sous Travaux pour les travaux 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 capture d'écran

exemple d'affichage de sous-menu

J'ai lu dans cet article la classe actuelle dans le menu admin en utilisant add_submenu_page () pour ne pas inclure le slug parent comme premier paramètre. Je ne sais pas comment faire apparaître le sous-menu dans la bonne section de navigation lorsque je supprime le slug du nom de 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, sauf avec les paramètres de requête qui filtrent les messages affichés. Si le déplacer dans une fonction de rappel résout le problème, je peux le faire. Mais je ne sais pas ce qui devrait aller dans la fonction de rappel. Je veux afficher la page d'édition de type de publication personnalisée standard, juste avec un filtre de taxonomie en place. merci pour l'aide


Je serais intéressé de savoir quelles solutions sont proposées pour cela, car cela semble assez difficile à faire. La manière 'WordPress' serait d'ajouter un menu de filtre déroulant comme indiqué dans votre capture d'écran.
Stephen Harris

Vous avez une erreur dans l'url 'edit.php?&post_type=jobs&jobstatus=67' ... cela &ne devrait pas être le premier , après le ?..
Mark Duncan

Mark - vous avez raison, et j'ai changé cela dans le code dans le post ci-dessus et sur le site en direct. Cependant, cela ne résout pas le problème. Merci d'avoir fait remarquer cela.
stvwlf

Réponses:


5

J'ai fait ce travail en utilisant les menus Posts et le statut Draft. Il s'appuie sur jQuery pour modifier les classes d'éléments de liste. Adaptez-vous à votre type de publication et à vos URL.

Voici le résultat:
élément de sous-menu brouillons supplémentaires

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

Voici une solution que je viens de trouver qui n'utilise pas jQuery:

Il y a un filtre parent_filedans wp-admin/menu-header.phplequel passe juste avant la sortie du menu. Le commentaire en ligne dit:

Pour les plugins pour déplacer les onglets de sous-menu.

C'est juste un filtre sur la variable globale $parent_fileet je ne sais pas ce qu'il fait, mais nous utiliserons ce filtre pour modifier la variable globale à la $submenu_fileplace, ce qui définit le sous-menu en surbrillance. Ce sera donc 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 format d'URL. Par exemple, j'utilise le format admin.php?page=my_plugin_slug&action=myactiondes sous-menus de mes plugins, donc je l'ai 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 également essayé l'action admin_menuà définir $submenu_file, et cela a fonctionné dans mon cas (page de plugin personnalisé / slug) mais pas pour les edit.phpsous-menus (votre cas). J'ai donc cherché une autre action / filtre qui s'exécute plus tard et c'était le filtre parent_file.


0

j'ai découvert que vous devez également utiliser des entités html pour votre lien. puisque 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;

vous auriez donc

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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.