web-dev-qa-db-fra.com

Insérer et commander des types de publication personnalisés dans / en tant que sous-menu

[~ # ~] tldr [~ # ~] : tandis que dans le backend, je voudrais ajouter un type de message personnalisé dans une page de menu (que je peut faire). Mais je ne peux pas commander les pages de sous-menu résultantes.


J'ai 3 types de messages personnalisés "A", "B", "C", et je veux:

  1. Regroupez les 3 contenus sous une seule page de menu appelée "Ma page personnalisée"
  2. Lorsque je clique sur "Ma page personnalisée", être redirigé vers le contenu de "Ma page personnalisée" et pas l'un des types de publication personnalisés .

J'ai accompli la première moitié assez facilement: j'ai créé une page de menu comme suit:

add_menu_page('My Custom Page', 'My Custom Page', 'manage_options', 'my-top-level-slug');

Et puis, j'ai défini chaque type de publication personnalisé comme ceci:

'show_in_menu'=> 'my-top-level-slug'

Cela me permet de regrouper avec succès mes 3 types de messages personnalisés sous une seule page de menu. Et se trouve ici le problème : si je clique sur "Ma page personnalisée", je suis redirigé vers le premier type de message personnalisé (en fonction de l'ordre d'inclusion) - Je voudrais cliquer sur "Ma page personnalisée" et être redirigé vers cette page (où je prévois de lister les statistiques, les messages les plus consultés, etc.), mais à la place, un type de message personnalisé s'ouvre, ce que je ne veux pas vraiment .

J'ai pensé que je pouvais ajouter une page de sous-menu, mais toute page de sous-menu que j'ajoute est incluse APRÈS les types de publication personnalisés (donc au bas de la liste des pages de sous-menu). Je me demande donc s'il existe un moyen d'attribuer un ordre à ces sous-pages, de sorte que si je clique sur "Ma page personnalisée", il ne montrera pas de type de publication personnalisé.


[~ # ~] mise à jour [~ # ~]

Après quelques recherches, j'ai trouvé l'article suivant sur le Codex: https://developer.wordpress.org/reference/functions/add_submenu_page/ . En suivant cet exemple et en incorporant ce code:

function wpdocs_register_my_custom_submenu_page() {
add_submenu_page(
    'my-menu',
    'My Custom Submenu Page',
    'My Custom Submenu Page',
    'manage_options',
    'edit.php?post_type=CPT-NAME',
    false
);
}

add_action('admin_menu', 'wpdocs_register_my_custom_submenu_page');

Je peux accomplir les 2 points ci-dessus (donc le regroupement fonctionne et lorsque je clique, je suis redirigé vers une page de révision). Mais - ce faisant, une fois que j'entre dans un article (en créer ou en éditer un, peu importe), la page de menu ne devient plus active : si je passe la souris sur la page du menu, il est marqué en blanc comme actif, mais sinon le menu et les sous-menus sont réduits/fermés.

La solution précédente fonctionnait correctement (état du menu), mais ne me permettait pas d'attribuer une page personnalisée à "Ma page personnalisée". Quant à la deuxième solution, c'est l'inverse (l'état du menu est inactif dans un article, mais je peux afficher "Ma page personnalisée").

1
Cerere

J'ai trouvé la réponse. Pour faire court:

SOLUTION 1

Si vous souhaitez simplement ajouter un type de publication personnalisé à un élément de menu, choisissez la solution numéro un (qui consiste à créer une page de menu avec add_menu_pageet réglage 'show_in_menu=>' à votre slug de page de menu). Cela fonctionne, mais si vous cliquez sur votre page de menu nouvellement créée, vous serez redirigé vers le premier CPT (toute sous-page sera poussée à la fin de la liste).

SOLUTION 2

Si vous souhaitez regrouper vos types de messages personnalisés, cliquez sur votre page de menu et finissez sur une sous-page, puis allez avec la solution numéro 2 (voir la mise à jour ci-dessus): set 'show_in_menu=> false', puis créez une fonction comme celle-ci:

function create_menupages_252428() {

// https://developer.wordpress.org/reference/functions/add_menu_page/

add_menu_page(
    'Page', // Page title
    'Page', // Menu title
    'manage_options', // Capability
    'page', // Slug
    'mycustompage', // Function name
    'dashicons-format-aside', // Slug
    1 // Order
);

// https://developer.wordpress.org/reference/functions/add_submenu_page/

add_submenu_page(
    'page', // Parent slug
    'subpage', // Page title
    'subpage', // Menu title
    'manage_options', // Capability
    'edit.php?post_type=CPT',  // Slug
    false // Function
);
}
add_action('admin_menu', 'create_menupages_252428');

Une fois terminé, si vous souhaitez afficher la page de menu comme active tout en fonctionnant sur votre type de publication personnalisé,

function menu_active_252428() {
global $parent_file, $post_type;
if ( $post_type == 'CPT' ) {
    $parent_file = 'page';
}
}
add_action( 'admin_head', 'menu_active_252428' );

Si par hasard vous trouvez une meilleure solution, n'hésitez pas à ajouter/corriger ma solution!

1
Cerere

Mise à jour: Maintenant, il vous suffit de créer la page de menu avec:

function create_home_menu(){
    add_menu_page(
        'Página de Inicio',
        'Inicio/Home',
        'manage_options',
        'my_home_menu',
        'mycustompage',
        'dashicons-admin-home',
        2
    );
}
add_action('admin_menu', 'create_home_menu');

Et assurez-vous que lorsque vous créez un type de publication, ajoutez 'show_ui'=>true et 'show_in_menu'=>'my_home_menu' où 'my_home_menu est le slug que vous avez donné au menu créé auparavant.

Afficher l'interface utilisateur le rend visible pour éditer et changer, et afficher dans le menu l'ajoute au menu comme sous-menu par défaut. Maintenant, vous n'avez pas besoin d'ajouter de fonction supplémentaire pour que le menu parent apparaisse comme sélectionné lors de la modification du type de publication.

0
Rodrigo García