I bloggartikkelen før sist skrev jeg om en interessant innovasjon i den nyeste versjonen av wordpress - en spesiell mekanisme for å lage og administrere . Nå har det blitt mye mer praktisk og enklere for vanlige brukere å lage menyer av ulik kompleksitet, som ikke bare kan bestå av bloggsider eller kategorier, men også ha lenker til en hvilken som helst URL. For å vise menyen i malen, brukes en spesiell wp_nav_menu-funksjon - jeg skal fortelle deg om det i dag.

Hvis det ikke er noen menydel i wordpress admin, kan den aktiveres ved å legge til spesialkode i functions.php-filen

Her er først navnet på menyen vi laget. Dette er bruken av en funksjon i det generelle tilfellet uten widgets, du må jobbe med dem litt annerledes der. Ikke desto mindre kan wp_nav_menu-funksjonen også vises uten argumenter, som et resultat av at forskjellige situasjoner vil bli "vist" - først, en overensstemmelse med navnet på menyen, hvis minst ett menyelement er spesifisert for det, ellers en ikke -tom meny vil vises, og så videre. . Men igjen, jeg anbefaler deg å ganske enkelt bruke koden ovenfor og ikke finne ut hva funksjonen uten argumenter skal sende ut. Syntaksen ser slik ut:

Følgende parametere brukes her:

$meny- den valgte identifikatoren for menyen - ID, slug eller menynavn.

$container- standard UL-menyen er "pakket inn" i en DIV-beholder med denne innstillingen.

$container_class- indikerer klassen til beholderen, som standard er verdien menu-(meny slug)-container, det vil si i vårt tilfelle, for eksempel, vil det være en meny-first-container-klasse.

$container_id- du kan legge til en ID til beholderen, den er ikke spesifisert som standard.

$menu_class er klassen for UL-menyelementet, verdien er meny.

$menu_id- ID for ul-elementet, standard til meny-(slug)

$ekko- hvis du ikke vil vise menyen, men returnere verdien til funksjonen, bruk verdien 0 for denne innstillingen.

$fallback_cb- hvis menyen ikke eksisterer, kalles wp_page_menu-funksjonen.

$før- setter teksten som vises før lenken A.

$link_before— viser en setning før lenketeksten, ikke angitt.

$link_after- vises etter lenketeksten, også tom.

$dybde- setter antall hierarkinivåer for visning av menyen, standardverdien 0 viser hele menyen.

$walker- en slags uforståelig bruker-"walker-objekt", sannsynligvis vil mer avanserte utviklere trenge det.

$theme_location- Plasseringen av temaet der menyen skal brukes må aktiveres via register_nav_menu() for at brukeren skal kunne velge det. Også en slags ikke helt klar innstilling, tilsynelatende, når du arbeider med widgets.

Eksempler på bruk av funksjonen wp_nav_menu

Den enkleste koden gitt i kodeksen:

Fjerne DIV-beholderen fra menyen

"")); ?>

I prinsippet er det ikke noe komplisert i å lage og administrere wordpress 3.0-menyer. Utviklerne har i stor grad forenklet arbeidsprosedyren og utvidet mulighetene til dette navigasjonselementet. Løsningen brukes ofte i mange maloppgaver, for eksempel ved oppretting for mobil- og desktopversjoner. Litt senere vil jeg legge til et par utdrag til om emnet.

P.S. Vakt. Interessant og nyttig for webansvarlige Blogg om SEO, hvor du finner svar på dine spørsmål om SEO.
Aweb-selskapet har lenge og meget godt etablert seg innen nettstedpromotering, optimering og søkemotorpromotering på Internett.

I denne artikkelen vil jeg vise deg hvordan du lager flernivåmeny i PHP og MySQL. Selvfølgelig kan du komme opp med mange alternativer for å lage det, men å dømme etter antall spørsmål om dette emnet, trenger du et eksempel. Og jeg vil presentere det i denne artikkelen. Jeg merker med en gang at denne artikkelen gir mening bare for de som vet PHP og er i stand til å jobbe med MySQL. Alle andre må gå gjennom denne først, eller lese noen bøker om PHP og MySQL.

La oss først lage en tabell i databasen med følgende felt:

  • id- unik identifikator.
  • tittel- Ankerlenker i menyen.
  • link- adressen som menyelementet vil føre til.
  • foreldre-ID- foreldre-ID. Hvis det ikke er noe overordnet element, vil det være NULL (eller du kan sette en annen 0).

Vi fant ut tabellen, nå er det på tide php-kode. Full PHP-kode gitt nedenfor:

