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
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
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:
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
}
}
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
.
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
&
donc vous auriez
add_submenu_page(
'edit.php?post_type=jobs',
'Active Jobs',
'Active Jobs',
'manage_options',
'edit.php?post_type=jobs&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;
}