Inurl php vlastní menu id pyramida. Víceúrovňové menu v PHP a MySQL

Žádná webová stránka není kompletní bez navigace nebo, jak tomu také říkají, „nabídky stránek“. Nabídka webu tedy může být jednoúrovňová nebo víceúrovňová ve formě stromu. Pokud neexistují žádné zvláštní potíže z hlediska implementace s jednoúrovňovým menu, pak při vytváření víceúrovňového menu musíte pečlivě přemýšlet.

Nejdůležitější v tomto úkolu je navrhnout databázi pro naše víceúrovňové menu. Vytvořme tabulku kategorií se třemi poli id, titul, rodič Kde:

  • ID- identifikátor
  • Titul- Název menu
  • Rodič- Výchozí nadřazená kategorie 0

Pole je zodpovědné za větvení menu Rodič Li Rodič = 0, pak je tato kategorie nadřazenou kategorií. Chcete-li přidat potomky do nadřazené kategorie, musíte zadat v nadřazeném poli ID správný rodič. Například:

Tabulky s kategoriemi

Jak je z tabulky patrné, nadřazená kategorie Auta jsou dva potomci - to je Mazda A Honda související podle oboru Rodič. A kategorie Motocykly jsou dva potomci Kawasaki A Harley. Přitom kategorie Lodě nemá žádné potomky. Doufám, že rozumíte tomu, jak propojit kategorie.

Dále přejdeme od slov k procvičování. Vytvoříme tabulku kategorií.

