web-dev-qa-db-fra.com

Nuance dans l'ajout de CPT et TAX à un sous-menu

J'ai beaucoup de taxes CPT et personnalisées et j'ai décidé de les mettre dans quelques sous-menus. Cela a bien fonctionné. J'expliquerai comment je l'ai fait dans un instant, mais le problème est que, lorsque vous choisissez un "nouveau terme" ou un "nouveau message", le menu de la barre latérale de l'administrateur perd la trace de son appartenance à un sous-menu et ferme le menu. Cela n'a pas d'importance puisque vous pouvez ajouter l'élément, puis rouvrir le menu d'administration, mais c'est un irritant que j'aimerais supprimer.

Pour aider à expliquer mon problème, j'ai inclus quelques captures d'écran. Voici le menu Admin lorsque je l'ouvre dans mon menu/sous-menu de "LG RefData/UOM":

enter image description here

Jusqu'ici, tout va bien. BTW, UOM est un CPT (pas une taxe). Maintenant, si je clique sur le bouton "Ajouter un nouveau" en haut de la page edit.php, la page s'affichera correctement, mais le menu Admin se réduira pour ressembler à ceci:

enter image description here

Voilà donc le problème principal, mais il existe un petit corollaire lié au comportement de TAX. Dans la capture d'écran d'origine, vous avez vu un sous-menu appelé "Contexte UOM" qui est une taxonomie. Par défaut, le fait de cliquer immédiatement sur ce menu ferme le menu Admin, mais j’ai trouvé un moyen de le contourner (plus à ce sujet dans une seconde), mais ma solution laisse le menu ressembler à celui-ci lorsque je clique sur le lien "Contexte UOM":

enter image description here

Notez que même s’il n’est pas réduit, il ne met pas en surbrillance le choix du sous-menu.

Alors laissez-moi vous montrer le code que j’avais l'habitude de configurer (bien qu'il s'agisse probablement d'un code assez standard pour les personnes essayant de le faire). La première chose qui se passe du point de vue de l'exécution est l'enregistrement du CPT et de la taxe. Le truc avec les CPT est d’utiliser le "show_in_menu" et de le configurer avec le nom de la page de menu sous laquelle il sera assis:

        // Default args
        array(
            'label'                 => $plural,
            'labels'                => $labels,
            'public'                => true,
            'show_ui'               => $this->show_menu,
            'show_in_menu'          => $this->show_in_menu,
            'supports'              => array( 'title', 'editor' , 'excerpt'),
            'show_in_nav_menus'     => true,
            'menu_icon'             => LG_FE_DIR . "/img/lg-admin.png",
            'menu_position'         => $this->get_menu_priority(),
            '_builtin'              => false,
        ),

Notez que ceci n'est pas nécessaire pour TAX et que, dans mes expériences, il semble n'avoir aucun effet, je l'ai donc laissé tomber. La deuxième étape est les appels add_menu_page et add_submenu_page:

add_menu_page ("LG Ref Data", "LG Ref Data", "manage_options", LG_REFDATA_MENU, "LG_AdminMenuSystem::show_reference_menu", plugins_url ("/img/LG.png", __DIR__), 61.1);
add_submenu_page (LG_REFDATA_MENU,"UOMs","UOMs","manage_options",'edit.php?post_type=uoms');
add_submenu_page (LG_REFDATA_MENU,"UOM Context","UOM Context","manage_options",'edit-tags.php?taxonomy=uom-contexts&post_type=uoms');
array_Push (self::$tax_correct, "uom-contexts");    

Jolies choses standard à l'exception de la dernière ligne qui est le début de mon correctif fiscal que j'ai mentionné plus tôt (alias, empêche le menu de se réduire lors du choix d'un élément fiscal mais ne l'arrête pas lors de l'ajout d'un nouvel élément). Voici le code actuel du correctif:

static public function tax_menu_correction ($parent_file) {
    global $current_screen;
    $taxonomy = $current_screen->taxonomy;
    if ( in_array($taxonomy,self::$tax_correct) )
        $parent_file = LG_REFDATA_MENU;
    return $parent_file;
}

qui est ensuite appelé à partir du hook suivant:

add_action( 'parent_file' , 'LG_AdminMenuSystem::tax_menu_correction'); // helps to keep the menu selection on the menu when choosing a custom TAX 

