Mostrare un elemento specifico del menu da wp_nav_menu basato sull'ID

18 mag 2011, 04:38:57
Visualizzazioni: 18.7K
Voti: 3

Ho un wp_nav_menu "Menu Principale" come il seguente:

  • Livello superiore (#menu-item-1)
    • Sotto-elemento
    • Sotto-elemento
  • Livello superiore (#menu-item-2)
    • Sotto-elemento
  • Livello superiore (#menu-item-3)
    • Sotto-elemento A
    • Sotto-elemento B
      • Sotto-elemento a.1
    • Sotto-elemento C

Poi nel mio template voglio essere in grado di visualizzare i sotto-elementi del wp_nav_menu Menu Principale per il livello superiore con ID menu-item-3 dove menu-item-3 è l'elemento corrente del menu principale.

Quindi qualcosa del genere: (ma che funzioni davvero ovviamente)

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

E che dovrebbe restituire:

  • Sotto-elemento A
  • Sotto-elemento B
    • Sotto-elemento a.1
  • Sotto-elemento C

Se serve come informazione, questo mi serve per mostrare i sotto-elementi come menu laterale interno basato dinamicamente sulla sezione del menu principale in cui ti trovi. Grazie in anticipo!

Da notare che questa non è una duplicata di "http://wordpress.stackexchange.com/questions/2802/display-a-portion-branch-of-the-menu-tree-using-wp-nav-menu". Anche se quella pagina ha diverse risposte simili, nessuna funziona come previsto con l'ultima versione di WordPress. Cioè mostrare un particolare sotto-elemento del menu e tutti i suoi figli, i figli dei figli e così via (profondità illimitata).

5
Commenti

possibile duplicato di Visualizzare una porzione/ramo dell'albero del menu utilizzando wp_nav_menu()

Jan Fabry Jan Fabry
18 mag 2011 09:17:40

Penso che tu possa risolvere questa domanda leggendo la risposta a questa domanda. Se non riesci a risolverlo dopo aver letto quella domanda, modifica la tua domanda per chiarire cosa hai provato e cosa non ha funzionato. (Usa @Jan quando rispondi in un commento e riceverò una notifica)

Jan Fabry Jan Fabry
18 mag 2011 09:19:11

Sembra perfetto! Lo proverò questa mattina mentre leggo quei commenti e vedrò se funziona. Grazie Jan!

TechRemarker TechRemarker
18 mag 2011 15:48:29

Quindi purtroppo, dopo aver provato quelle opzioni nel link, non ho trovato una soluzione praticabile. La prima classe walker semplicemente mostra tutti gli elementi del menu, il che significa che non funziona. La terza nella lista sembrava funzionare, ma mostra solo l'elemento del menu principale e scende solo di un livello, mentre io ho bisogno di tutti i livelli. Ho provato l'opzione del plugin, ma non funziona neanche, mostra semplicemente tutti gli elementi del menu. La successiva risposta di Alp mostra il menu laterale, e non il livello principale il che è ottimo, ma mostra i loro elementi figli. E l'ultima nella pagina non funziona affatto. Suggerimenti?

TechRemarker TechRemarker
18 mag 2011 17:26:01

@heavymark, hai mai trovato una soluzione a questo?

Ian Dunn Ian Dunn
9 lug 2011 19:19:55
Tutte le risposte alla domanda 3
6

Se ho capito correttamente quello che vuoi, puoi farlo con il CSS. Chiamerai wp_nav_menu normalmente e lascerai che generi tutti i link, ma poi nasconderai tutti tranne il sottomenu della pagina corrente.

Il tuo CSS sarebbe qualcosa del genere,

#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;
    }

Aggiornamento: Puoi dare un'occhiata a http://thataboycreative.com per vedere un esempio di dove ho usato questa tecnica prima. Ecco il CSS rilevante da quell'esempio:

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;
    }
18 mag 2011 09:03:02
Commenti

@Ian Questo non funziona. Non ho mai visto "current-page-parent" usato prima. Credo che WP generi "current-menu-item" e "current_page_item". Ma anche usando quelli non sembra funzionare e nasconde semplicemente l'intero menu. Hai mai implementato con successo questo metodo su un sito a cui potrei fare riferimento?

TechRemarker TechRemarker
18 mag 2011 17:40:11

Anche current-page-parent esiste, ma potrebbe essere presente solo in alcune versioni. WP non è stato molto coerente con la denominazione delle classi. Modificherò la risposta per mostrare un esempio di dove l'ho fatto in precedenza.

Ian Dunn Ian Dunn
18 mag 2011 18:40:13

Proverò il tuo nuovo codice CSS per vedere se può funzionare come opzione temporanea finché non trovo un modo per farlo nel codice. Con il metodo CSS, la pagina dovrebbe comunque caricare tutti gli elementi del menu, aumentando il tempo di caricamento e le risorse, e semplicemente nasconderli. Ma a causa di una scadenza stretta, è sicuramente un'opzione da considerare. Grazie.

TechRemarker TechRemarker
19 mag 2011 00:24:52

In realtà, non credo che succederebbe, perché WordPress memorizza nella cache le letture dal database. Quindi, se hai già chiamato wp_nav_menu() una volta per il tuo menu principale, chiamarlo una seconda volta per il menu secondario non risulterà in una seconda query al database.

Ian Dunn Ian Dunn
19 mag 2011 03:13:10

@Ian, questo è un buon punto se presumibilmente funziona così.

TechRemarker TechRemarker
20 mag 2011 18:08:16

Ho dato un'occhiata veloce al codice ieri e wp_nav_menu() alla fine chiama get_term(), e questo chiama wp_cache_add() sul termine.

Ian Dunn Ian Dunn
21 mag 2011 00:56:11
Mostra i restanti 1 commenti
1

Ho creato un plugin per questo - assicurati di passare l'ID come STRINGA e non come numero intero. Per favore valuta il mio plugin - è il mio primo! :)

Scarica qui

8 mar 2012 22:33:22
Commenti

Il prefisso per la tua funzione personalizzata è wp_? Un giorno smetterà di funzionare.

fuxia fuxia
2 nov 2012 22:54:21
1

Un altro modo in cui ho affrontato questo problema è recuperare direttamente i post, invece di utilizzare wp_nav_menu. Questo si basa però sulla struttura effettiva delle pagine, non sul 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>
18 mag 2011 18:52:38
Commenti

Inizialmente l'avevo configurato utilizzando le pagine, che richiedevano solo poche righe di codice dal sito di WordPress, tuttavia quando ci si trovava su una sotto-sottopagina, mostrava il sotto-sottomenu, anziché il primo livello secondario e i suoi discendenti. Inoltre, quando l'utente aggiornava il menu principale, non si rifletteva nel menu laterale interno se si utilizzava la struttura a pagine, motivo per cui ho scelto il metodo basato sui menu. Ma grazie lo stesso.

TechRemarker TechRemarker
19 mag 2011 00:21:15