Individueller Menü Walker

  • Hallo Leute,

    nach langer Suche im Web hat es mich doch noch mit meinem Problem hierher verschlagen.

    Für ein WP-Theme möchte ich ein idiotensicheres Menü erstellen, dass sich im Administrationsbereich leicht konfigurieren lässt. Ein Menü zu registrieren und die einfacheren Sachen haben ohne Probleme geklappt.
    Nun möchte ich, dass mein Menü ungefähr so aussieht:

    home | store | about

    und nicht so:

    homestoreabout

    Zwischen 2 Menüpunkten soll immer ein Strich eingefügt werden und zwar als

    HTML
    <li class="seperator">&nbsp;|&nbsp;</li>

    Dazu muss ich einen modifizierten Menü Walker in meiner functions.php haben und übergeben.

    Momentan sieht er noch ganz regulär/standart aus:

    Außerdem möchte ich, dass nur "Top-level Menüpunkte" in die finale html Ausgabe kommen und Menüpunkte mit einer "depth != 0" ignoriert werden.


    Zwas kann ich ein wenig php, doch diese 2 Probleme überfordern mich, da ich auch nach langem Lesen aus den Wordpress Funktionen nicht so ganz schlau werde.

    Bitte kann mir jemand helfen!! :sad:

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Hallo!

    Für die Beschäftigung mit Walkern wäre es natürlich von Vorteil, wenn die PHP-Kenntnisse schon ein wenig besser wären. Aber man lernt ja mit der Materie. :)

    Der Walker, den Du dir basteln musst, braucht die Function start_el gar nicht, sondern nur end_el, weil dort das schließende </li> sitzt.

    Der benötigte Walker sähe dann so aus:

    Dabei wird an das schließende </li> dein zusätzlicher Listenpunkt angehängt, wenn die Tiefe = 0 ist (also nur für die Elternelemente).

    Mit folgendem Aufruf kannst Du das Menü anzeigen lassen. Hier stellst Du auch ein, dass Du nur Toplevel-Elemente anzeigen willst (depth => 1):

    PHP
    $wpnavmenu_args = array(
      'depth' => 1,
      'walker' => new MyWalker()
    );
    wp_nav_menu( $wpnavmenu_args );

    Hoffe, das hat geholfen! :)

    Gruß,
    Marcus

  • Arigatou!!

    Vielen Dank für deine Hilfe!!

    Oh man, man merkt echt, dass ich mich mit der Funktionsweise von Wordpress noch nicht wirklich auskenn.
    Du hast mir echt ne coole Lösung Präsentiert, aber ganz ist es noch nicht das, was ich will!

    Nach dem letzten Menüelement soll kein Trennstrich gesetzt werden.

    Die momentane Ausgabe: home | store | about |
    soll so aussehen: home | store | about

    Dazu nehm ich mal an, dass ich das ganz easy in das 'if' mit reinschreiben kann oder muss ich da mit dem WP_Query->post_count() irgendwas basteln?

    Wenn mir nochmal kurz wer helfen könnte, wäre ich sehr dankbar!! :neutral:

    Einmal editiert, zuletzt von B1fr0st (26. Mai 2011 um 17:05)

  • Closed

    Dieses Thema wurde dank Marcus.Kober's Hilfe erfolgreich gelöst!! :D

    Hier die Lösung für alle, die ein ähnliches Problem haben:

    header.php

    functions.php

    PHP
    add_action( 'init', 'register_my_menu' );
    function register_my_menu() {
      register_nav_menu( 'main-navigation', __( 'Main Menu' ) ); //"php Menüname und Name im Adminbereich"
    }
    class MyWalker extends Walker_Nav_Menu {
      function end_el(&$output, $item, $depth) {
        // leere Funktion verhindert unerwünschtes </li>
      }
    }

    Zur Lösung geholfen hat mir neben der Antwort von Marcus:

    http://helpfulcoder.com/2768/separate-…items-tutorial/
    (Bitte beachten, dass eine Zeile im Artikel über den Rand ragt!!)

    und die WP Dokumentation:

    http://codex.wordpress.org/Function_Reference/wp_nav_menu

    CLOSED :cool:

  • Sorry, das war ein Schnellschuss gestern... :)

    Um zu bewerkstelligen, dass der Trenner an den Außenseiten nicht auftaucht, brauchst Du doch start_el. Damit schaffst Du es, das Ziel nur mit dem Walker zu erreichen:

    Aufruf:

    PHP
    $wpnavmenu_args = array(
      'depth' => 1,
      'walker' => new MyWalker()
    );
    wp_nav_menu( $wpnavmenu_args );

    Erklärung: der Inhalt der Variable $sep wird vor das sich öffnende <li> gesetzt. Am Anfang ist $sep noch leer, wird nach dem ersten Durchlauf aber auf den Separator-String gesetzt.

    So schaffst Du es, ohne das Menü mit explode auseinander zu nehmen und nur mit einem einzigen Aufruf. :)

  • OK, auch gut!

    Hi Marcus,

    wieder Danke für den Vorschlag!! Der funktioniert noch besser, als das, was ich als Lösung gefunden hab.

    Die if-Verschachtelung ist übrigens richtig clever!! Man merkt, dass du länger im Geschäft bist, als ich.

    Ich hab aber noch eine kleine/große Frage, die ich in ein neues Thema schreiben werde. Vielleicht kannst du dir das dann auch nochmal ansehen??
    (Es geht um den selben Walker, aber im speziellen um eine WP Funktion)


    DOUBLE CLOSED!! 8-) 8-)

    Einmal editiert, zuletzt von B1fr0st (27. Mai 2011 um 18:19)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!