VYTVOŘIT TABULKU, POKUD NEEXISTUJE `kategorie` (`id` int(10) nepodepsané NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NENÍ NULL, PRIMÁRNÍ KLÍČ (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Výpis dat z tabulky `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`) VALUES (1, "Auta", 0), (2, "Motocykly", 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, "Lodě", 0), (12, "Liftback" , 8), (13, "Crossover", 8), (14, "Bílá", 13), (15, "Červená", 13), (16, "Černá", 13), (17, "Zelená" , 13), (18, "Mazda CX", 3), (19, "Mazda MX", 3);

Algoritmus práce se skládá z následujícího:

Vytvořte připojení k databázi

dotaz("SET NAMES "utf8""); /* * Toto je "oficiální" objektově orientovaný způsob, jak toho dosáhnout * $connect_error však nefungovalo až do verzí PHP 5.2.9 a 5.3.0. */ if ($mysqli->connect_error) ( die("Chyba připojení (" . $mysqli->connect_errno. ") " . $mysqli->connect_error); ) /* * Pokud si potřebujete být jisti kompatibilitou s verzemi před 5.2 .9, * je lepší použít tento kód */ if (mysqli_connect_error()) ( die("Chyba připojení (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

Psaní funkce pro získání dat z tabulky Categories

//Získejte pole naší nabídky z databáze jako funkci pole getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Vytvořit pole, kde klíčem pole je ID nabídky $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $ kočka ;)

Dostaneme pole, jako je toto, kde klíč pole je ID kategorie.

Funkce konstrukce z masivního dřeva od Tommyho Lacroixe

//Funkce pro sestavení stromu z pole od Tommyho Lacroix funkce getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Pokud nejsou žádné přílohy if ( !$node[" rodič"])( $strom[$id] = &$uzel; )else( //Pokud existují děti, projděte pole $dataset[$node["parent"]]["childs "][$id] = &$ uzel; ) ) vrátit $strom; )

Dostaneme pole ve tvaru stromu

Celý scénář

dotaz("SET NAMES "utf8""); /* * Toto je "oficiální" objektově orientovaný způsob, jak toho dosáhnout * $connect_error však nefungovalo až do verzí PHP 5.2.9 a 5.3.0. */ if ($mysqli->connect_error) ( die("Chyba připojení (" . $mysqli->connect_errno. ") " . $mysqli->connect_error); ) /* * Pokud si potřebujete být jisti kompatibilitou s verzemi před 5.2 .9, * je lepší použít tento kód */ if (mysqli_connect_error()) ( die("Chyba připojení (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Získat pole naší nabídky z databáze jako funkce pole getCat($mysqli)( $sql = "SELECT * FROM `kategorie`"; $res = $mysqli->query($sql); //Vytvoří pole, kde je klíč pole je ID nabídky $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; ) //Funkce pro vytvoření stromu z pole od Tommyho Lacroix funkce getTree($dataset) ( $tree = array(); foreach ($dataset jako $id => &$node) ( //Pokud nejsou žádné přílohy if (!$node[ "rodič"])( $strom[$id] = &$uzel; )else( //Pokud existují potomci, projděte pole $dataset[$node["rodič"]]["dítě"][$ id] = &$node; ) ) return $tree; ) //Získejte připravené pole s daty $cat = getCat($mysqli); //Vytvoření stromové nabídky $tree = getTree($cat); //Šablona pro zobrazení nabídky ve formě stromové funkce tplMenu($category)( $menu = "
  • ". $category["title"].""; if(isset($category["childs"]))( $menu .= "
      ". showCat($category["childs"]) ."
    ";) $menu .="
  • "; return $menu; ) /** * Přečtěte si naši šablonu rekurzivně **/ funkce showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) return $string; ) //Získat HTML značku $cat_menu = showCat($tree); //Zobrazit echo "
      ".$cat_menu."
    "; ?>

    Výsledek práce

    Víceúrovňové menu v PHP + MySQL pro administrátorský panel

    Chcete-li použít tuto nabídku na panelu správce vašeho webu, musíte přepsat několik funkcí tplMenu(), showCat().

    ".$category["title"].""; )else( $menu = " "; ) if(isset($kategorie["děti"]))( $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 ""; ?>

    Výsledek práce

    Vyberte auta → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ Bílá →→→→ Červená → →→→ Černá →→→→ Zelená →→ Mazda CX →→ Mazda MX → Motocykly Honda → Kawasaki → Harley Boats

    Pokud vás zajímá odpověď na otázku, jak vytvořit menu webu, pak jste na správné adrese.

    Podíváme se na vytvoření dynamického menu v PHP, napsaného speciálně pro programování figurín, stejně jako pro ty, kteří jsou stále v nádrži.

    Lekce 3. Tvorba menu v php pro dynamický web - pro figuríny

    Pojďme vytvořit budoucí vzhled našeho webu. Za tímto účelem nakreslíme super krásný web ve Photoshopu a rozřežeme ho na kousky. Představme si, že záhlaví, logo, menu a zápatí nejsou psány slovy, jako v tomto příkladu, ale jedná se o elegantně a barevně navržené prvky webu.

    Vytvořme si například tři stránky a nazvěme je Sekce 1, Sekce 2, Sekce 3

    Tento text se bude na různých stránkách lišit, ale nebudeme se s tím obtěžovat a ponecháme jej tak, jak je na všech stránkách.

    Začneme vytvářet web v PHP.

    1. Vyberte bloky záhlaví, loga, nabídky, zápatí do samostatných souborů s příponou php nebo html

    header.html

    logo.html

    menu.html

    zápatí.html

    Přidejme soubor s tímto textem, abychom jej viděli na všech stránkách. Zavolejme mu text.html

    Poznámka. Od této chvíle budu další záznamy vést přímo v kartotéce. text.html

    2. Vytvořme si šablonu pro náš web v PHP.

    K tomu uděláme jednoduchou věc – uložíme skutečný soubor, ale s příponou php a smažeme veškerý textový obsah. Sice to není odborné, ale dá se to pochopit, ale vše si zkomplikujeme později. Nyní je hlavní věcí pochopit princip rozvržení.

    3. Nyní nepotřebujeme soubor template.html.

    Díky němu máme představu, jak náš web bude vypadat.

    4. Naší šablonou je soubor template.php

    Nyní do něj vložíme všechny prvky webu pomocí příkazu include.

    5. Vytvořme tři stránky, jak jsme to původně chtěli udělat.

    Sekce 1, zavolejme 1.php

    Sekce 2, zavolejme 2.php

    Sekce 3, zavolejme 3.php

    K tomu můžete použít nejjednodušší příkaz uložit jako...

    Dovolte mi vysvětlit pro nejmenší: otevřete soubor šablona.php a poté stiskněte uložit jako... a uložte jej pod jménem 1.php, opakujte postup a uložte stránky webu postupně 2.php, 3.php

    Skončili jsme se 3 stránkami se stejným designem. Stačí jej vložit místo souboru text.html další, doplnit o různé obrázky nebo nějaké html kódy, skripty a obsah každé stránky bude jedinečný.

    Pozornost!

    Pokud soubor není vytvořen index.php pro hlavní stránku pak v prohlížeči zadáním adresy webu neuvidíme samotný web, ale pouze adresářovou strukturu (seznam složek).

    Můžete se podívat do Denveru a přesvědčit se sami. Pojďme situaci napravit – vytvořte soubor index.php a bez dalších řečí zavoláme Domov. Zároveň vytvoříme soubor text-home.html a pomocí příkazu zahrnout vložte jej na nově vytvořenou hlavní stránku webu.

    6. Jak zobrazit web v php?

    Jen neuvidíme, co se stalo. Toto již není šablona s příponou html.

    Ale taky to není problém. Potřebujeme vlastní, tzn. lokální server na vašem počítači. Za tímto účelem si nainstalujeme Denver a podíváme se na výsledek naší práce v prohlížeči, aniž bychom museli být online.

    Teď je to pořadí. Zadal jsem adresu webu a viděl jsem vše, co bylo právě vytvořeno, v normální podobě s designem.

    Nyní se podívejme na nabídku PHP stránek.

    1. Otevřete soubor menu.html a proměňte části 1, 2 a 3 na odkazy na webu. Odkazy v PHP se vytvářejí různými způsoby.

    Naším úkolem je naučit se vnímat stránky vytvořené v PHP. Proto uděláme odkazy jako na běžném statickém webu Sekce 1 atd.

    Absolutně miluji tento proces vytváření odkazů v Macromedia Dreamweaver. Mít čas sklízet OK a pít kávu.

    2. Jak učinit odkaz v menu neaktivním, pokud je návštěvník na této stránce.

    Pro návštěvníka bude pohodlnější pohybovat se po webu s vědomím, na které stránce se nachází.

    Pokud jste postupovali přesně podle všech kroků bod po bodu, uvidíte, že všechny odkazy v nabídce jsou vždy aktivní. jak to opravit?

    Nejprve si připomeňme definici toho, co to je Podmíněné výroky

    – to je, když je nebo není provedena nějaká akce v závislosti na podmínkách.

    Udělejme následující:

    • Budeme potřebovat proměnné a jeden podmíněný operátor:

    if ($master == "Hlavní")// tato podmínka. Pokud je spuštěn, pak se na toto místo nabídky pomocí příkazu echo vloží běžné HTML značky, které zobrazují nápis „Home“.

    echo"

    Domov

    ";

    jiný// znamená „jinak“ - co se stane, když podmínka nebude splněna. V tomto případě, pokud podmínka není splněna, bude nápis „Domů“ odkazem vedoucím na hlavní stránku.

    echo"

    Domov

    ";

    • Vymysleli jsme podmínku, ale tak kontrolní proměnnámusíte se na to zeptat.

    Za tímto účelem umístíme na všechny stránky následující bloky kódu:

    $master = "Hlavní";

    $master = "Sekce 1";

    $master = "Sekce 2";

    $master = "Sekce 3";

    Jak vidíte, každá stránka má svůj vlastní kód.

    Takže naše praktické kroky pro vytvoření nabídky PHP budou následující:

    1) Otevřete soubor index.php

    a vložte kód

    $master = "Hlavní";

    na místo, kam vložíte kód, který zobrazí samotnou nabídku webu zahrnout "menu.html";
    ?>

    2) Otevřete soubor menu.html a vložte kód s podmínkou místo jednoduchého html odkazu na hlavní stránku.

    Díváme se do prohlížeče a obdivujeme! Pokud přejdeme na hlavní stránku, odkaz již není aktivní!

    3) Opakujte body 1 a 2 se stránkami 1.php, 2.php, 3.php

    Opakování 1:

    1) Otevřete soubor 1.php a vložte před kód, který zobrazuje blok nabídky s danou proměnnou

    $master = "Sekce 1";

    2) Otevřete soubor menu.html a místo jednoduchého odkazu vložte kód s podmínkou Sekce 1, provádějící následující změny:

    if ($master == "Sekce 1")// tato podmínka. Pokud je spuštěn, pak se na toto místo nabídky pomocí příkazu echo vloží běžné HTML značky, které zobrazují nápis „Section 1“.

    echo"

    Sekce 1

    ";

    jiný// znamená „jinak“ - co se stane, když podmínka nebude splněna. V tomto případě, není-li podmínka splněna, bude nápis „Sekce 1“ odkazem vedoucím na hlavní stránku.

    echo"

    Sekce 1

    ";

    Zázrak se stal znovu! Nyní, pokud jsme na stránce Sekce 1, odkaz v menu není aktivní.

    Opakování je matka učení! Nebo pro ty v nádrži! Znovu

    Opakování 2

    1) Otevřete soubor 2.php a vložte kód.

    $master = "Sekce 2";

    2) Znovu otevřete soubor menu.html a vložte kód s podmínkou

    if ($master == "Sekce 2")// tato podmínka. Pokud je spuštěn, pak se na toto místo nabídky pomocí příkazu echo vloží běžné HTML značky, které zobrazují nápis „Section 2“.

    echo"

    Sekce 2

    ";

    jiný// znamená „jinak“ - co se stane, když podmínka nebude splněna. V tomto případě, není-li podmínka splněna, bude nápis „Sekce 2“ odkazem vedoucím na hlavní stránku.

    echo"

    Sekce 2

    ";

    Opakování 3

    1) Otevírací soubor 3.php a nastavte proměnnou.

    $master = "Sekce 3";

    2) Do souboru menu.html vložíme místo odkazu kód s podmínkou Sekce 3, změny jsou:

    if ($master == "Sekce 3")// tato podmínka. Pokud je spuštěn, pak se na toto místo nabídky pomocí příkazu echo vloží běžné HTML značky, které zobrazují nápis „Section 3“.

    echo"

    Sekce 3

    ";

    jiný// znamená „jinak“ - co se stane, když podmínka nebude splněna. V tomto případě, není-li podmínka splněna, bude nápis „Sekce 3“ odkazem vedoucím na hlavní stránku.

    echo"

    Sekce 3

    ";

    Sečteno a podtrženo: místo odkazů v tomto typu nabídky

    Domov


    Sekce 1

    Sekce 2


    Sekce 3

    Tato lekce o php byla napsána jako odpověď na četné požadavky návštěvníků webu a je praktickým průvodcem, jak se naučit vytvořit dynamické menu pro web v php.

    Další webmasterův cheat sheet vám řekne, jak vytvořit jedinečné názvy, popisy a klíčová slova pro každou stránku v PHP.

    Můžete si stáhnout archiv se všemi šablonami webu a soubory php menu. Doporučeno pro začátečníky v programování.

    Pokud jste připraveni vážně studovat PHP, pak je těžké najít lepší video kurz od Popova. Má spoustu zkušeností a dobrý styl.

    ]]> ]]>

    V předminulém článku na blogu jsem psal o zajímavých inovacích nejnovější verze WordPressu – speciálním mechanismu pro vytváření a správu . Nyní je pro běžné uživatele mnohem pohodlnější a snazší vytvářet menu různé složitosti, která se mohou skládat nejen ze stránek nebo kategorií blogů, ale mohou obsahovat i odkazy na libovolné URL. Pro zobrazení menu v šabloně se používá speciální funkce wp_nav_menu - dnes vám o tom povím.

    Pokud v adminu WordPressu není žádná sekce menu, můžete ji aktivovat přidáním speciálního kódu do souboru functions.php

    Zde je nejprve název menu, které jsme vytvořili. Jedná se o použití funkce v obecném případě bez widgetů, tam s nimi budete muset pracovat trochu jinak. Funkce wp_nav_menu však může být zobrazena bez argumentů, v důsledku čehož budou „prohledány“ různé situace - nejprve shoda podle názvu nabídky, pokud je pro ni zadána alespoň jedna položka nabídky, jinak neprázdná nabídka se jednoduše zobrazí atd. . Ale znovu vám radím, abyste jednoduše použili výše uvedený kód a nezjišťovali, co má funkce bez argumentů vypsat. Jeho syntaxe je následující:

    Používají se zde následující parametry:

    $menu— vybraný identifikátor nabídky — ID, slug nebo název nabídky.

    $kontejner- Při použití tohoto nastavení je nabídka UL ve výchozím nastavení „zabalena“ do kontejneru DIV.

    $container_class— označuje třídu kontejneru, ve výchozím nastavení je jeho hodnota menu-(menu slug)-container, to znamená, že v našem případě bude například třída menu-first-container.

    $container_id— do kontejneru můžete přidat ID, které není ve výchozím nastavení zadáno.

    $menu_class— třída pro prvek menu UL, jeho hodnota je menu.

    $menu_id— ID prvku ul, výchozí je menu-(slug)

    $echo— pokud nechcete zobrazit nabídku, ale vrátit hodnotu funkce, použijte pro toto nastavení hodnotu 0.

    $fallback_cb— pokud nabídka neexistuje, zavolá se funkce wp_page_menu.

    $předtím— nastaví text, který se zobrazí před odkazem A.

    $link_before— zobrazí frázi před textem odkazu, neuvedeno.

    $link_after— zobrazeno za textem odkazu, také prázdné.

    $hloubka— nastavuje počet úrovní hierarchie pro zobrazení nabídky, výchozí hodnota 0 zobrazuje celou nabídku.

    $chodec- nějaký druh nepochopitelného vlastního „chodeckého objektu“, pravděpodobně více potřebný pro pokročilé vývojáře.

    $theme_location— umístění motivu, kde bude nabídka použita, musí být aktivována pomocí register_nav_menu(), aby si ji uživatel mohl vybrat. Také jakési ne zcela jasné nastavení, zřejmě při práci s widgety.

    Příklady použití funkce wp_nav_menu

    Nejjednodušší kód uvedený v kódu je:

    Odebrání kontejneru DIV z nabídky

    "")); ?>

    Při vytváření a správě nabídky WordPress 3.0 v zásadě není nic složitého. Vývojáři výrazně zjednodušili pracovní postup a rozšířili možnosti tohoto navigačního prvku. Řešení se často používá v různých úlohách šablon, například při vytváření pro mobilní a desktopové verze. O něco později přidám pár dalších úryvků k tématu.

    P.S. Hlídat. Zajímavý a užitečný blog pro webmastery o SEO, kde najdete odpovědi na své otázky ohledně SEO.
    Společnost Aweb se dlouhodobě velmi dobře etabluje v oblasti propagace webových stránek, optimalizace a propagace vyhledávačů na internetu.

    Zobrazí vlastní nabídku vytvořenou na panelu: "Vzhled > Nabídky".

    Které navigační menu se má zobrazit (může jich být několik) je specifikováno v parametru theme_location.

    Pokud parametr theme_location není zadán, bude nabídka pro zobrazení vybrána v následujícím pořadí:

      Nabídka odpovídající ID, slugu nebo popisu předávanému v parametru „menu“ a pokud tato nabídka obsahuje alespoň jeden odkaz (jeden prvek);

      jinak není první nabídka prázdná;

      nebo zobrazí hodnotu vrácenou funkcí zadanou v parametru "fallback_cb" (ve výchozím nastavení je zde zadána funkce wp_page_menu);

    1. pokud se nic neshoduje, funkce nic nevypíše.

    Aby motiv podporoval nabídky, musíte tuto funkci povolit pomocí:
    add_theme_support("menu");

    Nebo můžete zaregistrovat místo pro nabídku pomocí register_nav_menu() , pak se podpora nabídky motivu automaticky aktivuje.

    Změna filtrů položek nabídky

    • add_filter("wp_nav_menu_args", "my_wp_nav_menu_args"); function my_wp_nav_menu_args($args = "")( $args["container"] = false; return $args; )

      #4.1. Odeberme kontejner pouze z jedné nabídky zobrazení

      "" ]); ?>

      # 5 Odstraňte ul obal

      Tento příklad odstraní obal značky ul z nabídky:

      "%3$s" ]); ?>

      # 6 Přidejte slovo na začátek nabídky

      Tento příklad ukazuje, jak přidat slovo na začátek seznamu nabídky jako položku nabídky, ale ne jako odkaz. Přidejme slovo „Seznam“ na začátek nabídky a také označme atribut id do vytvořené značky li:

      "primary", "items_wrap" => "

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

      #7 Přidejte třídy CSS do všech nabídek

      Pomocí háku můžeme přidat vlastní CSS třídy, pokud je splněna podmínka, kterou potřebujeme.

      Pokud se jedná o příspěvek a název položky nabídky je „blog“, přidejte třídu CSS:

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

      # 8 Použití vlastní funkce k sestavení nabídky

      Nejprve musíte zadat argument "walker" => new Your_Walker_Function .

      Your_Walker_Function je naše nová třída, která vytváří menu. Aby nebylo kolo znovu vynalezeno, lze jej zkopírovat z originálu, viz třída Walker_Nav_Menu. Zkopírujeme kód třídy a v případě potřeby jej jednoduše opravíme.

      Zde je příklad přidání hloubky nabídky a sudých/lichých tříd CSS k položkám nabídky (ul i li):

      // vaše vlastní třída vytváření menu: class magomra_walker_nav_menu rozšiřuje Walker_Nav_Menu ( // přidání tříd do funkce ul dílčích nabídek start_lvl(&$output, $depth) ( // třídy závislé na hloubce $indent = ($depth > 0 ? str_repeat(" \ t", $depth) : ""); // odsazení kódu $display_depth = ($depth + 1); // protože počítá první podnabídku jako 0 $classes = array("sub-menu", ($display_depth % 2 ? "nabídka-lichá" : "sudá nabídka"), ($display_depth >=2 ? "podnabídka" : ""), "hloubka nabídky-" . $display_depth); $class_names = implode ( " ", $classes); // sestavení html $output .= "\n" . $indent ."

        " . "\n"; ) // přidání hlavních/podřazených tříd do li"s a funkce odkazů start_el(&$output, $item, $depth, $args) (globálně $wp_query; $indent = ($depth > 0 ? str_repeat("\t", $depth) : ""); // odsazení kódu // třídy závislé na hloubce $depth_classes = array(($depth == 0 ? "main-menu-item" : "sub-menu- item"), ($depth >=2 ? "sub-sub-menu-item" : ""), ($depth % 2 ? "menu-item-liché" : "menu-item-sudé"), "menu -item-depth-" . $depth); $depth_class_names = esc_attr(implode(" ", $depth_classes)); // předané třídy $classes = empty($item->classes) ? array() : (pole) $ item->classes; $class_names = esc_attr(implode(" ", apply_filters("nav_menu_css_class", array_filter($classes), $item))); // sestavení html $output .= $indent ."
      • ) vrátit $položky; ) function __nav_hasSub($item_id, $items)( foreach($items as $item)( if($item->menu_item_parent && $item->menu_item_parent == $item_id) return true; ) return false; )

        #11 Přidání třídy k jednotlivým položkám nabídky

        Od verze 4.1.

        Objevil se pro to speciální háček: nav_menu_css_class. A nyní lze prostřednictvím něj přidávat nebo odebírat třídy. Například přidáme třídu my__class ke všem položkám nabídky:

        Add_filter("nav_menu_css_class", "add_my_class_to_nav_menu", 10, 2); function add_my_class_to_nav_menu($classes, $item)( /* $classes obsahuje Array( => menu-item => menu-item-type-post_type => menu-item-object-page => menu-item-284) */ $classes = "moje__třída"; vrátit $třídy; )

        Až do verze 4.1.

        Třídy prvků nabídky jsou přidány funkcí _wp_menu_item_classes_by_context(&$menu_items); . Bohužel však neposkytuje žádné filtry pro přidání vlastní třídy. Vezměme si proto řešení a použijte berličku str_replace():

        // získat nabídku místo jejího zobrazení $menu = wp_nav_menu(array("echo" => 0,)); // přidání třídy my__class ke všem položkám $menu = str_replace("class="menu-item", "class="menu-item my__class", $menu); // zobrazení echo $menu;

        #12 Zobrazit menu, pouze pokud existuje

        Ve výchozím nastavení, pokud neexistuje žádná nabídka, zobrazí se místo toho stránky webu. Pokud však potřebujete zobrazit nabídku pouze tehdy, když je vytvořena v panelu správce, zadejte parametr fallback_cb jako "__return_empty_string" :

        Wp_nav_menu(array("theme_location" => "primární-menu", "fallback_cb" => "__return_empty_string"));

        #13 Zobrazte pouze podpoložku nabídky

        Řekněme, že existuje první úroveň a každý z prvků první úrovně má vlastní podnabídku. Potřebujeme zobrazit takovou podnabídku pro položku s třídou menu-item-135:

        ## Vystřihněte všechny LI požadované podnabídky a zobrazte je ve svém bloku UL $menu = wp_nav_menu(array("theme_location" => "header_menu", "container" => "", "echo" => 0,) ); $regex_part = preg_quote("položka-nabídky-135"); // zobrazení podnabídky položky "gotovye-resheniya" preg_match("~". $regex_part .".*sub-menu[^>]+>(.*?)

      ~s", $menu, $mm); if(!empty($mm)) echo "";

      Ne příliš optimální, ale fungující příklad. Někdy to může být užitečné pro málo navštěvované stránky, kde potřebujete rychle získat výsledky.

      Třídy CSS prvku nabídky

      K prvkům nabídky jsou přidány následující třídy CSS (rozdělené podle stránky, na které se uživatel nachází):

      Pro všechny prvky na všech stránkách

        .položka menu- na všechny položky nabídky;

        .menu-item-object-(object)- na všechny prvky, kde je (objekt) nahrazen názvem typu příspěvku nebo taxonomie:
        .menu-item-object-category (pro kategorie)
        .menu-item-object-tag (pro značky)
        .menu-item-object-page (pro trvalé stránky)
        .menu-item-object-(custom)

      • .menu-item-type-(type)- na všechny prvky nabídky, kde (typ) je nahrazen typem odkazu (příspěvek nebo taxonomie). Seskupuje všechny typy odkazů:
        .menu-item-type-post_type (trvalá stránka, vlastní typ příspěvku)
        .menu-item-type-taxonomy (kategorie, značka nebo vlastní taxonomie)

      Pro prvky aktuální stránky

      • .aktuální-položka-nabídky- pokud odkaz v nabídce odpovídá adrese stránky, kterou si prohlížíte. Aktuální stránka.

      Pro nadřazené prvky prohlížené stránky

      • .aktuální-menu-rodič
      • .aktuální-(objekt)-předek
      • .aktuální-(typ)-předek

      Pro prvky nějak související s prohlíženou stránkou

      • .aktuální-menu-předek
      • .aktuální-(objekt)-předek
      • .aktuální-(typ)-předek

      Pro prvky související s hlavní stránkou webu

      • .menu-item-home

      Kompatibilní s funkcí wp_page_menu().

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

      $item objekt

      $parametry položky

      Příklady často používají prvek nabídky $item. Téměř všechny parametry tohoto prvku jsou uvedeny níže:

      Pole Popis
      ID ID položky nabídky
      menu_item_parent ID nadřazené položky nabídky
      třídy pole tříd položek nabídky
      Datum příspěvku datum přidáno
      post_modified datum poslední změny
      autor příspěvku ID uživatele, který přidal tuto položku nabídky
      titul název položky nabídky
      url odkaz na položku nabídky
      attr_title atribut title odkazu
      xfn atribut odkazu rel
      cílová atribut cílového odkazu
      aktuální rovná se 1, pokud se jedná o aktuální prvek
      aktuální_předek_položky 1, pokud je aktuální prvek vnořeným prvkem
      aktuální_rodič_položky 1, pokud je aktuální prvek nadřazeným prvkem
      menu_order sériové číslo v nabídce
      object_id ID objektu nabídky. Záznamy, podmínky atd.
      typ typ objektu menu (daň, položka)
      objekt daňové jméno, typ příspěvku: page, category, post_tag ...
      typový_štítek název lokalizovaného typu: Kategorie, Stránka
      post_rodič ID rodiče
      název_příspěvku název příspěvku
      název_příspěvku záznamová zkratka
      Příklad objektu $item
      Objekt WP_Post ( => 10 => 5 => 2019-02-11 13:33:39 => 2019-02-11 13:33:39 => => Nový => => publikovat => uzavřen => uzavřen = > => nové => => => 2019-02-11 23:10:19 => 2019-02-11 23:10:19 => => 0 => http://dh5.com/?p= 10 => 1 => nav_menu_item => => 0 => raw => 10 => 0 => 10 => custom => custom => Custom Link => New => # => => => => Array = > extra-sub-menu => menu-item => menu-item-type-custom => menu-item-object-custom => => => =>)

      Příklad použití parametru walker

      V Walker můžete určit objekt, který vytvoří menu. V tomto objektu můžete popsat HTML kód výsledného menu.

      Pokud potřebujete vytvořit menu pro nestandardní rozvržení, pak je někdy jednodušší tento objekt předělat, než rozvržení předělat.

      Jako příklad objektu walker si vezměme třídu Walker_Nav_Menu(), která se používá ve výchozím nastavení. V něm nás zajímá pouze jedna metoda, start_el() . Je to on, kdo je zodpovědný za HTML každého prvku. Zpravidla stačí změnit pouze toto. Chcete-li to provést, musíte vytvořit vlastní třídu, která rozšíří třídu Walker_Nav_Menu a specifikovat ji v parametru walker při volání nabídky.

      Podívejme se na příklad. Kód pro metodu start_el() je převzat beze změn. Jako šablonu používáme:

      Třída My_Walker_Nav_Menu rozšiřuje Walker_Nav_Menu ( /** * Spustí výstup prvku. * * @od 3.0.0 * @od 4.4.0 Byl přidán filtr (@viz "nav_menu_item_args"). * * @viz Walker::start_el() * * @param string $output Předáno odkazem. Používá se k připojení dalšího obsahu. * @param WP_Post $item Datový objekt položky nabídky. * @param int $depth Hloubka položky nabídky. Používá se pro výplň. * @param stdClass $args Objekt z argumentů wp_nav_menu(). * @param int $id ID aktuální položky. */ veřejná funkce start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) ( if (isset ($args->item_spacing) && "zahodit" === $args->item_spacing) ( $t = ""; $n = ""; ) else ( $t = "\t"; $n = "\n "; ) $indent = ($depth) ? str_repeat($t, $depth) : ""; $classes = empty($item->classes) ? array() : (pole) $item->classes; $classes = "menu-item-" . $item->ID; $args = apply_filters("nav_menu_item_args", $args, $item, $depth); $class_names = join(" ", apply_filters("nav_menu_css_class", array_filter($) class), $item, $args, $depth)); $class_names = $class_names ? " class="" . esc_attr($class_names) . """ : ""; $id = apply_filters("nav_menu_item_id", "menu-item-". $item->ID, $item, $args, $depth); $id = $id ? " id="" . esc_attr($id) . """ : ""; // vytvoří HTML kód pro element menu $output .= $indent . " "; $atts = array(); $atts["title"] = ! empty($item->attr_title) ? $item->attr_title: ""; $atts["target"] = ! empty($item- >target) ? $item->target: ""; $atts["rel"] = ! empty($item->xfn) ? $item->xfn: ""; $atts["href"] = ! prázdný ($item->url) ? $item->url: ""; $atts = apply_filters("nav_menu_link_attributes", $atts, $item, $args, $depth); $attributes = ""; foreach ($atts as $attr => $value) ( ​​if (! empty($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->after; $output .= apply_filters("walker_nav_menu_start_el", $item_output, $item, $depth, $args); ) )

      Nyní při vyvolání nabídky určete své chodítko:

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

      Hotovo, nyní bude každý prvek nabídky vytvořen podle schématu HTML, které potřebujeme.

      BEM menu pomocí filtrů

      Rozložení bude vytvořeno podle metodiky BEM:

      Soubor index.php nebo jiný pro zobrazení nabídky

      "header-menu", ]);

      Soubor funkce.php

      "Horní oblast", "zápatí-menu" => "Dolní oblast", ]); )); // Změní parametry hlavní nabídky add_filter("wp_nav_menu_args", "filter_wp_menu_args"); function filter_wp_menu_args($args) ( if ($args["theme_location"] === "header-menu") ( $args["container"] = false; $args["items_wrap"] = ""; $args[ "menu_class"] = "menu menu--hlavní menu-horizontální"; ) return $args; ) // Změna atributu id značky li 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; ) // Změňte atribut třídy značky li 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 = [ "uzel-menu", "uzel-menu--main_lvl_ " . ($depth + 1) ]; if ($item->current) ( $classes = "menu-node--active"; ) ) return $classes; ) // Změní třídu vnořeného ul add_filter(" nav_menu_submenu_css_class" , "filtr_nav_menu_submenu_css_class", 10, 3); function filter_nav_menu_submenu_css_class($classes, $args, $depth) ( if ($args->theme_location === "header-menu") ( $classes = [ "menu", "menu--dropdown", "menu--vertical " ]; ) return $classes; ) // Přidání tříd do odkazů 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"] = "menu-link"; if ($ item->current) ( $atts["class"] .= " menu-link--active"; ) ) return $atts; )

      Objednejte si velmi levné lajky pro veřejnou facebookovou stránku této služby a získejte možnost vybrat si nejen rozumnou cenu, ale i osobní podmínky pro nákup zdroje. Například si budete moci zvolit rychlost příjmu a kvalitu podepsaných stránek. Služba navíc poskytuje svým klientům záruky.

      Kód wp nav menu: wp-includes/nav-menu-template.php WP 5.2.2

      "", "container" => "div", "container_class" => "", "container_id" => "", "menu_class" => "menu", "menu_id" => "", "echo" => true, "fallback_cb" => "wp_page_menu", "before" => "", "after" => "", "link_before" => "", "link_after" => "", "items_wrap" => "" , "item_spacing" => "zachovat", "hloubka" => 0, "chodítko" => "", "umístění_tématu" => "",); $args = wp_parse_args($args, $defaults); if (! in_array($args["item_spacing"], array("preserve", "discard"), true)) ( // neplatná hodnota, vrátit se zpět na výchozí. $args["item_spacing"] = $defaults[" item_spacing"]; ) /** * Filtruje argumenty použité k zobrazení navigační nabídky. * * @od 3.0.0 * * @viz wp_nav_menu() * * @param pole $args Pole argumentů wp_nav_menu(). */ $args = apply_filters("wp_nav_menu_args", $args); $args = (objekt) $args; /** * Filtruje, zda zkratovat výstup wp_nav_menu(). * * Vrácení nenulové hodnoty do filtru zkratuje * wp_nav_menu(), přičemž tuto hodnotu zopakuje, pokud je $args->echo pravdivé, * jinak tuto hodnotu vrátí. * * @od 3.9.0 * * @viz wp_nav_menu() * * @param string|null $output Výstup nabídky Nav ke zkratování pomocí. Výchozí hodnota null. * @param stdClass $args Objekt obsahující argumenty wp_nav_menu(). */ $nav_menu = apply_filters("pre_wp_nav_menu", null, $args); if (null !== $nav_menu) ( if ($args->echo) ( echo $nav_menu; return; ) return $nav_menu; ) // Získání navigační nabídky na základě požadované nabídky $menu = wp_get_nav_menu_object($args- >menu); // Získání navigační nabídky na základě 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 ]); ) // získáme první nabídku, která obsahuje položky, pokud stále nemůžeme najít nabídku if (! $menu && ! $args->theme_location) ( $menus = wp_get_nav_menus() ; foreach ($menus jako $menu_maybe) ( if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array("update_post_term_cache" => false))) ( $menu = $menu_možná; break; ) ) ) if (prázdné $args->menu)) ( $args->menu = $menu; ) // Pokud nabídka existuje, získejte její položky. 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)); ) /* * Pokud nebyla nalezena žádná nabídka: * - Návrat (pokud byla zadána) nebo kauce. * * Pokud žádná nabídka položky byly nalezeny: * - Návrat zpět, ale pouze v případě, že nebylo zadáno žádné umístění motivu. * - Jinak kauci. */ 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, (pole) $args); ) if (! $menu || is_wp_error($menu)) ( return false; ) $ nav_menu = $items = ""; $show_container = false; if ($args->container) ( /** * Filtruje seznam značek HTML, které jsou platné pro použití jako kontejnery nabídek. * * @since 3.0.0 * * @param array $tags Přijatelné HTML značky pro použití jako nabídka kontejnery. * Výchozí je pole obsahující „div“ a „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->kontejner. $id . $třída. ">"; ) ) // Nastavení proměnných $menu_item _wp_menu_item_classes_by_context($menu_items); $sorted_menu_items = $menu_items_with_children = array(); foreach ((pole) $menu_items jako $menu_item) ( $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; if ($menu_item->menu_item_parent) ( $menu_items_with_children true[ $menu_item->ent)]]em =_) V případě potřeby přidejte třídu menu-item-has-children if ($menu_items_with_children) ( foreach ($sorted_menu_items jako &$menu_item) ( if (isset($menu_items_with_children[ $menu_item->ID ])) ( $menu_item->classes "menu-item-has-children"; ) ) ) unset($menu_items, $menu_item); /** * Filtruje seřazený seznam objektů položek nabídky před vygenerováním HTML nabídky. * * @od 3.1.0 * * pole @param $sorted_menu_items Položky nabídky seřazené podle pořadí nabídky každé položky nabídky. * @param stdClass $args Objekt obsahující argumenty wp_nav_menu(). */ $sorted_menu_items = apply_filters("wp_nav_menu_objects", $sorted_menu_items, $args); $items .= walk_nav_menu_tree($sorted_menu_items, $args->depth, $args); unset($sorted_menu_items); // Atributy 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+)$#", "-" . ++$ odpovídá, $wrap_id); ) else ( $wrap_id = $wrap_id . "-1"; ) ) ) $menu_id_slugs = $wrap_id; $wrap_class = $args->menu_class ? $args->menu_class: ""; /** * Filtruje obsah seznamu HTML pro navigační nabídky. * * @od 3.0.0 * * @viz wp_nav_menu() * * @param string $items Obsah seznamu HTML položek nabídky. * @param stdClass $args Objekt obsahující argumenty wp_nav_menu(). */ $items = apply_filters("wp_nav_menu_items", $items, $args); /** * Filtruje obsah seznamu HTML pro konkrétní navigační nabídku. * * @od 3.0.0 * * @viz wp_nav_menu() * * @param string $items Obsah seznamu HTML položek nabídky. * @param stdClass $args Objekt obsahující argumenty wp_nav_menu(). */ $items = apply_filters("wp_nav_menu_($menu->slug)_items", $items, $args); // Netiskněte žádné označení, pokud v tomto okamžiku nejsou žádné položky. 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 .= "kontejner. ">"; ) /** * Filtruje obsah HTML pro navigační nabídky. * * @od 3.0.0 * * @viz wp_nav_menu() * * @param string $nav_menu Obsah HTML pro navigační nabídku. * @param stdClass $args Objekt obsahující argumenty wp_nav_menu(). */ $nav_menu = apply_filters("wp_nav_menu", $nav_menu, $args); if ($args->echo) ( echo $nav_menu; ) else ( return $nav_menu; ) )

    V tomto článku vám ukážu, jak můžete tvořit víceúrovňové menu v PHP a MySQL. Samozřejmě můžete přijít s mnoha možnostmi, jak jej vytvořit, ale soudě podle počtu vašich otázek na toto téma potřebujete příklad. A dám to v tomto článku. Hned podotýkám, že tento článek má smysl jen pro ty, kteří vědí PHP a ví, jak s ním pracovat MySQL. Všichni ostatní si tím musí nejprve projít, nebo si přečíst nějaké knihy PHP a MySQL.

    Nejprve si v databázi vytvoříme tabulku s následujícími poli:

    • id- jedinečný identifikátor.
    • titul- kotevní odkazy v nabídce.
    • odkaz- adresa, na kterou povede položka nabídky.
    • parent_id- ID rodiče. Pokud neexistuje žádná nadřazená položka, bude mít hodnotu NULL (nebo můžete také zadat 0).

    Vyřešili jsme tabulku, teď je čas PHP kód. Plný PHP kód je uveden níže:

    $mysqli = new mysqli("localhost", "root", "", "db"); // Připojení k databázi
    $result_set = $mysqli->query("SELECT * FROM `menu`"); // Vyberte všechny záznamy z tabulky s nabídkou
    $položky = pole(); // Pole pro položky nabídky
    while (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // Vyplňte pole vzorkem z databáze
    $děti = pole(); // Pole pro přiřazování podřízených prvků jejich rodičům
    foreach ($items jako $item) (
    if ($item["rodic_id"]) $childrens[$item["id"]] = $item["rodicske_id"]; // Vyplňte pole
    }
    funkce printItem($item, $items, $childrens) (
    /* Zobrazí položku nabídky */
    echo"

  • ";
    echo "".$item["title"]."";
    $ul = nepravda; // Byly vykresleny děti?
    zatímco (pravda) (
    /* Nekonečná smyčka, kde hledáme všechny děti */
    $key = array_search($item["id"], $childrens); // Hledá se podřízený prvek
    pokud (!$key) (
    /* Nebyly nalezeny žádné děti */
    if ($ul) echo ""; // Pokud byly zobrazeny podřízené prvky, zavřete seznam
    přestávka; // Ukončení smyčky
    }
    unset($childrens[$key]); // Odstraňte nalezený prvek (aby se znovu nezobrazoval)
    pokud (!$ul) (
    echo"
      "; // Spustí interní seznam, pokud ještě nejsou žádné podřízené prvky
      $ul = true; // Nastavení příznaku
      }
      echo printItem($items[$key], $items, $childrens); // Rekurzivně zobrazí všechny podřízené prvky
      }
      echo"";
      }
      ?>

      Tento kód je zcela funkční, musíte však pochopit, že nikdo tímto způsobem nepíše (zejména výstup přes echo HTML tagy). A vaším úkolem je převzít algoritmus z tohoto kódu, ale ne kód samotný. A pak připojte tento algoritmus k vašemu motoru. Snažil jsem se pečlivě okomentovat výstupní kód víceúrovňové menu v PHP a MySQL, ale samozřejmě to není nejtransparentnější a vyžaduje docela dobré počáteční znalosti. Pokud to ještě dobře nevíte PHP a MySQL, pak důrazně doporučuji projít nejprve tímto