web-dev-qa-db-fra.com

placer automatiquement des types de post personnalisés dans le sous-menu du menu de navigation principal

Je regarde autour de moi et je vois quelques indices sur ce que je veux faire est peut-être possible, mais cela ne clique tout simplement pas pour moi.

J'ai un type de message personnalisé rt_doctors. J'essaie de faire en sorte qu'il y ait une liste dynamique des médecins dans mon menu principal.

J'aimerais que dans le menu Navigation, un élément de menu docteurs renvoie à la page d'index/archive de mon type de message personnalisé et à la liste des éléments de sous-menu, une liste d'éléments de sous-menu reliant chacune à un seul poste des médecins. se.

Il semble que je devrais utiliser un marcheur personnalisé, mais je ne semble pas le comprendre.

voici le code que j’ai ajouté juste à titre de test: (j’ai créé une page appelée Products2 car mon cpt fabrique des produits comme la page d’archivage. J’ai aussi essayé avec Products (j’ai créé cette page avant la création du cpt). également)

class Walker_rt_Submenu extends Walker_Nav_Menu {
    function end_el(&$output, $item, $depth=0, $args=array()) {
        if( 'Products2' == $item->title ){
            $output .= '<ul><li>Dynamic Subnav</li></ul>';
        }
        $output .= "</li>\n";  
    }
}
wp_nav_menu(
    array(
        'theme_location' => 'primary',
        'walker' => new Walker_rt_Submenu
    )
);

mais j'obtiens cette erreur:

Call to a member function get_page_permastruct() on null in /home/randomnoises/public_html/wp-includes/link-template.php on line 355 

J'utilise juste vingt seize comme thème pour les tests.

1
rudtek

Walker_Nav_Menu n'est pas ce que vous utiliseriez pour cela.

Utilisez plutôt le filtre wp_get_nav_menu_items. Avant de commencer, vous devez autoriser le code à identifier l’élément de menu/la page que vous souhaitez être le parent de la liste des publications. Vous pouvez le faire avec une classe CSS - donnez à l’élément de menu parent une classe CSS dans le panneau d’administration, appelons-le 'doctor-parent-item'.

add_filter( 'wp_get_nav_menu_items', 'my_theme_doctors_menu_filter', 10, 3 );

function my_theme_doctors_menu_filter( $items, $menu, $args ) {
  $child_items = array(); // here, we will add all items for the single posts
  $menu_order = count($items); // this is required, to make sure it doesn't Push out other menu items
  $parent_item_id = 0; // we will use this variable to identify the parent menu item

  //First, we loop through all menu items to find the one we want to be the parent of the sub-menu with all the posts.
  foreach ( $items as $item ) {
    if ( in_array('doctors-parent-item', $item->classes) ){
        $parent_item_id = $item->ID;
    }
  }

  if($parent_item_id > 0){

      foreach ( get_posts( 'post_type=rt_doctors&numberposts=-1' ) as $post ) {
        $post->menu_item_parent = $parent_item_id;
        $post->post_type = 'nav_menu_item';
        $post->object = 'custom';
        $post->type = 'custom';
        $post->menu_order = ++$menu_order;
        $post->title = $post->post_title;
        $post->url = get_permalink( $post->ID );
        array_Push($child_items, $post);
      }

  }

  return array_merge( $items, $child_items );
}

Votre menu affichera maintenant tous les rt_doctorss situés dans un sous-menu situé sous l'élément de menu que vous avez donné à la classe CSS 'doctors-parent-item`

2
Dan.