Minimalistisches Menü in WP 3.0

  • Hallo,

    im Moment gibt mir

    PHP
    <?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary' ) ); ?>

    eine Menüstruktur im Stile von:

    Code
    <div class="menu">
        <ul>
            <li class="current_page_item"><a href="http://localhost/" title="Home">Home</a></li>
            <li class="page_item page-item-75"><a href="http://localhost/seite2" title="seite2">seite2</a></li>
            <li class="page_item page-item-55"><a href="http://localhost/seite3" title="seite3">seite3</a></li>
            <li class="page_item page-item-74"><a href="http://localhost/seite4" title="seite4">seite4</a><ul class='children'>
                <li class="page_item page-item-100"><a href="http://localhost/services/seite5" title="seite5">seite5</a></li>
        <ul>
    </div>

    aus.

    Ich hätte aber gerne einen minimalistischen Code in folgender Form:

    Sprich:
    * keine absoluten Pfade
    * in a: kein Attribut "title"
    * kein <div class="menu">
    * in li: kein Attribut "class"

    Ich habe bereits probiert, die Datei http://core.trac.wordpress.org/browser/tags/3…nu-template.php entsprechend anzupassen, leider aber ohne Erfolg.
    Wie kann diese Form der Ausgabe in WP 3 realisiert werden?

    • 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

  • Niemals Core-Dateien verändern. wp_nav_menu() nimmt auch callback functions als Argumente. Außerdem gibt's glaub ich einen action filter dafür. Wieso Du kein Css dabei haben willst, ist mir unverständlich. Das stört doch niemanden, solange Du den css-classes keine Definitionen gibst. Selbiges mit dem title Attribut. Den div kannst Du irgendwie umgehen (Hab mich damit aber nicht beschäftigt). Das mit den Pfaden versteh ich irgendwie auch nicht. Wie soll da ein funktionierender Link rauskommen?

  • Ich wiederhole mich: Eine Klasse/ID schadet niemandem und sie wird auch nicht angegriffen, solange Du dahinter keine Definition legst. Ein title/alt Attribut sollte immer(!) vergeben werden, außer Du bist einer der Menschen, die auch gegen Rollstuhlrampen bei Eingängen und Blindensignale an Ampeln sind. Das ist sinnvoll und wichtig und betrifft in keinster Weise das Markup. Weder in Html 4, noch in 5. Weiters dürfte derjenige sein Css jedesmal "from scratch" aufbauen. Also jeden Schritt, vom Browserreset bis zum border 0 für Tabellen schreiben. Ich bin allerdings ein Verfechter von Frameworks und Libraries. Code sollte man nicht wiederholen.

    Wie man mit der Technik zB das .current_page_item ohne ID oder Class hervorheben will ist mir schleierhaft. Ich weiß was ich sage und tue und behaupte, dass der größte Teil von dem Text einfach nur blabla ist (hab's aber nur überflogen). Schau einfach mal in seinen Quellcode rein: Der verwendet selbst ausreichend Klassen und IDs. WordPress bietet aus gutem Grund Dinge wie body_class, post_class, sticky_class etc. an. Ich würde es zwar besser finden, wenn man die Klassen selbst definieren kann, aber solange man sie nicht verwendet ist's: wurscht. Mach Dir einfach keinen Kopf wegen dem Quatsch. Im Gegenteil würde ich Dir eher empfehlen Css Frameworks wie blueprint oder 960 grid system anzuschauen.

    Edit: Das es Sinn macht semnatische Elemente wie strong, p, h1-h6, code, address, etc. direkt zu stylen ist klar. Die Seite sollte ja einheitlich ausschauen. Ein li-Element bezeichnet allerdings eine Auflistung und diese kann ganze Artikel, eine Photo-Gallerie, etc. beinhalten. Daher macht es auch Sinn diese nicht nur im Text-Context zu sehen und zu stylen.

    Firebug laden! Foreregeln bitte lesen. FAQ. Bitte keine Anfragen per PN.

    Einmal editiert, zuletzt von kaiser (9. Dezember 2010 um 17:35)

  • kaiser

    Stichwort schlanker Code:
    Dem OP geht es, wenn ich ihn richtig verstehe, darum, schlankes XHTML auszuliefern, welches nur soviel enthält, wie wirklich nötig ist.
    Ein sehr gutes Ziel.
    Ein Vorteil von schlankem Code: er lässt sich besser warten, eine Fehlersuche fällt leichter, er lässt sich besser portieren, etc.
    Selbstverständlich geht es keineswegs darum, alle IDs und Classes rauszuwerfen.

    Zu "Ein title/alt Attribut sollte immer(!) vergeben werden":

    So pauschal ist das selbstverständlich nicht richtig.
    Bitte schau Dir dazu mal die W3C-Spezifikation an.
    Wiederholung nervt den Screenreadernutzer genauso wie einen Sehenden. Nur als Hinweis.

    Zum Hervorheben eines Listeneintrags, der zur aktuellen Seite gehört:
    Eine ID ist dafür nicht nötig.

    Beispiel:

    Code
    <ul id="nav">
       <li><a href="/thema-1>Thema 1</a></li>
       <li><strong>Thema 2</strong></li>
    </ul>

    Zu den Referenzierungen:

    Code
    href="/thema-1"

    Das ist eine absolute Pfadangabe relativ zum Basis-URI. Nix Ungewöhnliches.

    Einmal editiert, zuletzt von saerdna (10. Dezember 2010 um 11:13)

  • Stichwort schlanker Code:
    Dem OP geht es, wenn ich ihn richtig verstehe, darum, schlankes XHTML auszuliefern, welches nur soviel enthält, wie wirklich nötig ist.


    Richtig.

    Ich habe ja, wie schon im Ausgangspost erwähnt, die core-Datei von Wordpress bereits so editiert, dass Sie beinahe wunschgemäßen Code ausliefert.
    Da mir ja bewußt ist, dass es längerfristig keinen Sinn hat mit geänderten Core Dateien zu arbeiten (update etc.) möchte ich gerne die Funktion in ein Plugin, Widget oder Skript auslagern und dadurch "zuschaltbar" machen. Sprich bei Aktivierung werden o.g. Elemente nicht ausgegeben. Bei Deaktivierung verhält sich alles wp-standardmäßig.
    Natürlich würde und werde ich für einzelne Elemente auch Klassen vergeben, allerdings würde ich hierbei gerne selbst entscheiden, was ausgegeben wird und wann es in welcher Form ausgegeben wird.

    wp_nav_menu ermöglicht das ja mittlerweile. Der Screenshot im Anhang zeigt die Einstellung im Adminbereich.
    Leider wirft Wordpress zusätzlich folgendes aus:

    Code
    <li id="menu-item-405" class="EigenerKlassenname menu-item menu-item-type-post_type menu-item-405"><a href="[URL="http://forum.wordpress-deutschland.org/view-source:http://swt-services.de/spanntechnik-service"]#[/URL]">Test</a>


    Wie man mit der Technik zB das .current_page_item ohne ID oder Class hervorheben will ist mir schleierhaft.


    Das aktuelle page-item dürfte natürlich als solches gekennzeichnet werden.

    Ich würde es zwar besser finden, wenn man die Klassen selbst definieren kann, aber solange man sie nicht verwendet ist's: wurscht.


    Genau. Es wäre doch sicher nicht schwer diese Funktion einzubauen. Vielleicht ist Sie ja bereits in Wordpress 3 eingebaut und ich/wir findet/finden Sie nur nicht.

  • Ad Screenreader) Na dann hab ich ja gleich mal was für Dich: Ich verwende diese function als Template Tag das ich vor wp_nav_menu() einsetze um Screenreader "nicht zu nerven".

    PHP
    if ( !function_exists('skip_navigation_link') ) {
            function skip_navigation_link( $id_to_link_to ) {
                echo '<div class="skip-link screen-reader-text">';
                    echo '<a href="#'.$id_to_link_to.'"  title="';esc_attr_e( 'Skip to content', 'lang' );echo '">'.__( 'Skip  to content', 'your_textdomain' ).'</a>';
                echo '</div>';
            }
        }

    Du brauchst eigentlich nur mehr skip_navigation_link('content'); oder wie auch immer Dein folge-div (o.Ä.) einzusetzen. Das erspart dem Screenreader sich damit zu beschäftigen, wenn er eh schon auf der richtigen Seite ist.

    Ad .current_page_item) Eigentlich geht es schon, aber der Code ist nicht wiederverwendbar. Würde aus diesem und anderen Gründen davon abraten. Folgender Attribut Selektor ermöglicht Dir die auswahl. Mit klugen Css (URl auslesen) kombiniert, kannst Du das dann schon erreichen. Aber Styles serverseitig mounten und definieren ist imho ein schlechter Plan und das Gegenteil von schlankem Code.

    Code
    a[href="/thema-1"] { color: red; }

    Ad Nav-Menu umbauen) Wenn Du es Dir antun willst, dann musst Du in /core_root/wp-includes/nav-menu-template.php nachschauen und die entsprechenden action filter nutzen. Es gibt da noch und nöcher. Im schlimmsten Fall musst Du Dir halt einen eigenen Walker bauen.

    Randnotiz: Das nav menu baut auf dem Woo-themes menu auf. Du kannst Dir also auch alte Woo-Themes holen (pre 3.0) und das dortige nutzen/klonen.

    Mal ehrlich: Ich hab jetzt 20min gebraucht nur um die Frage zu beantworten und frag mich schon ob das dafür steht. Stell Dir die Frage vielleicht auch selbst mal.

    Gutes Gelingen.

  • PHP
    echo '<div class="skip-link screen-reader-text">';

    Du brauchst eigentlich nur mehr skip_navigation_link('content');


    ACK, ein Skip-Link ist sinnvoll.
    Aber sein Einsatz hebt nicht das Ziel "schlanker (Navi-)Code" auf.

    Apropos schlank:

    Als Markup für Skiplinks bietet sich sowas an:

    Code
    <div id="skip">...</div>

    statt

    Code
    <div class="skip-link screen-reader-text>...</div>


    Ad .current_page_item) Eigentlich geht es schon, aber der Code ist nicht wiederverwendbar. [...]

    Code
    a[href="/thema-1"] { color: red; }


    In meinem Beispiel ist "Thema 2" der Link, der zur aktiven Seite gehört.
    Wollte man den Eintrag also rot hervorheben:

    Code
    #nav strong { color: red; }

    Ansonsten: in gutem Code will man keinen Link, der auf die gerade aktive Seite zeigt.
    Soweit ich weiß, kann WP das von Hause aus nicht.
    Von Thomas Scholz gibt es ein Plugin, welches die Links rauswirft.
    http://toscho.de/2009/deppenlink-entfernen/

  • Ad Hä?) ACK = ?

    Ad class/ID & Markup)
    Was da jetzt besser sein soll, lass ich mir gerne erklären...

    Ad roter Link & strong) Kannst Du das in funktionierendem Code erläutern? Wie kommt das strong auf die aktive Seite, etc.

    Ad Plugin & aktive Seite) rel="canonical" für interne Links ist schon ein Fortschritt. Und ansonsten kann man glaub ich von blind != blöd ausgehen. Ein wechselnder Cursor, andere Farbe, etc. reichen in der Regel um auch Pensionisten und Verwirrten das ganze benutzbar zu machen. Weiters: Es sei gesagt, dass Thomas ja wirklich einer der ganz guten Entwickler hier ist. Trotzdem wirkt sich sein neues (schau die Seite nochmals genau an -> Link ganz oben) Plugin auf den "template_redirect" filter aus. Ob es wirklich notwendig ist jeden(!) Link durch zu checken sei mal dahin gestellt und hängt vom Einsatzzweck ab. Ich bin eher nicht der Fan von fremden Plugins, weil diese ja jeden Einsatzzweck abdecken sollten, sondern eher von eigenen Lösungen. Und solange es nur um wp_nav_menu() geht, würde ich auch nur dort filtern. Siehe zB (filter) "wp_nav_menu_items" & "wp_nav_menu_{$menu->slug}_items"

    Ad Css)
    folgende Filter kann ich empfehlen: nav_menu_css_class, nav_menu_item_id, etc.

    Schaut doch bitte wirklich mal die Core Datei an. Ein filter ist schnell in der Theme-functions.php erstellt und updatesicher abgelegt. Das erspart weitere Diskussionen.

    Nachsatz: Bitte vergesst nicht Eure Lösung hier auch für andere User zu dokumentieren. Das ist ein Lösungsarchiv, dass auch von Google halbwegs brauchbar indexiert wird. Dankeschön.

  • Zitat

    Ad Hä?) ACK = ?


    Sorry, ich vergas, dass dieser Jargon nicht allgemein im Netz üblich ist.
    ACK steht für Acknowledgment, also Zustimmung.
    https://secure.wikimedia.org/wikipedia/de/w…28Netzjargon%29

    Zitat

    Ad class/ID & Markup) Was da jetzt besser sein soll, lass ich mir gerne erklären...


    Es ist kürzer und klarer.

    Zitat


    Ad roter Link & strong) Kannst Du das in funktionierendem Code erläutern? Wie kommt das strong auf die aktive Seite, etc.


    Missverständnis.
    Das war nur ein Beispiel für guten, also wünschenswerten Navicode.

    WP kann ihn zur Zeit nicht erzeugen.
    Mit dem erwähnten Plugin von Thomas kann man das nachbessern.

    Ansonsten:
    Ich bin absoluter WP-Neuling.
    Der Ursprungsposter ist ein Freund von mir und hat mir eine kleine WP-Einführung verpasst.
    Ich habe mich hier im Thread nur ungefragt ein wenig eingemischt, weil es bei einigen Unterthemen um die Qualität von HTML ging.

  • Alles kein Problem. Um das ganze jetzt abzuschließen:

    Das einfach in der functions.php des Themes ablegen. Ist ungetestet, sollte aber ok sein.

    Firebug laden! Foreregeln bitte lesen. FAQ. Bitte keine Anfragen per PN.

    Einmal editiert, zuletzt von kaiser (11. Dezember 2010 um 20:07)

  • hallo kaiser,

    funktioniert leider nicht :/

    muss doch irgendwie gehn die css class komplett auszublenden um eigene zu verwenden...

  • so, habs doch hinbekommen aber im Quelltext taucht die wp-eigene class trotzdem auf... naja

    hier der code in der functions.php

    PHP
    function my_wp_nav_menu_args( $args = '' )
    {
        $args['container'] = false;
        return $args;
    } // function
    
    
    add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );

Jetzt mitmachen!

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