Comment ajouter un sous-menu à un menu généré par wp_nav_menu en utilisant un plugin

11

J'ai un menu généré wp_nav_menuqui ressemble à

<ul class="nav-menu" id="menu-top-nav">
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>

Je veux modifier le menu ci-dessus en ajoutant un sous-menu à "Item 3" en utilisant mon plugin, donc ci-dessous est ma sortie souhaitée.

<ul class="nav-menu" id="menu-top-nav"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a>
    <ul class="sub-menu">
      <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
      <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
      <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
   </ul>
  </li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>

J'ai essayé de suivre les filtres, mais ceux-ci ne m'ont pas aidé à atteindre la sortie ci-dessus.

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

Solution 1:

add_filter('wp_nav_menu_items', 'my_custom_menu_item', 10, 2);

function my_custom_menu_item($items, $args)
{
    $parent_item_number = 3;
    $pos = nth_strpos($items, '</a>', $parent_item_number) + 4;
    $cat_id = 9;
    $args = array('numberposts' => 5, 'category' => $cat_id);
    $myposts = get_posts($args);
    if (!empty($myposts))
    {
        $str_to_insert = '<ul class="sub-menu">';
        global $post;
        foreach ($myposts as $post) : 
            setup_postdata($post);
            $str_to_insert .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        endforeach;
        $str_to_insert .= '</ul>';

        $items = substr($items, 0, $pos) . $str_to_insert . substr($items, $pos);
    }
    return $items;
}

function nth_strpos($str, $substr, $n, $stri = false)
{
    if ($stri)
    {
        $str = strtolower($str);
        $substr = strtolower($substr);
    }
    $ct = 0;
    $pos = 0;
    while (($pos = strpos($str, $substr, $pos)) !== false)
    {
        if (++$ct == $n)
        {
            return $pos;
        }
        $pos++;
    }
    return false;
}

La solution ci-dessus fonctionne mais je pense que ce n'est pas une bonne façon d'atteindre le résultat souhaité. J'aimerais avoir une bonne solution de votre part.

Tahir Yasin
la source
Wow, donc pas d'autre réponse à cette question? Je recherche également une solution de contournement simple ici. Quelque chose qui n'implique pas l'analyse des chaînes. Il doit y avoir un moyen plus simple, non?
rgin
Support WP sur defoult cette structure html. Pour contourner ce problème, il suffit de modifier les noms de classe des sous-menus css. Mieux vaut réécrire vos classes css pour la structure du menu wordpress.
Foxsk8

Réponses:

2

Vous pouvez modifier votre menu à l'aide du déambulateur.

include('subMenu.php');
$menu =  wp_nav_menu( array('menu' => 'YOUR-MENU-NAME','menu_class' => 'megamenu','walker' => new subMenu));

créer un fichier subMenu.php dans le dossier du thème ajouter le code ci-dessous.

<?php
class subMenu extends Walker_Nav_Menu {
    function end_el(&$output, $item, $depth=0, $args=array()) {

    if( 'Item 3' == $item->title ){
        $output .= '<ul class="sub-menu">
        <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
        <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
        <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
        </ul>';
    }
    $output .= "</li>\n";  
    }
}
Addy
la source
0

Le crochet a wp_nav_menu_itemsraison si vous ajoutez des éléments à la structure du menu WP Nav. Voir l'exemple ci-dessous pour ajouter un lien statique "Accueil". Le lien est statique, à partir de la fonction home_url()et je l'ai souligné uniquement dans les arguments de WP Nav Menu fpr les valeurs avant et après. L'élément li est statique, n'est chnagé que dans WordPress, si vous utilisez un Walker pour cet élément. Le crochet wp_nav_menu_itemsest dans la liste ul. Après avoir défini la var pour ce nouveau contenu d'élément, je l'ajoute à la liste par défaut dans la var $items, définie avant la sortie de la liste. Maintenant seulement un retour de tout le contenu.

add_filter( 'wp_nav_menu_items', 'fb_add_home_link', 10, 2 );
function fb_add_home_link( $items, $args ) {

    $home_item =
            '<li>' .
            $args->before .
            '<a href="' . home_url( '/' ) . '" title="Home">' .
            $args->link_before . __( 'Home' ) . $args->link_after .
            '</a>' .
            $args->after .
            '</li>';

    $items = $home_item . $items;

    return $items;
}
bueltge
la source
Il semble que vous n'ayez pas lu ma déclaration de problème, votre solution n'est donc pas ce que je veux, je n'ai pas besoin de joindre un élément au début ou à la fin du menu, mais j'ai besoin d'un sous-menu sous un élément parent spécifique. Veuillez lire la question, tout est expliqué très clairement.
Tahir Yasin
Désolé, oui, vous avez raison; mais souvent le problème de la langue est le fond. Mais je vais voir une solution.
bueltge