Alors c'est tout. toute aide, d'où qu'elle vienne, sera très appréciée.

2
ken

Hmmm. Je ne sais pas ce qui s'est passé ici. J'aurais juré avoir déjà répondu à cette question et l'avoir fermée. En tout état de cause, j'ai utilisé une approche basée sur la suggestion de @ brasofilo. En gros, voici tout ce que vous devez faire:

Dans votre PHP où vous enregistrez le sous-menu, utilisez une déclaration comme celle-ci:

add_submenu_page ( LG_TRANSACTIONAL_MENU,
        $plural ,"<span id='submenu-{$plural}'>" . $plural . "</span>",
        "manage_options",
        "edit.php?post_type={$this->custom_type_slug_name}"
);

Dans mon cas, ce PHP réside dans un plug-in de type post personnalisé que j'ai écrit, donc les noms de variables y sont spécifiques, mais la partie clé est simplement que vous ajoutez un ID DOM que votre jQuery peut utiliser. sélectionnez sur. Dans ce cas, l'ID sera le sous-menu- [nom au pluriel du CPT] .

Le reste est fait avec jQuery:

// If on a custom taxonomy editing page then make sure the menu item is selected
if ( adminpage === "edit-tags-php") {
    $('#submenu-' + pagenow).closest('li').addClass('current');
}
// if on a edit post-type page (post-new.php) then make sure menu is selected, expanded, and the submenu is current
if (adminpage === "post-new-php") {
    $('#submenu-edit-' + pagenow).closest('li').addClass('current');
    $('#submenu-edit-' + pagenow).closest('.wp-has-submenu').removeClass('wp-not-current-submenu').addClass('wp-has-current-submenu');
}
0
ken

J'ai répondu à une question similaire . Autant que je sache, vous devez le résoudre avec jQuery.

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

Et l'astuce consiste à ajouter un identifiant dans vos menus personnalisés, afin que vous puissiez reference les.

add_submenu_page(
    'edit.php',
    'Drafts', 
    '<span id="my-draft-posts">Drafts</span>', // <---- HERE
    'edit_pages', 
    'edit.php?post_status=draft&post_type=post'
);

Très probablement, vous aurez besoin de plus de jQuery que cet exemple.

2
brasofilo

Je me suis lancé dans la tâche, car j'ai un plugin qui en a besoin. J'utilise également le crochet de filtre administrateur parent_file qui vous permet de spécifier l'élément de menu administrateur de niveau supérieur sous lequel se trouve logiquement votre page. (NB: c'est un filtre, pas une action; add_action fonctionne aussi, mais ça devrait vraiment être add_filter)

Mon problème est que je ne veux pas réellement que la page de modification de type de message personnalisé soit répertoriée dans un menu, je souhaite simplement y créer un lien depuis une autre page figurant dans le menu. Cela signifie que j'ai 'show_in_menu' => false qui, je pense, est ce que vous avez dit maintenant.

Pour que l'élément de sous-menu soit défini sur "actuel", j'ai dû ajouter un effet secondaire modifiant une variable globale $submenu_file pour qu'elle corresponde à la page sur laquelle se trouve ce lien.

NB: il s’agit presque d’une copie exacte d’un code fonctionnel, veuillez donc l’ajuster en fonction de votre code.

// this filter only added when loading the edit page
add_filter('parent_file', 'wpse_71865_filterParentFile');

/**
* tell WordPress admin the parent page for the menu
* @param string $parent_file
* @return string
*/
public function wpse_71865_filterParentFile($parent_file) {
    global $submenu_file;

    // set parent menu item for filter return
    // (Gravity Forms in my case)
    $parent_file = 'gf_edit_forms';

    // set submenu item by side effect, link isn't in menu
    $submenu_file = 'gfdpspxpay-options';

    return $parent_file;
}

Notez que je joins à une page (c'est-à-dire page=gfdpspxpay-options), donc $submenu_file risque de ne pas fonctionner pour vous. Si ce n'est pas le cas, jetez un coup d'œil à wp-admin/menu-header.php, où tout cela se passe. Il y a un tableau $submenu_items qui est bouclé pour obtenir le sous-menu, et c'est là que se déroule toute l'action.

edit: Je pense que pour votre problème, il vous suffit de définir:

$submenu_file = 'post-new.php?post_type=uoms'
1
webaware