web-dev-qa-db-fra.com

Utilisation de types d'articles personnalisés dans le sous-menu + titre personnalisé

Je prévois d'utiliser quelques types de publication personnalisés pour un plugin. L'ensemble du plugin doit résider sous 1 élément de menu de niveau supérieur. Ainsi, je préférerais une structure de menu comme celle-ci:

  • Tableau de bord
  • Des postes
  • [...]
  • Mon plugin

    • Type de message personnalisé n ° 1
    • Type de message personnalisé n ° 2
    • [...]

Ceci est possible en incluant 'show_in_menu' => 'my_plugin_toplevel_menu_item_slug' dans register_post_type lors de l'enregistrement de mes types de publication personnalisés. Howerer, il y a quelques problèmes que j'ai rencontrés en utilisant cette méthode.

  • Je n'ai aucun mot à dire sur la manière dont le titre devrait être affiché. Je préférerais utiliser <h2 class="nav-tab-wrapper"> ... </h2>, mais maintenant, post.php affiche la sortie h2 pour moi, et je ne connais pas de moyen facile de le remplacer. Il est possible de le faire avec javascript dès que la page est chargée, mais c'est un peu moche à mon avis.
  • Lorsque vous utilisez 'show_in_menu', l'ordre des pages du sous-menu ne peut pas être modifié. Les types de publication personnalisés sont placés automatiquement en haut de la liste, car je suppose que Wordpress y parvient plus rapidement que moi.
  • L’icône h2 disparaît pour une raison quelconque (je n’ai pas encore vraiment cherché à résoudre ce problème, mais il pourrait être très facile à résoudre).

Quelqu'un a-t-il une idée de la manière d'aborder ces problèmes avec élégance?

Mettre à jour

Voir la solution temporaire dans ma réponse ci-dessous.

3
Kelley van Evert

La solution (temporaire?) Pour laquelle j'ai choisi, est la suivante:

  1. Utilisez le paramètre show_in_menu de register_post_type
  2. Utilisez javascript pour afficher un titre personnalisé après le chargement de la page
  3. Résolvez l'ordre des pages du sous-menu (qui place automatiquement les types de publication personnalisés en haut, ce qui n'est pas mon intention), avec la fonction d'assistance suivante:

...

// Sort the children of a given toplevel menu item
// Keep original order intact as much as possible, while
//  enforcing the [before => after] rules given by $force_order
function help_sort_submenu_items($toplevel_slug, $force_order) {
  global $submenu;

  $done = array();
  $hold = array();
  $newmenu = array();

  foreach ($submenu[$toplevel_slug] as $i => $item) {
    $force_after = array_search($item[2], $force_order);
    if ($force_after !== false && empty($done[$force_after])) {
      $hold[$item[2]] = $item;
    } else {
      $newmenu []= $item;
      $done[$item[2]] = true;

      $just_added_id = $item[2];
      while ($just_added_id = $force_order[$just_added_id]) {
        $next = $hold[$just_added_id];
        $newmenu []= $next;
        $done[$just_added_id] = true;
      }
    }
  }

  $submenu[$toplevel_slug] = $newmenu;
}

Utilisation comme si:

help_sort_submenu_items('my_plugin_toplevel_menu_item_slug', array(
  'submenu_page_with_this_slug_comes_before' => 'submenu_page_with_this_slug',
  'another' => 'rule'
));
1
Kelley van Evert