$mysqli = new mysqli("localhost", "root", "", "db"); // Koble til databasen
$result_set = $mysqli->query("VELG * FRA `meny`"); // Gjør et utvalg av alle poster fra tabellen med menyen
$items = array(); // Matrise for menyelementer
while (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // Fyll matrisen med et utvalg fra databasen
$barn = array(); // Matrise for å matche underordnede elementer til deres overordnede
foreach ($items som $item) (
if ($item["parent_id"]) $childrens[$item["id"]] = $item["parent_id"]; // Fyll ut matrisen
}
function printItem($item, $items, $children) (
/* Vis menyelementet */
ekko "

  • ";
    echo "".$item["tittel"]."";
    $ul = usann; // Ble underordnede elementer vist?
    mens (sant)(
    /* Endless loop hvor vi søker etter alle underordnede elementer */
    $key = array_search($item["id"], $children); // Ser etter et underordnet element
    hvis (!$nøkkel) (
    /* Ingen underordnede elementer funnet */
    hvis ($ul) ekko ""; // Hvis underordnede elementer ble vist, lukk listen
    gå i stykker; // Gå ut av loopen
    }
    unset($barn[$nøkkel]); // Fjern det funnet elementet (slik at det ikke vises igjen)
    hvis (!$ul) (
    ekko "
      "; // Start den indre listen hvis det ikke var noen barn ennå
      $ul = sant; // Sett flagget
      }
      echo printItem($items[$key], $items, $children); // Rekursivt ut alle underordnede elementer
      }
      ekko "";
      }
      ?>

      Denne koden fungerer fullt ut, men du bør forstå at ingen skriver slik (spesielt utdata gjennom ekko HTML-tagger). Og din oppgave er å ta algoritmen fra denne koden, men ikke selve koden. Og koble deretter denne algoritmen til motoren din. Jeg har prøvd å kommentere utdatakoden nøye flernivåmeny i PHP og MySQL, men det er selvfølgelig ikke det mest gjennomsiktige og krever ganske god innledende kunnskap. Hvis du fortsatt ikke vet PHP og MySQL, så først anbefaler jeg på det sterkeste å gå gjennom dette

      Ikke en eneste side er komplett uten navigering, eller som "sidemenyen" også kalles. Så nettstedsmenyen kan være på ett nivå og på flere nivåer i form av et tre. Hvis det ikke er noen spesielle vanskeligheter når det gjelder implementering med en enkeltnivåmeny, må du tenke nøye når du lager en flernivåmeny.

      Det viktigste i denne oppgaven er å designe en database for flernivåmenyen vår. La oss lage en kategoritabell med tre felt id, tittel, forelder hvor:

      • ID- identifikator
      • Tittel- Menynavn
      • forelder- Standard kategori overordnet 0

      Feltet er ansvarlig for forgrening av menyen forelder hvis forelder = 0, så er denne kategorien overordnet kategori. For å legge til barn i overordnet kategori, må du spesifisere i overordnet feltet IDønsket forelder. For eksempel:

      Tabeller med kategorier

      Som det fremgår av tabellen, er overordnet kategori Biler det er to etterkommere Mazda og Honda relatert etter felt forelder. Og kategorien Motorsykler to avkom er kawasaki og harley. Samtidig har kategorien Båter ingen etterkommere. Jeg håper du forstår hvordan du kobler kategorier.

      Deretter går vi fra ord til praksis. La oss lage kategorier-tabellen.

      LAG TABELL HVIS IKKE FINNES `kategorier` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Dump `kategorier`-tabelldata -- INSERT INTO `categories` (`id`, `title`, `parent`) VERDIER (1, "Biler", 0), (2, "Motorsykler", 0) , (3, Mazda, 1), (4, Honda, 1), (5, Kawasaki, 2), (6, Harley, 2), (7, Mazda 3, 3 ), (8, "Mazda 6", 3), (9, "Sedan", 7), (10, "Hatchback", 7), (11, "Boats", 0), (12, "Liftback", 8), (13, "Crossover", 8), (14, "Hvit", 13), (15, "Rød", 13), (16, "Svart", 13), (17, "Grønn", 13), (18, Mazda CX, 3 ), (19, Mazda MX, 3);

      Algoritmen for arbeid består av følgende:

      Opprette en databasetilkobling

      query("SET NAMES "utf8""); /* * Dette er den "offisielle" objektorienterte måten å gjøre dette på * men $connect_error fungerte ikke før PHP 5.2.9 og 5.3.0. */ if ($mysqli->connect_error) ( die("Tilkobling mislyktes (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Hvis du vil være sikker på kompatibilitet med versjoner før 5.2 .9, * bedre kode som dette */ if (mysqli_connect_error()) ( die("Tilkobling mislyktes (". mysqli_connect_errno() . ") ". mysqli_connect_error()); )

      Skrive en funksjon for å hente data fra tabellen Kategorier

      //Få menyen vår fra databasen som en matrisefunksjon getCat($mysqli)( $sql = "VELG * FRA `kategorier`"; $res = $mysqli->query($sql); //Opprett en matrise hvor array-nøkkelen er meny-IDen $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) returner $cat; )

      Vi får et array som dette, hvor array-nøkkelen er kategori-ID.

      Array Tree Function av Tommy Lacroix

      //Funksjonen for å bygge et tre fra en matrise fra Tommy Lacroix-funksjonen getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Hvis det ikke er noen vedlegg hvis (!$node[" parent"])( $tree[$id] = &$node; )else( //Hvis det er underordnede, så gå gjennom matrisen $dataset[$node["parent"]][" childs"][$id] = &$ node; ) ) returner $tree; )

      Å få en matrise i form av et tre

      Hele manuset

      query("SET NAMES "utf8""); /* * Dette er den "offisielle" objektorienterte måten å gjøre dette på * men $connect_error fungerte ikke før PHP 5.2.9 og 5.3.0. */ if ($mysqli->connect_error) ( die("Tilkobling mislyktes (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Hvis du vil være sikker på kompatibilitet med versjoner før 5.2 .9, * er det bedre å bruke denne koden */ if (mysqli_connect_error()) ( die("Tilkoblingsfeil (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Få menyen vår array fra databasen som en array-funksjon getCat($mysqli)( $sql = "VELG * FRA `kategorier`"; $res = $mysqli->query($sql); //Opprett en matrise der array-nøkkelen er meny-ID $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) returner $cat; ) //Funksjon for å bygge en tre fra en array av Tommy Lacroix-funksjonen getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Hvis det ikke er noen vedlegg if (!$node["parent) "])( $tree[$id] = &$node; )else( //Hvis det er barn, iterer gjennom matrisen $dataset[$node["parent"]]["childs"][$id] = &$node; ) ) returner $tree; ) //Gjør deg klar th array med data $cat = getCat($mysqli); //Lag en tremeny $tree = getTree($cat); //Mal for å vise menyen i form av en trefunksjon tplMenu($category)( $menu = "
    • ".$category["tittel"].""; if(isset($category["barn"]))( $menu .= "
        ".showCat($category["barn"]) ."
      "; ) $menu .= "
    • "; return $menu; ) /** * Les malen vår rekursivt **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) returner $string; ) //Få HTML-markering $cat_menu = showCat($tree); //Vis ekko "
        ". $cat_menu ."
      "; ?>

      Resultatet av arbeidet

      Flernivåmeny i PHP + MySQL for admin

      Hvis du vil bruke denne menyen i administrasjonspanelet på nettstedet ditt, må du skrive om et par funksjoner tplMenu(), showCat().

      ".$category["tittel"].""; )else( $menu = " "; ) if(isset($kategori["barn"]))( $i = 1; for($j = 0; $j< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

      Resultatet av arbeidet

      Velg Biler → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ Hvit →→→→ Rød →→→→ Svart →→→→ Grønn →→ Mazda CX →→ Mazda MX → Honda Motorsykler → Kawasaki → Harley Boats

      Viser en egendefinert meny opprettet i panelet: Utseende > Menyer.

      Hvilken navigasjonsmeny som skal vises (det kan være flere) er spesifisert i parameteren theme_location.

      Hvis parameteren theme_location ikke er spesifisert, vil menyen for visning bli valgt i følgende rekkefølge:

        En meny som samsvarer med ID, slug eller beskrivelse som sendes i "menu"-parameteren og hvis det er minst én lenke (ett element) i denne menyen;

        ellers er den første menyen ikke tom;

        eller, viser verdien returnert av funksjonen spesifisert i "fallback_cb"-parameteren (som standard er wp_page_menu-funksjonen spesifisert der);

      1. hvis ingenting stemmer, vil ikke funksjonen sende ut noe.

      For at temaet skal støtte menyer, må du aktivere denne funksjonen med:
      add_theme_support("menyer");

      Eller du kan registrere et sted for menyen, med register_nav_menu() , da vil temaets menystøtte bli aktivert automatisk.

      Menyelement endre filtre

      • add_filter("wp_nav_menu_args", "my_wp_nav_menu_args"); funksjon my_wp_nav_menu_args($args = "")( $args["container"] = usann; returner $args; )

        #4.1. La oss fjerne beholderen, bare én, den viste menyen

        "" ]); ?>

        #5 Fjern ul-omslaget

        Dette eksemplet vil fjerne ul-omslaget fra menyen:

        "%3$s" ]); ?>

        #6 Legg til et ord øverst på menyen

        Dette eksemplet viser hvordan du legger til et ord øverst i en menyliste, som det samme menyelementet, men ikke som en lenke. La oss legge til ordet "Liste" i begynnelsen av menyen, og også spesifisere id-attributtet for den opprettede li-taggen:

        "primær", "items_wrap" => "

        • Liste:
        • %3$s
        " ]); ?>

        #7 Legg til CSS-klasser til alle menyer

        Ved å bruke en krok kan vi legge til våre egne CSS-klasser hvis betingelsen vi trenger er oppfylt.

        La oss legge til en CSS-klasse hvis det er et innlegg og menyelementnavnet er "blogg":

        Add_filter("nav_menu_css_class", "spesial_nav_class", 10, 2); function special_nav_class($classes, $item)( if(is_single() && $item->title == "(!LANG:Blogg"){ $classes = "special-class"; } return $classes; } !}

        #8 Bruke funksjonen din til å bygge en meny

        Først må du spesifisere argumentet "walker" => new Your_Walker_Function .

        Your_Walker_Function er vår nye klasse som bygger menyen. For ikke å finne opp hjulet på nytt, kan det kopieres fra originalen, se klassen Walker_Nav_Menu . Vi kopierer klassekoden og bare fikser den der det er nødvendig.

        Her er et eksempel som legger til menydybde og partall/odde CSS-klasser til menyelementer (både ul og li):

        // tilpasset meny byggeklasse: klasse magomra_walker_nav_menu utvider Walker_Nav_Menu ( // legg til klasser til ul undermenyer funksjon start_lvl(&$utgang, $dybde) ( // dybdeavhengige klasser $indent = ($dybde > 0 ? str_repeat("\ t", $depth) : ""); // kodeinnrykk $display_depth = ($depth + 1); // fordi den teller den første undermenyen som 0 $classes = array("undermeny", ($display_depth % 2 ? "menu-odd" : "menu-even"), ($display_depth >=2 ? "sub-sub-menu" : ""), "menu-depth-" . $display_depth); $class_names = implode( " ", $classes); // build html $output .= "\n" . $indent . "

          " . "\n"; ) // legg til hoved-/underklasser til li"s og lenker funksjonen start_el(&$output, $item, $depth, $args) ( global $wp_query; $indent = ($depth > 0) ? str_repeat("\t", $depth) : ""); // kodeinnrykk // dybdeavhengige klasser $depth_classes = array(($depth == 0 ? "main-menu-item" : "undermeny- element"), ($depth >=2 ? "sub-sub-menu-item" : ""), ($depth % 2 ? "menu-item-odd" : "menu-item-even"), "meny -item-depth-" . $depth); $depth_class_names = esc_attr(implode(" ", $depth_classes)); // beståtte klasser $classes = tomme($item->classes) ? array() : (array) $ item->classes; $class_names = esc_attr(implode(" ", application_filters("nav_menu_css_class", array_filter($classes), $item))); // build html $output .= $indent . "
        • ) returnere $items; ) funksjon __nav_hasSub($item_id, $items)( foreach($items as $item)( if($item->menu_item_parent && $item->menu_item_parent == $item_id) return true; ) return usant; )

          #11 Legge til en klasse til individuelle menyelementer

          Fra versjon 4.1.

          Det er en spesiell krok for dette: nav_menu_css_class . Og nå kan klasser legges til eller fjernes gjennom den. La oss for eksempel legge til klassen min__klasse i alle menyelementer:

          Add_filter("nav_menu_css_class", "add_min_klasse_to_nav_menu", 10, 2); funksjon add_my_class_to_nav_menu($classes, $item)( /* $classes contains Array( => menu-item => menu-item-type-post_type => meny-item-object-page => meny-item-284) */ $klasser = "min_klasse"; returner $klasser; )

          Opp til versjon 4.1.

          Klasser for menyelementer legges til av funksjonen _wp_menu_item_classes_by_context(&$menu_items); . Men den har dessverre ingen filtre for å legge til klassen din. Derfor, la oss gå rundt og bruke krykken str_replace():

          // får i stedet for å vise menyen $menu = wp_nav_menu(array("echo" => 0,)); // legg til klasse min__klasse til alle elementer $menu = str_replace("class="menu-item", "class="menu-item my__class", $menu); // vis ekko $meny;

          #12 Vis meny bare hvis den eksisterer

          Som standard, hvis det ikke er noen meny, vil nettstedssider vises i stedet. Men hvis du bare vil vise menyen når den er opprettet i administrasjonspanelet, spesifiser fallback_cb-parameteren som "__return_empty_string" :

          wp_nav_menu(array("theme_location" => "primær-meny", "fallback_cb" => "__return_tom_streng"));

          #13 Viser bare menyunderpunktet

          La oss si at det er et første nivå og hvert av elementene på det første nivået har sin egen undermeny. Vi må vise en slik undermeny for et element med menyelement-135-klassen:

          ## Klipp ut alle LI-ene til den ønskede undermenyen og vis dem i vår UL-blokk $menu = wp_nav_menu(array("theme_location" => "header_menu", "container" => "", "echo" => 0,) ); $regex_part = preg_quote("menyelement-135"); // vis undermenyen til elementet "gotovye-resheniya" preg_match("~". $regex_part .".*undermeny[^>]+>(.*?)

        ~s", $meny, $mm); if(!empty($mm)) ekko "";

        Ikke veldig optimalt, men et fungerende eksempel. Noen ganger kan det være nyttig for lite besøkte nettsteder der du raskt trenger å få resultater.

        CSS-klasser for menyelementer

        Følgende CSS-klasser legges til menyelementene (atskilt av betingelsene på hvilke sider brukeren er på):

        For alle elementer på alle sider

          .meny-element- til alle menyelementer;

          .menu-item-object-(objekt)- til alle elementer, der (objekt) er erstattet med navnet på posttypen eller taksonomien:
          .menu-item-object-category (for kategorier)
          .menu-item-object-tag (for tagger)
          .menu-item-object-page (for vedvarende sider)
          .menu-item-object-(egendefinert)

        • .menu-item-type-(type)- til alle menyelementer, der (type) er erstattet av lenketypen (post eller taksonomi). Grupperer alle typer lenker:
          .menu-item-type-post_type (permanent side, tilpasset innleggstype)
          .menu-item-type-taksonomi (kategori, etikett eller tilpasset taksonomi)

        For gjeldende sideelementer

        • .current-meny-element- hvis lenken i menyen samsvarer med adressen til siden som vises. Nåværende side.

        For overordnede elementer på siden som vises

        • .current-menu-parent
        • .current-(objekt)-forfedre
        • .current-(type)-ancestor

        For elementer som på en eller annen måte er relatert til siden som vises

        • .current-menu-ancestor
        • .current-(objekt)-forfedre
        • .current-(type)-ancestor

        For elementer relatert til hovedsiden til nettstedet

        • .meny-element-hjem

        Kompatibilitet med funksjonen wp_page_menu().

        • .page_item
        • .page-item-$ID
        • .current_page_item
        • .current_page_parent
        • .current_page_ancestor

        $item objekt

        $item parametere

        Eksemplene bruker ofte $item menyelementet. Nesten alle parametere for dette elementet er vist nedenfor:

        Felt Beskrivelse
        ID Menyelement-ID
        menu_item_parent ID for det overordnede menyelementet
        klasser rekke menyelementklasser
        post dato Dato lagt til
        post_modified siste endret dato
        post_author ID for brukeren som la til dette menyelementet
        tittel menyelementets tittel
        url menyelementkobling
        attr_title tittelattributtet til lenken
        xfn rel link attributt
        mål målattributt for koblingen
        strøm er 1 hvis dette er det gjeldende elementet
        nåværende_vare_forfedre 1 hvis det gjeldende elementet er et nestet element
        gjeldende_vare_overordnet 1 hvis det gjeldende elementet er det overordnede elementet
        menu_order serienummer i menyen
        objekt-id Menyobjekt-ID. Opptegnelser, vilkår osv.
        type menyobjekttype (skatt, oppføring)
        gjenstand skattenavn, posttype: side, kategori, post_tag ...
        type_label lokalisert typenavn: Kategori, Side
        post_parent Foreldre-ID
        post_title innleggstittel
        post_name plateselskap
        $item eksempel
        WP_Post Object ( => 10 => 5 => 2019-02-11 13:33:39 => 2019-02-11 13:33:39 => => Ny => => publiser => stengt => lukket = > => ny => => => 2019-02-11 23:10:19 => 2019-02-11 23:10:19 => => 0 => http://dh5.com/?p= 10 => 1 => nav_menu_item => => 0 => rå => 10 => 0 => 10 => egendefinert => egendefinert => Custom Link => Ny => # => => => => Array = > ekstra-undermeny => meny-element => meny-element-type-egendefinert => meny-element-objekt-tilpasset => => => =>)

        Et eksempel på bruk av walker-parameteren

        I walker kan du spesifisere et objekt som skal bygge en meny. I dette objektet kan du beskrive HTML-koden til den resulterende menyen.

        Hvis du trenger å lage en meny for en ikke-standard layout, er det noen ganger lettere å lage dette objektet på nytt enn å gjøre om layouten.

        Som et eksempel på et walker-objekt, la oss ta klassen Walker_Nav_Menu() , som brukes som standard. I den er vi bare interessert i én metode start_el() . Det er han som er ansvarlig for HTML-en til hvert element. Som regel er det nok å endre bare det. For å gjøre dette, må du lage din egen klasse som vil utvide Walker_Nav_Menu-klassen og spesifisere den i walker-parameteren når du kaller menyen.

        La oss se på et eksempel. Koden til start_el()-metoden ble tatt uten endringer. Vi bruker som mal:

        Class My_Walker_Nav_Menu utvider Walker_Nav_Menu ( /** * Starter elementutgangen. * * @siden 3.0.0 * @siden 4.4.0 Filteret (@se "nav_menu_item_args") ble lagt til. * * @see Walker::start_el() * * @param string $output Sendt av referanse.Brukes for å legge til tilleggsinnhold.* @param WP_Post $item Menyelement dataobjekt.* @param int $depth Dybde av menyelement.Brukes for utfylling.* @param stdClass $args Et objekt av wp_nav_menu() argumenter. * @param int $id Gjeldende element-ID. */ offentlig funksjon start_el(&$utgang, $item, $depth = 0, $args = array(), $id = 0) ( if (isset) ($args->item_spacing) && "discard" === $args->item_spacing) ( $t = ""; $n = ""; ) annet ( $t = "\t"; $n = "\n "; ) $indent = ($depth) ? str_repeat($t, $depth) : ""; $classes = tomme($item->classes) ? array() : (array) $item->classes; $classes = "menu-item-" .$item->ID; $args = apply_filters("nav_menu_item_args", $args, $item, $depth); $class_names = join(" ", application_filters("nav_menu_css_class", array_ filter($classes), $item, $args, $depth)); $klasse_navn = $klassenavn ? " class="" .esc_attr($class_names) . """ : ""; $id = application_filters("nav_menu_item_id", "menu-item-". $item->ID, $item, $args, $depth); $id = $id ? " id="" . esc_attr($id) . """ : ""; // lag HTML-koden for menyelementet $output .= $indent . " "; $atts = array(); $atts["title"] = ! tom($item->attr_title) ? $item->attr_title: ""; $atts["target"] = !tom($item- >mål) ? $item->mål: ""; $atts["rel"] = ! tomt($item->xfn) ? $item->xfn: ""; $atts["href"] = ! tomt ($item->url) ?$item->url: ""; $atts = application_filters("nav_menu_link_attributes", $atts, $item, $args, $depth); $attributes = ""; foreach ($atts as $attr => $value) (hvis (! tomme($value)) ( $value = ("href" === $attr) ? esc_url($value) : esc_attr($value); $attributes .= " " .$attr ."="" .$value . """; ) ) $title = apply_filters("the_title", $item->title, $item->ID); $title = apply_filters("nav_menu_item_title" , $ title, $item, $args, $depth); $item_output = $args->before; $item_output .= " "; $item_output .= $args->link_before . $title . $args->link_after; $item_output .= ""; $item_output .= $args->etter; $output .= application_filters("walker_nav_menu_start_el", $item_output, $item, $depth, $args); ) )

        Nå, når vi ringer menyen, spesifiserer vi rullatoren vår:

        Wp_nav_menu(array("theme_location" => "head_menu", "walker" => ny My_Walker_Nav_Menu(),));

        Ferdig, nå vil hvert menyelement bygges i henhold til HTML-skjemaet vi trenger.

        BEM-meny med filtre

        Oppsettet vil bli dannet i henhold til BEM-metodikken:

        Fil index.php eller en annen for å vise menyen

        "header-meny", ]);

        Fil funksjoner.php

        "Top område", "footer-menu" => "Bundne område", ]); )); // Endrer hovedmenyalternativene add_filter("wp_nav_menu_args", "filter_wp_menu_args"); function filter_wp_menu_args($args) ( if ($args["theme_location"] === "header-meny") ( $args["container"] = usann; $args["items_wrap"] = ""; $args[ "menu_class"] = "menymeny--hovedmeny-horizontal"; ) returner $args; ) // Endre id-attributtet til li-taggen add_filter("nav_menu_item_id", "filter_menu_item_css_id", 10, 4); function filter_menu_item_css_id($menu_id, $item, $args, $depth) ( return $args->theme_location === "header-menu" ? "" : $menu_id; ) // Endre klasseattributtet til li-taggen add_filter( "nav_menu_css_class ", "filter_nav_menu_css_classes", 10, 4); function filter_nav_menu_css_classes($classes, $item, $args, $depth) ( if ($args->theme_location === "header-menu") ( $classes = [ "meny-node", "menu-node--main_lvl_ " . ($depth + 1) ]; if ($item->current) ( $classes = "menu-node--active"; ) ) returner $classes; ) // Endre klassen til det nestede ul add_filter(" nav_menu_submenu_css_class", "filter_nav_menu_submenu_css_class", 10, 3); function filter_nav_menu_submenu_css_class($classes, $args, $depth) ( if ($args->theme_location === "header-menu") ( $classes = [ "meny", "meny--rullegardin", "meny--vertikal " ]; ) returner $klasser; ) // Legg til klasser til lenker add_filter("nav_menu_link_attributes", "filter_nav_menu_link_attributes", 10, 4); function filter_nav_menu_link_attributes($atts, $item, $args, $depth) ( if ($args->theme_location === "header-menu") ( $atts["class"] = "meny-link"; if ($ item->current) ( $atts["class"] .= "menu-link--active"; ) ) returner $atts; )

        Bestill veldig billige likes for en offentlig Facebook-side på denne tjenesten og få muligheten til å velge ikke bare en hyggelig pris, men også personlige betingelser for å kjøpe en ressurs. Så, for eksempel, vil du kunne velge hastighetsmodus for mottak og kvaliteten på signerte sider. I tillegg gir tjenesten garantier til sine kunder.

        Koden wp nav meny: wp-includes/nav-menu-template.php WP 5.2.2

        "", "container" => "div", "container_class" => "", "container_id" => "", "menu_class" => "meny", "menu_id" => "", "echo" => true, "fallback_cb" => "wp_page_menu", "before" => "", "after" => "", "link_before" => "", "link_after" => "", "items_wrap" => "" , "item_spacing" => "bevare", "dybde" => 0, "walker" => "", "theme_location" => "",); $args = wp_parse_args($args, $defaults); if (! in_array($args["item_spacing"], array("bevare", "discard"), true)) ( // ugyldig verdi, fall tilbake til standard. $args["item_spacing"] = $defaults[" item_spacing"]; ) /** * Filtrerer argumentene som brukes til å vise en navigasjonsmeny. * * @siden 3.0.0 * * @se wp_nav_menu() * * @param array $args Array av wp_nav_menu() argumenter. */ $args = apply_filters("wp_nav_menu_args", $args); $args = (objekt) $args; /** * Filtrerer om wp_nav_menu()-utgangen skal kortsluttes. * * Å returnere en ikke-null-verdi til filteret vil kortslutte * wp_nav_menu(), og gjenta den verdien hvis $args->echo er sant, * returnere den verdien ellers. * * @siden 3.9.0 * * @se wp_nav_menu() * * @param string|null $utgang Nav-menyutgang for å kortslutte med. standard null. * @param stdClass $args Et objekt som inneholder wp_nav_menu()-argumenter. */ $nav_menu = apply_filters("pre_wp_nav_menu", null, $args); if (null !== $nav_menu) ( if ($args->echo) ( echo $nav_menu; return; ) return $nav_menu; ) // Få nav-menyen basert på den forespurte menyen $menu = wp_get_nav_menu_object($args- >meny); // Få nav-menyen basert på theme_location if (! $menu && $args->theme_location && ($locations = get_nav_menu_locations()) && isset($locations[ $args->theme_location ])) ( $menu = wp_get_nav_menu_object( $locations[ $args->theme_location ]); ) // få den første menyen som har elementer hvis vi fortsatt ikke finner en meny hvis (! $menu && ! $args->theme_location) ( $menus = wp_get_nav_menus() ; foreach ($menus som $menu_maybe) ( if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array("update_post_term_cache" => false))) ( $menu = $menu_maybe; break; ) ) if (tom(tom( $args->menu)) ( $args->menu = $menu; ) // Hvis menyen eksisterer, få dens items.if ($menu && ! is_wp_error($menu) && ! isset($menu_items)) ( $ menu_items = wp_get_nav_menu_items($menu->term_id, array("update_post_term_cache" => false)); ) /* * Hvis ingen meny ble funnet: * - Fall tilbake (hvis en var spesifisert), eller kausjon. * * Hvis ingen meny ble funnet elementer ble funnet: * - Fall tilbake, men bare hvis ingen temaplassering ble spesifisert. * - Ellers kausjon. */ if ((! $menu || is_wp_error($menu) || (isset($menu_items) && empty($menu_items) && ! $args->theme_location)) && isset($args->fallback_cb) && $args ->fallback_cb && is_callable($args->fallback_cb)) ( return call_user_func($args->fallback_cb, (array) $args); ) if (! $menu || is_wp_error($menu)) (retur falsk; ) $ nav_menu = $items = ""; $show_container = usann; if ($args->container) ( /** * Filtrerer listen over HTML-tagger som er gyldige for bruk som menybeholdere. * * @siden 3.0.0 * * @param array $tags De akseptable HTML-taggene for bruk som meny containere.* Standard er array som inneholder "div" og "nav".*/ $allowed_tags = apply_filters("wp_nav_menu_container_allowedtags", array("div", "nav")); if (is_string($args->container) && in_array ($args->container, $allowed_tags)) ( $show_container = true; $class = $args->container_class ? " class="" . esc_attr($args->container_class) . """ : " class="menu -" . $menu->slug . "-container""; $id = $args->container_id ? " id="" . esc_attr($args->container_id) . """ : ""; $nav_menu .= "<" . $args->container. $id . $klasse. ">"; ) ) // Sett opp $menu_item-variablene _wp_menu_item_classes_by_context($menu_items); $sorted_menu_items = $menu_items_with_children = array(); foreach ((array) $menu_items as $menu_item) ( $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; if ($menu_item->menu_item_parent) ( $menu_item_with_children[ $menu_item->menu_item_parent ]) / true; Legg til klassen menyelement-har-barn der det er aktuelt if ($menu_item_with_children) ( foreach ($sorted_menu_items som &$menu_item) (if (isset($menu_item_with_children[ $menu_item->ID ])) ( $menu_item->classes = "meny-element-har-barn"; ) ) ) unset($menu_items, $menu_item); /** * Filtrerer den sorterte listen over menyelementobjekter før generering av menyens HTML. * * @since 3.1.0 * * @param array $sorted_menu_items Menyelementene, sortert etter hvert menyelements menyrekkefølge. * @param stdClass $args Et objekt som inneholder wp_nav_menu()-argumenter. */ $sorted_menu_items = application_filters("wp_nav_menu_objects", $sorted_menu_items, $args); $items .= walk_nav_menu_tree($sorted_menu_items, $args->depth, $args); unset($sorted_menu_items); // Attributter if (! empty($args->menu_id)) ( $wrap_id = $args->menu_id; ) else ( $wrap_id = "menu-" . $menu->slug; while (in_array($wrap_id, $ menu_id_slugs)) ( if (preg_match("#-(\d+)$#", $wrap_id, $matches)) ( $wrap_id = preg_replace("#-(\d+)$#", "-" . ++$ matches, $wrap_id); ) else ( $wrap_id = $wrap_id . "-1"; ) ) ) $menu_id_slugs = $wrap_id; $wrap_class = $args->menu_class ? $args->menu_class: ""; /** * Filtrerer HTML-listeinnholdet for navigasjonsmenyer. * * @siden 3.0.0 * * @se wp_nav_menu() * * @param string $items HTML-listeinnholdet for menyelementene. * @param stdClass $args Et objekt som inneholder wp_nav_menu()-argumenter. */ $items = apply_filters("wp_nav_menu_items", $items, $args); /** * Filtrerer HTML-listeinnholdet for en bestemt navigasjonsmeny. * * @siden 3.0.0 * * @se wp_nav_menu() * * @param string $items HTML-listeinnholdet for menyelementene. * @param stdClass $args Et objekt som inneholder wp_nav_menu()-argumenter. */ $items = apply_filters("wp_nav_menu_($menu->slug)_items", $items, $args); // Ikke skriv ut markeringer hvis det ikke er noen elementer på dette tidspunktet. if (empty($items)) ( return false; ) $nav_menu .= sprintf($args->items_wrap, esc_attr($wrap_id), esc_attr( $wrap_class), $items); unset($items); if ($show_container) ( $nav_menu .= "container. ">"; ) /** * Filtrerer HTML-innholdet for navigasjonsmenyer. * * @siden 3.0.0 * * @se wp_nav_menu() * * @param string $nav_menu HTML-innholdet for navigasjonsmenyen. * @param stdClass $args Et objekt som inneholder wp_nav_menu()-argumenter. */ $nav_menu = apply_filters("wp_nav_menu", $nav_menu, $args); if ($args->echo) ( echo $nav_menu; ) else (retur $nav_menu; ) )