web-dev-qa-db-fra.com

Afficher un élément de menu spécifique de wp_nav_menu en fonction de l'id

J'ai un "Menu principal" wp_nav_menu tel que le suivant:

  • Niveau supérieur (# élément de menu-1)
    • Sous élément
    • Sous élément
  • Niveau supérieur (# élément de menu-2)
    • Sous élément
  • Niveau supérieur (# élément de menu-3)
    • Sous élément A
    • Sous-poste B
      • Sous élément a.1
    • Sous-élément C

Ensuite, dans mon modèle, je veux pouvoir faire écho à wp_nav_menu dans les sous-éléments du menu principal, par exemple pour le niveau supérieur avec l'id de l'élément de menu-3, où élément de menu-3 est l'élément supérieur du menu actuel.

Donc, quelque chose comme ceci: (mais cela fonctionnerait bien sûr)

wp_nav_menu( array('menu' => 'Main Menu' 'menu-item-id' => '3' ));

Et cela reviendrait:

  • Sous élément A
  • Sous-poste B
    • Sous élément a.1
  • Sous-élément C

Si cela est important, je peux alors afficher les sous-éléments en tant qu’intérieur du menu latéral en fonction de la section d’éléments du menu principal de manière dynamique. Merci d'avance!

À noter, il ne s'agit pas d'une copie de "http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu". Bien que cette page comporte plusieurs réponses similaires, aucune ne fonctionne comme prévu avec la version actuelle de WordPress. Cela montre un élément de sous-menu particulier et tous ses éléments, enfants, leurs enfants, etc. (profondeur illimitée).

3
cchiera

Si je comprends bien ce que vous voulez, vous pouvez le faire avec CSS. Vous appellerez normalement wp_nav_menu et le laisserez générer tous les liens, mais vous les masquerez tous à l'exception du sous-menu de la page en cours.

Votre CSS ressemblerait à quelque chose comme ça,

#sidebar ul.menu li
{
    display: none;
}

    #sidebar ul.menu li.current-page-parent,
    #sidebar ul.menu li.current-page-parent ul,
    #sidebar ul.menu li.current-page-parent ul.li
    {
        display: block;
    }

Update : Vous pouvez consulter http://thataboycreative.com pour voir un exemple d'utilisation de ce contenu auparavant. Voici le CSS pertinent de cet exemple:

ul.sub-menu
{
    display: none;
}

    #menu-main-navigation > li.current-menu-item ul.sub-menu,
    #menu-main-navigation > li.current-menu-ancestor ul.sub-menu
    {
        display: block;
    }
3
Ian Dunn

J'ai créé un plugin pour cela - assurez-vous de passer l'ID en tant que chaîne et non en tant qu'entier. S'il vous plaît noter mon plugin - c'est mon premier! :)

Télécharger ici

3
Travis Hoglund

Une autre façon de faire est de récupérer les articles directement au lieu d'utiliser wp_nav_menu Ceci est basé sur la structure réelle de la page, cependant, pas sur le menu.

functions.php:

function __construct()
{
    $this->currentPageID    = $this->getCurrentPageID();
    $this->sectionChildren    = $this->getSectionChildren();
}

function getCurrentPageID()
{
    $currentPage = $_SERVER['REQUEST_URI'];

    if($currentPage == '/')
        $currentPage = '/home';
    $currentPage = get_page_by_path($currentPage);

    if($currentPage)
        return $currentPage->ID;
    else
        return -1;
}

function getSectionID()
{
    global $wpdb;

    $currentSectionID = $wpdb->get_var("
        SELECT post_parent
        FROM ". $wpdb->posts ."
        WHERE ID = ". $this->currentPageID
    );

    if($currentSectionID == 0)
        return $this->currentPageID;
    else
        return $currentSectionID;
}

function getSectionChildren()
{
    global $wpdb;

    $children = $wpdb->get_results("
        SELECT ID, post_title
        FROM ". $wpdb->posts ."
        WHERE
            post_parent = ". $this->getSectionID() ." AND
            post_type = 'page' AND
            post_status = 'publish'
    ", ARRAY_A);

    return $children;
}

sidebar.php:

<ul id="sub-navigation">
    <?php foreach($dc->sectionChildren as $c) : ?>
        <li <?php if($dc->currentPageID == $c['ID']) echo 'class="active"'; ?>><a href="<?php echo get_permalink($c['ID']); ?>"><?php echo $c['post_title']; ?></a></li>
    <?php endforeach; ?>
</ul>
2
Ian Dunn