Wie zähle ich Navigationsmenüpunkte?


7

Ich erstelle einen benutzerdefinierten Walker für mein Navigationsmenü. Das Ziel ist es, das Menü in folgende Spalten aufzuteilen:

Geben Sie hier die Bildbeschreibung ein

Ich kann leicht feststellen, wo ich in der Liste bin, indem ich auf schaue $item->menu_order. Was ich nicht weiß ist, wie viele Elemente in der Menüsumme enthalten sind.

Wie kann ich das im Inneren des Gehgeräts herausfinden?

Aktualisiert:

Mir ist klar, dass es mehrere andere Möglichkeiten gibt, Spalten zu erstellen. Alle haben jedoch ihre Nachteile:

  1. CSS Floats. Wie unten von @sagive vorgeschlagen, kann dies durch Verschieben aller Listenelemente erreicht werden. Das Problem ist, dass die Liste die Reihenfolge ändert. Anstatt die erste Spalte zu durchlaufen und dann zur zweiten zu wechseln, würde die Liste alle vier Spalten in der ersten Zeile und dann alle vier Spalten in der zweiten Zeile durchlaufen. Dies bringt die Bestellung durcheinander.

  2. CSS-Spalten. Dies ist fast die perfekte Lösung. Es wird mir genau das geben, was ich will - außer dass der IE es überhaupt nicht tut. Sogar auf IE 9. Das macht es für eine Mainstream-Website unbrauchbar.

  3. jQuery. Mit etwas clientseitigem Javascript könnte ich die Liste hacken und das Layout so gestalten, wie ich es möchte. Das ist allerdings chaotisch und bricht für Leute, die js deaktiviert haben.

  4. PHP. Dies ist die Methode, nach der ich in dieser Frage frage. Ich teile die Liste in vier separate ungeordnete Listen auf, speichere jede in HTML aus und verwende dann CSS, um die Listen zu schweben und vier verschiedene Spalten zu erstellen. Es mag schwierig sein, in PHP zu produzieren, aber das Ergebnis sieht für alle Browser gleich aus. Das macht es zur besten Option, glaube ich.

Lösung:

Für diejenigen, die folgen können, ist hier der Code, den ich endlich verwendet habe, um die Antwort zu erhalten:

// The menu handle from the register_nav_menu statement in functions.php
$theme_location = 'my-menu-handle';

$theme_locations = get_nav_menu_locations();

$menu_obj = get_term( $theme_locations[$theme_location], 'nav_menu' );

// Echo count of items in menu
echo $menu_obj->count;

Antworten:


11

Rufen Sie wp_get_nav_menu_objectan, um ein Menüobjekt zu erhalten, mit dem Sie die Anzahl der Elemente für dieses Menü ermitteln können.

Beispiel:

// Get menu object
$my_menu = wp_get_nav_menu_object( 'your-menu-name-or-slug' );

// Echo count of items in menu
echo $my_menu->count;

Ich hoffe, das hilft.


Vielen Dank! Das brachte mir nicht genau das, was ich wollte, aber es war nah genug, um mir zu helfen, die Antwort zu finden. Das Problem war, dass ich den Menünamen oder den Slug nicht kenne, sondern nur den in der Anweisung register_nav_menu festgelegten Themennamen. Ich habe jedoch einen Code gefunden, um den Menünamen zu bestimmen. Damit könnte ich Ihren obigen Code verwenden.
Axeva

Ah ... das hast du in deiner Frage nicht angegeben, wenn du es getan hättest, hätte ich wahrscheinlich mehr Code eingegeben, um den Menünamen herauszufinden.
Freut

Ist es möglich, dies irgendwie zu filtern, um nur Menüelemente der obersten Ebene zu zählen und Untermenüs und Untermenüelemente zu ignorieren?
Verwenden Sie

1

Warum nicht einfach die Funktion array_chunk () verwenden ?

Angenommen, Sie haben ein Array fertiger <li>Tags erstellt, könnte Ihr Code zum Teilen und Anzeigen folgendermaßen aussehen:

$columns = array_chunk( $myArray, 4 );
foreach ( $columns as $column ) {
    echo '<li>' . $column . '</ul>';
}

0

Ich weiß, dass Sie bereits eine Lösung gefunden haben und nicht wissen, ob Sie genau danach suchen, aber ich habe vor einiger Zeit ein Plugin geschrieben, das auf der Website eines Kunden verwendet werden kann, und es erstellt Klassen für jedes Menü, Untermenü und Menüelement . Es heißt Erweiterte Navigationsmenüs. Wenn Sie es am Ende verwenden, können Sie mir gerne Funktionsanfragen senden.


0

Denken Sie nicht (und entschuldigen Sie, wenn ich unhöflich bin), dass es viel einfacher und einfacher ist
, einfach zu schweben: links; alle "li" und setzen sie in ein div mit dieser
Struktur als Bild hinterlegt?

Beispiel:

<style type="text/css">
.fourPartMenu {

    border: 1px solid #444;
    width: 800px;
    padding: 10px 15px;
}

.fourPartMenu ul {
    list-style: circle; // replace with your img
    padding: 0px;
    margin: 0px;
}

.fourPartMenu ul li {
    float: left;
    width: 190px;
}

</style>

<div class="fourPartMenu">
    <ul>
        <li><a href="#">One</a></li>
        <li><a href="#">Two</a></li>
        <li><a href="#">Three</a></li>
        <li><a href="#">Four</a></li>
        <li><a href="#">Five</a></li>
        <li><a href="#">Six</a></li>
        <li><a href="#">Seven</a></li>
        <li><a href="#">Eight</a></li>
        <li><a href="#">Nine</a></li>
        <li><a href="#">Ten</a></li>
    </ul>
</div>

Ich denke, das wäre viel einfacher zu implementieren - aber ich weiß, dass nicht genau das, was dir nach einer harten, neuen Sichtweise manchmal hilft :)


Danke für die Antwort. Mir ist klar, dass ich es mit CSS machen könnte, aber die Liste wird nicht in Ordnung sein. Wenn Sie über die Spalten gehen, erhalten Sie oben eins, zwei, drei, vier. Was ich brauche, ist eins, vier, sieben, neun. Mit anderen Worten, die Liste geht in die erste Spalte, dann in die zweite Spalte und so weiter.
Axeva
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.