Inurl php propriul meniu piramidă de id. Meniu cu mai multe niveluri în PHP și MySQL

Niciun site web nu este complet fără navigare sau, așa cum îl numesc și ei, un „meniu site”. Deci, meniul site-ului poate fi cu un singur nivel sau cu mai multe niveluri sub forma unui arbore. Dacă nu există dificultăți deosebite în ceea ce privește implementarea cu un meniu cu un singur nivel, atunci când creați un meniu cu mai multe niveluri, trebuie să vă gândiți cu atenție.

Cel mai important lucru în această sarcină este să proiectăm baza de date pentru meniul nostru cu mai multe niveluri. Să creăm un tabel Categorii cu trei câmpuri id, titlu, mamă Unde:

  • ID- identificator
  • Titlu- Numele meniului
  • Mamă- Categoria implicită părinte 0

Câmpul este responsabil pentru ramificarea meniului Mamă Dacă Părinte = 0, atunci această categorie este categoria părinte. Pentru a adăuga descendenți în categoria părinte, trebuie să specificați în câmpul părinte ID părintele potrivit. De exemplu:

Tabele cu categorii

După cum se vede din tabel, categoria părinte Mașini sunt doi descendenți – aceasta este MazdaȘi Hondaînrudite pe domenii Mamă. Și categoria Motociclete doi descendenți sunt KawasakiȘi Harley. Totodată, categoria Bărci nu are descendenți. Sper că înțelegeți cum să legați categoriile.

Apoi trecem de la cuvinte la practică. Să creăm un tabel Categorii.

CREATE TABLE IF NU EXIST `categories` (`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 de date din tabelul `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`) VALORI (1, "Mașini", 0), (2, "Motociclete", 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, „Barci”, 0), (12, „Liftback” , 8), (13, „Crossover”, 8), (14, „Alb”, 13), (15, „Roșu”, 13), (16, „Negru”, 13), (17, „Verde” , 13), (18, „Mazda CX”, 3), (19, „Mazda MX”, 3);

Algoritmul de lucru constă în următoarele:

Creați o conexiune la baza de date

query("SET NUMELE "utf8""); /* * Acesta este modul „oficial” orientat pe obiect de a face acest lucru * cu toate acestea $connect_error nu a funcționat până la versiunile PHP 5.2.9 și 5.3.0. */ if ($mysqli->connect_error) ( die("Eroare de conectare (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Dacă trebuie să fii sigur de compatibilitatea cu versiunile înainte de 5.2 .9, * este mai bine să utilizați acest cod */ if (mysqli_connect_error()) ( die("Eroare de conectare (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

Scrierea unei funcții pentru a obține date din tabelul Categorii

//Obțineți matricea meniului nostru din baza de date ca funcție de matrice getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Creați o matrice unde cheia matricei este ID-ul meniului $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $ pisică; )

Obținem o matrice ca aceasta, unde cheia matricei este ID-ul categoriei.

Funcție de construcție din lemn masiv de la Tommy Lacroix

//Funcție pentru construirea unui arbore dintr-un tablou din funcția Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Dacă nu există atașamente dacă ( !$node[" părinte"])( $tree[$id] = &$nod; )else( //Dacă există copii, atunci iterați prin matricea $dataset[$node["părinte"]]["copii „][$id] = &$ nod; ) ) returnează $tree; )

Obținem o matrice sub forma unui arbore

Întregul scenariu

query("SET NUMELE "utf8""); /* * Acesta este modul „oficial” orientat pe obiect de a face acest lucru * cu toate acestea $connect_error nu a funcționat până la versiunile PHP 5.2.9 și 5.3.0. */ if ($mysqli->connect_error) ( die("Eroare de conectare (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Dacă trebuie să fii sigur de compatibilitatea cu versiunile înainte de 5.2 .9, * este mai bine să utilizați acest cod */ if (mysqli_connect_error()) ( die("Eroare de conectare (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Obțineți matricea a meniului nostru din baza de date ca o funcție matrice getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Creează o matrice în care cheia matricei este ID-ul meniului $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; ) //Funcție pentru construirea unui arbore dintr-un tablou din funcția Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Dacă nu există atașamente dacă (!$node[) „parent”])( $tree[$id] = &$node; )else( //Dacă există descendenți, atunci treceți prin matricea $dataset[$node[„parent”]][”childs”][$ id] = &$node; ) ) return $tree; ) //Obțineți o matrice pregătită cu date $cat = getCat($mysqli); //Creează un meniu arbore $tree = getTree($cat); //Șablon pentru afișarea unui meniu sub forma unei funcție de arbore tplMenu($category)( $meniu = "
  • ". $category["titlu"].""; if(isset($category["copii"]))( $meniu .= "
      „. showCat($category[„copii”]) .”
    "; ) $meniu .="
  • "; return $meniu; ) /** * Citiți recursiv șablonul nostru **/ function showCat($date)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) returnează $șir; ) //Obțineți marcaj HTML $cat_menu = showCat($tree); //Afișează ecou "
      ".$cat_menu."
    "; ?>

    Rezultatul muncii

    Meniu cu mai multe niveluri în PHP + MySQL pentru panoul de administrare

    Dacă doriți să utilizați acest meniu în panoul de administrare al site-ului dvs., atunci trebuie să rescrieți câteva funcții tplMenu(), showCat().

    ".$category["titlu"].""; )else( $meniu = " "; ) if(isset($categoria["copii"]))( $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 ""; ?>

    Rezultatul muncii

    Selectați Mașini → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ Alb →→→→ Roșu → →→→ Negru →→→→ Verde →→ Mazda CX →→ Mazda MX → Motociclete Honda → Kawasaki → Harley Boats

    Dacă sunteți interesat de răspunsul la întrebarea cum să creați un meniu pentru site-ul web, atunci ați ajuns la adresa potrivită.

    Ne vom uita la crearea unui meniu dinamic în PHP, scris special pentru manechine de programare, precum și pentru cei care sunt încă în rezervor.

    Lecția 3. Realizarea unui meniu în php pentru un site dinamic - pentru manechini

    Să creăm viitorul aspect al site-ului nostru. Pentru a face acest lucru, vom desena un site web super frumos în Photoshop și îl vom tăia în bucăți. Să ne imaginăm că antetul, logo-ul, meniul și subsolul nu sunt scrise în cuvinte, ca în acest exemplu, ci acestea sunt elemente ale site-ului proiectate elegant și colorat.

    Să creăm trei pagini, de exemplu, și să le numim Secțiunea 1, Secțiunea 2, Secțiunea 3

    Acest text va fi diferit pentru diferite pagini, dar nu ne vom deranja cu el și îl vom lăsa așa cum este pe toate paginile.

    Să începem să creăm un site web în PHP.

    1. Selectați antetul, logo-ul, meniul, blocurile de subsol în fișiere separate cu extensia php sau html

    header.html

    logo.html

    meniu.html

    footer.html

    Să adăugăm un fișier cu acest text, astfel încât să-l putem vedea pe toate paginile. Să-l sunăm text.html

    Notă. De acum înainte voi păstra înregistrări suplimentare direct în dosar. text.html

    2. Să creăm un șablon pentru site-ul nostru în PHP.

    Pentru a face acest lucru, vom face un lucru simplu - salvați fișierul real, dar cu extensia php și ștergeți tot conținutul textului. Poate că nu este profesional, dar este de înțeles, dar vom complica totul mai târziu. Acum, principalul lucru este să înțelegeți principiul aspectului.

    3. Acum nu avem nevoie de fișierul template.html.

    Datorită lui, avem o idee despre cum va arăta site-ul nostru.

    4. Șablonul nostru este fișierul template.php

    Acum vom insera toate elementele site-ului în el folosind comanda include.

    5. Să creăm trei pagini, așa cum urma să facem inițial.

    Sectiunea 1, Hai sa sunăm 1.php

    Sectiunea 2, Hai sa sunăm 2.php

    Secțiunea 3, Hai sa sunăm 3.php

    Pentru a face acest lucru, puteți folosi cea mai simplă comandă Salvează ca...

    Să le explic pentru cei mici: deschideți fișierul template.php, apoi apăsați Salvează ca...și salvați-l sub numele 1.php, repetați procedura și salvați secvențial paginile site-ului 2.php, 3.php

    Am ajuns să avem 3 pagini cu același design. Doar lipiți-l în loc de fișier text.html alta, completarea cu poze diferite sau niste coduri html, scripturi si continutul fiecarei pagini va fi unic.

    Atenţie!

    Dacă fișierul nu este creat index.php pentru pagina principală, apoi în browser, tastând adresa site-ului, nu vom vedea site-ul în sine, ci doar structura directoarelor (lista de foldere).

    Poți să te uiți în Denver și să vezi singur. Să remediam situația - creați un fișier index.phpși haideți să sunăm fără alte prelungiri Acasă. În același timp, să creăm un fișier text-home.htmlși folosind comanda include inserați-l pe pagina principală nou creată a site-ului.

    6. Cum să vizualizați un site web în php?

    Pur și simplu nu vom vedea ce s-a întâmplat. Acesta nu mai este un șablon cu extensie html.

    Dar nici o problemă. Avem nevoie de al nostru, adică. server local de pe computerul dvs. Pentru a face acest lucru, vom instala Denver și vom privi rezultatul muncii noastre într-un browser fără a intra online.

    Acum asta e ordinea. Am introdus adresa site-ului și am văzut tot ce tocmai fusese creat într-o formă normală cu design.

    Acum să luăm în considerare meniul PHP al site-ului.

    1. Deschideți fișierul menu.html și transformați secțiunile 1, 2 și 3 în link-uri de pe site. Link-urile în PHP sunt create în moduri diferite.

    Sarcina noastră este să învățăm cum să simțim site-ul creat în PHP. Prin urmare, vom face linkuri ca pe un site static obișnuit Secțiunea 1 etc.

    Îmi place absolut acest proces de creare a linkurilor în Macromedia Dreamweaver. Aveți timp să culegeți Bineși bea cafea.

    2. Cum să faci un link în meniu inactiv dacă vizitatorul se află pe această pagină.

    Va fi mai convenabil pentru vizitator să navigheze pe site știind pe ce pagină se află.

    Dacă ai urmat cu strictețe toți pașii punct cu punct, vei vedea că toate linkurile din meniu sunt mereu active. Cum să o repar?

    În primul rând, să ne amintim definiția a ceea ce este Declarații condiționale

    – acesta este atunci când o acțiune este efectuată sau nu, în funcție de condiții.

    Să facem următoarele:

    • Noi vom avea nevoie variabileși unul operator condițional:

    if ($master == "Principal")// această condiție. Dacă este executat, atunci în acest loc al meniului, folosind comanda echo, sunt inserate etichete HTML obișnuite care afișează inscripția „Acasă”.

    ecou"

    Acasă

    ";

    altfel// înseamnă „altfel” - ce se va întâmpla dacă condiția nu este îndeplinită. În acest caz, dacă condiția nu este îndeplinită, inscripția „Acasă” va fi un link care duce la pagina principală.

    ecou"

    Acasă

    ";

    • Am venit cu condiția, dar așa verifica variabilatrebuie să-l întrebi.

    Pentru a face acest lucru, vom plasa următoarele blocuri de cod pe toate paginile:

    $master = "Principal";

    $master = „Secțiunea 1”;

    $master = „Secțiunea 2”;

    $master = „Secțiunea 3”;

    După cum puteți vedea, fiecare pagină are propriul cod.

    Deci, pașii noștri practici pentru crearea unui meniu PHP vor fi următorii:

    1) Deschideți fișierul index.php

    și lipiți codul

    $master = "Principal";

    la locul în care introduceți codul care afișează meniul site-ului propriu-zis includeți „menu.html”;
    ?>

    2) Deschideți fișierul meniu.htmlși introduceți codul cu condiția în loc de un simplu link html către pagina principală.

    Ne uităm în browser și admirăm! Dacă mergem la pagina principală, linkul nu mai este activ!

    3) Repetați punctele 1 și 2 cu paginile 1.php, 2.php, 3.php

    Repetiția 1:

    1) Deschideți fișierul 1.php și introduceți înainte codul care afișează un bloc de meniu cu o variabilă dată

    $master = „Secțiunea 1”;

    2) Deschideți fișierul menu.html și introduceți codul cu condiția în loc de un simplu link Sectiunea 1, făcând următoarele modificări:

    dacă ($master == „Secțiunea 1”)// această condiție. Dacă este executat, atunci în acest loc al meniului, folosind comanda echo, sunt inserate etichete HTML obișnuite care afișează inscripția „Secțiunea 1”.

    ecou"

    Sectiunea 1

    ";

    altfel// înseamnă „altfel” - ce se va întâmpla dacă condiția nu este îndeplinită. În acest caz, dacă condiția nu este îndeplinită, inscripția „Secțiunea 1” va fi un link care duce la pagina principală.

    ecou"

    Sectiunea 1

    ";

    Minunea s-a întâmplat din nou! Acum dacă suntem pe pagină Sectiunea 1, linkul din meniu nu este activ.

    Repetiția este mama învățării! Sau pentru cei din rezervor! Din nou

    Repetiția 2

    1) Deschide fișierul 2.phpși lipiți codul.

    $master = „Secțiunea 2”;

    2) Deschideți din nou fișierul menu.html și inserați codul cu condiția

    dacă ($master == „Secțiunea 2”)// această condiție. Dacă este executat, atunci în acest loc al meniului, folosind comanda echo, sunt inserate etichete HTML obișnuite care afișează inscripția „Secțiunea 2”.

    ecou"

    Sectiunea 2

    ";

    altfel// înseamnă „altfel” - ce se va întâmpla dacă condiția nu este îndeplinită. În acest caz, dacă condiția nu este îndeplinită, inscripția „Secțiunea 2” va fi un link care duce la pagina principală.

    ecou"

    Sectiunea 2

    ";

    Repetiția 3

    1) Deschidere fișierul 3.phpși setați variabila.

    $master = „Secțiunea 3”;

    2) În fișierul menu.html introducem codul cu o condiție în loc de un link Secțiunea 3, modificările sunt:

    dacă ($master == „Secțiunea 3”)// această condiție. Dacă este executat, atunci în acest loc al meniului, folosind comanda echo, sunt inserate etichete HTML obișnuite care afișează inscripția „Secțiunea 3”.

    ecou"

    Secțiunea 3

    ";

    altfel// înseamnă „altfel” - ce se va întâmpla dacă condiția nu este îndeplinită. În acest caz, dacă condiția nu este îndeplinită, inscripția „Secțiunea 3” va fi un link care duce la pagina principală.

    ecou"

    Secțiunea 3

    ";

    Concluzie: în loc de link-uri în acest tip de meniu

    Acasă


    Sectiunea 1

    Sectiunea 2


    Secțiunea 3

    Această lecție despre php a fost scrisă ca răspuns la numeroase solicitări din partea vizitatorilor site-ului și este un ghid practic pentru a învăța cum să creați un meniu dinamic pentru un site în php.

    Următoarea fișă de cheat a webmasterului vă va spune cum să creați titluri, descrieri și cuvinte cheie unice pentru fiecare pagină în PHP.

    Puteți descărca arhiva cu toate șablonul site-ului și fișierele de meniu php. Recomandat pentru cei începători în programare.

    Dacă ești gata să studiezi PHP serios, atunci este dificil să găsești un curs video mai bun de la Popov. Are multă experiență și un stil bun.

    ]]> ]]>

    În articolul de pe blog înainte de ultimul, am scris despre inovațiile interesante ale celei mai recente versiuni de WordPress - un mecanism special pentru crearea și gestionarea . Acum a devenit mult mai convenabil și mai ușor pentru utilizatorii obișnuiți să creeze meniuri de complexitate diferită, care pot consta nu numai din pagini sau categorii de blog, ci și să aibă link-uri către orice adresă URL. Pentru a afișa meniul în șablon, se folosește o funcție specială wp_nav_menu - vă voi spune despre asta astăzi.

    Dacă nu există nicio secțiune de meniu în administratorul WordPress, o puteți activa adăugând cod special în fișierul functions.php

    Iată mai întâi numele meniului pe care l-am creat. Aceasta este utilizarea unei funcții în cazul general fără widget-uri; va trebui să lucrați cu ele puțin diferit acolo. Cu toate acestea, funcția wp_nav_menu poate fi scoasă fără argumente, drept urmare diferite situații vor fi „examinate” - mai întâi, o potrivire după numele meniului, dacă este specificat cel puțin un element de meniu, în caz contrar un meniu nevid pur și simplu va fi afișat etc. Dar din nou, vă sfătuiesc să utilizați pur și simplu codul de mai sus și să nu vă dați seama ce ar trebui să scoată funcția fără argumente. Sintaxa sa este următoarea:

    Următorii parametri sunt utilizați aici:

    $meniu— identificatorul selectat pentru meniu — ID, slug sau numele meniului.

    $container- Meniul UL este „împachetat” în mod implicit într-un container DIV folosind această setare.

    $container_class— indică clasa containerului, valoarea sa implicită este menu-(menu slug)-container, adică în cazul nostru, de exemplu, va exista o clasă menu-first-container.

    $container_id— puteți adăuga un ID la container, care nu este specificat în mod implicit.

    $menu_class— clasa pentru elementul de meniu UL, valoarea sa este meniu.

    $menu_id— ID pentru elementul ul, implicit la meniu-(slug)

    $ecou— dacă nu doriți să afișați meniul, dar să returnați valoarea funcției, utilizați valoarea 0 pentru această setare.

    $fallback_cb— dacă meniul nu există, se apelează funcția wp_page_menu.

    $inainte— setează textul care este afișat înaintea linkului A.

    $link_before— afișează expresia înainte de textul linkului, nespecificat.

    $link_after— afișat după textul linkului, de asemenea, gol.

    $adâncime— setează numărul de niveluri ierarhice pentru afișarea meniului; valoarea implicită 0 afișează întregul meniu.

    $walker- un fel de „obiect walker” personalizat de neînțeles, probabil mai necesar pentru dezvoltatorii avansați.

    $theme_location— locația temei în care va fi utilizat meniul trebuie să fie activată prin register_nav_menu() pentru ca utilizatorul să o poată selecta. De asemenea, un fel de setare nu complet clară, aparent, atunci când lucrați cu widget-uri.

    Exemple de utilizare a funcției wp_nav_menu

    Cel mai simplu cod din cod este:

    Eliminarea containerului DIV din meniu

    "")); ?>

    În principiu, nu este nimic complicat în crearea și gestionarea unui meniu WordPress 3.0. Dezvoltatorii au simplificat semnificativ procedura de lucru și au extins capacitățile acestui element de navigare. Soluția este adesea folosită într-o varietate de sarcini șablon, de exemplu, atunci când se creează pentru versiuni mobile și desktop. Puțin mai târziu, voi adăuga încă câteva fragmente pe acest subiect.

    P.S. gardian. Un blog interesant și util pentru webmasteri despre SEO, unde vei găsi răspunsuri la întrebările tale despre SEO.
    Compania Aweb s-a impus de mult timp foarte bine în domeniul promovării site-urilor web, al optimizării și al promovării motoarelor de căutare pe Internet.

    Afișează un meniu personalizat creat în panou: „Aspect > Meniuri”.

    Ce meniu de navigare să fie afișat (pot fi mai multe dintre ele) este specificat în parametrul theme_location.

    Dacă parametrul theme_location nu este specificat, atunci meniul pentru afișare va fi selectat în următoarea ordine:

      Un meniu care se potrivește cu ID-ul, slug-ul sau descrierea trecută în parametrul „meniu” și dacă acest meniu are cel puțin o legătură (un element);

      în caz contrar, primul meniu nu este gol;

      sau, va afișa valoarea returnată de funcția specificată în parametrul „fallback_cb” (în mod implicit, funcția wp_page_menu este specificată acolo);

    1. dacă nimic nu se potrivește, funcția nu va scoate nimic.

    Pentru ca tema să accepte meniuri, trebuie să activați această funcție folosind:
    add_theme_support ("meniuri");

    Sau puteți înregistra un loc pentru meniu folosind register_nav_menu() , apoi suportul pentru meniul temei va fi activat automat.

    Elemente de meniu modificarea filtrelor

    • add_filter("wp_nav_menu_args", "my_wp_nav_menu_args"); funcția my_wp_nav_menu_args($args = "")( $args["container"] = false; returnează $args; )

      #4.1. Să scoatem containerul dintr-un singur meniu de afișare

      "" ]); ?>

      # 5 Îndepărtați ambalajul ul

      Acest exemplu va elimina ambalajul etichetei ul dintr-un meniu:

      „%3$s” ]); ?>

      # 6 Adăugați un cuvânt la începutul meniului

      Acest exemplu arată cum să adăugați un cuvânt la începutul unei liste de meniu, ca element de meniu, dar nu un link. Să adăugăm cuvântul „List” la începutul meniului și să indicăm, de asemenea, atributul id etichetei li create:

      "primar", "items_wrap" => "

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

      # 7 Adăugați clase CSS la toate meniurile

      Folosind un cârlig, putem adăuga propriile noastre clase CSS dacă este îndeplinită condiția de care avem nevoie.

      Să adăugăm o clasă CSS dacă aceasta este o postare și titlul elementului de meniu este „blog”:

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

      #8 Utilizarea propriei funcții pentru a construi un meniu

      Mai întâi, trebuie să specificați argumentul „walker” => new Your_Walker_Function .

      Your_Walker_Function este noua noastră clasă care creează meniul. Pentru a nu reinventa roata, aceasta poate fi copiată din original, vezi clasa Walker_Nav_Menu. Copiem codul clasei și pur și simplu îl corectăm acolo unde este necesar.

      Iată un exemplu de adăugare a profunzimii meniului și a claselor CSS par/impare la elementele de meniu (atât ul, cât și li):

      // propria clasă de creare a meniului: class magomra_walker_nav_menu extinde Walker_Nav_Menu ( // adaugă clase la funcția submeniului ul start_lvl(&$output, $depth) ( // clase dependente de adâncime $indent = ($depth > 0 ? str_repeat(" \ t", $depth): ""); // cod indent $display_depth = ($depth + 1); // pentru că numără primul submeniu ca 0 $classes = array ("sub-meniu", ($display_depth) % 2 ? "meniu-impar": "meniu-par"), ($display_depth >=2 ? "sub-sub-meniu": ""), "menu-depth-" . $display_depth); $class_names = implode ( " ", $clase); // construiți html $output .= "\n" . $indent . "

        " . "\n"; ) // adaugă clasele principale/subclaselor la funcția li"-urilor și a legăturilor start_el(&$output, $item, $depth, $args) ( global $wp_query; $indent = ($depth > 0) ? str_repeat("\t", $adâncime): ""); // cod indent // clase dependente de adâncime $depth_classes = array(($depth == 0 ? "main-menu-item": "sub-meniu- element"), ($adâncime >=2 ? "sub-sub-element-meniu": ""), ($depth % 2 ? "menu-item-odd" : "meniu-articol-par"), "meniu -item-depth-" . $depth); $depth_class_names = esc_attr(implode(" ", $depth_classes)); // au trecut clase $classes = empty($item->classes) ? array() : (array) $ item->classes; $class_names = esc_attr(implode(" ", apply_filters("nav_menu_css_class", array_filter($classes), $item))); // build html $output .= $indent . "
      • ) returnează $articole; ) funcția __nav_hasSub($item_id, $items)( foreach($items as $item)( if($item->menu_item_parent && $item->menu_item_parent == $item_id) returnează adevărat; ) returnează false; )

        # 11 Adăugarea unei clase la elementele individuale de meniu

        Din versiunea 4.1.

        A apărut un cârlig special pentru aceasta: nav_menu_css_class. Și acum clasele pot fi adăugate sau eliminate prin intermediul acestuia. De exemplu, să adăugăm clasa my__class la toate elementele de meniu:

        Add_filter("nav_menu_css_class", "add_my_class_to_nav_menu", 10, 2); funcția add_my_class_to_nav_menu($classes, $item)( /* $classes conține Array( => meniu-item => meniu-item-type-post_type => meniu-item-obiect-pagina => meniu-articol-284) */ $classes = "my__class"; returnează $clase; )

        Până la versiunea 4.1.

        Clasele de elemente de meniu sunt adăugate de funcția _wp_menu_item_classes_by_context(&$menu_items); . Dar, din păcate, nu oferă niciun filtre pentru a adăuga propria clasă. Prin urmare, să luăm o soluție și să folosim cârja str_replace():

        // obțineți meniul în loc să îl afișați $menu = wp_nav_menu(array("echo" => 0,)); // adaugă clasa my__class la toate articolele $menu = str_replace("class="menu-item", "class="menu-item my__class", $meniu); // afișează echo $meniul;

        #12 Afișați meniul numai dacă acesta există

        În mod implicit, dacă nu există niciun meniu, vor fi afișate paginile site-ului. Dar dacă trebuie să afișați meniul numai atunci când este creat în panoul de administrare, specificați parametrul fallback_cb ca „__return_empty_string”:

        Wp_nav_menu(array("theme_location" => "meniu-principal", "fallback_cb" => "__return_empty_string");

        #13 Afișează numai sub-articolul din meniu

        Să presupunem că există un prim nivel și fiecare dintre elementele primului nivel are propriul său submeniu. Trebuie să afișăm un astfel de submeniu pentru un articol cu ​​clasa menu-item-135:

        ## Decupați toate LI-urile submeniului dorit și afișați-le în blocul dvs. UL $menu = wp_nav_menu(array("theme_location" => "header_menu", "container" => "", "echo" => 0,) ); $regex_part = preg_quote("articol-meniu-135"); // afișează submeniul articolului "gotovye-resheniya" preg_match ("~". $regex_part .".*sub-meniu[^>]+>(.*?)

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

      Nu foarte optim, dar un exemplu de lucru. Uneori poate fi util pentru site-urile puțin vizitate, unde trebuie să obțineți rapid rezultate.

      Element de meniu Clase CSS

      Următoarele clase CSS sunt adăugate elementelor de meniu (împărțite la pagina pe care se află utilizatorul):

      Pentru toate elementele de pe toate paginile

        .articol din meniu- la toate articolele din meniu;

        .menu-element-obiect-(obiect)- la toate elementele în care (obiectul) este înlocuit cu numele tipului de post sau taxonomiei:
        .menu-element-obiect-categorie (pentru categorii)
        .menu-item-object-tag (pentru etichete)
        .menu-item-object-page (pentru pagini permanente)
        .menu-element-obiect-(personalizat)

      • .menu-element-tip-(tip)- la toate elementele de meniu, unde (tip) este înlocuit cu tipul de link (post sau taxonomie). Grupează toate tipurile de linkuri:
        .menu-item-type-post_type (pagină persistentă, tip de postare personalizat)
        .menu-item-type-taxonomie (categorie, etichetă sau taxonomie personalizată)

      Pentru elementele paginii curente

      • .articol-curent din meniu- dacă linkul din meniu se potrivește cu adresa paginii pe care o vizualizați. Pagina curenta.

      Pentru elementele părinte ale paginii care este vizualizată

      • .curent-meniu-părinte
      • .curent-(obiect)-strămoș
      • .curent-(tip)-strămoș

      Pentru elemente legate cumva de pagina care este vizualizată

      • .curent-meniu-strămoș
      • .curent-(obiect)-strămoș
      • .curent-(tip)-strămoș

      Pentru elemente legate de pagina principală a site-ului

      • .meniu-articol-acasă

      Compatibil cu funcția wp_page_menu().

      • .page_item
      • .pagina-articol-$ID
      • .current_page_item
      • .current_page_parent
      • .current_page_ancestor

      $item obiect

      parametrii $item

      Exemplele folosesc adesea elementul de meniu $item. Aproape toți parametrii acestui element sunt prezentați mai jos:

      Camp Descriere
      ID ID element de meniu
      menu_item_parent ID-ul elementului părinte din meniu
      clase gamă de clase de elemente de meniu
      data_post Data adaugata
      post_modified data ultimei modificări
      post_autor ID-ul utilizatorului care a adăugat acest element de meniu
      titlu titlul elementului de meniu
      url link-ul articolului de meniu
      attr_title atributul de titlu al link-ului
      xfn atributul rel link
      ţintă atributul link-ului țintă
      actual este egal cu 1 dacă acesta este elementul curent
      actual_item_ancestor 1 dacă elementul curent este un element imbricat
      părinte_articol_actual 1 dacă elementul curent este elementul părinte
      meniu_ordine numărul de serie din meniu
      obiect_id ID obiect de meniu. Înregistrări, termeni etc.
      tip tip de obiect din meniu (taxă, intrare)
      obiect nume fiscal, tip post: pagină, categorie, etichetă_post...
      tip_etichetă nume de tip localizat: Categorie, Pagina
      post_parent ID de părinte
      post_title titlul postului
      nume_post scurtătură de înregistrare
      Exemplu $item obiect
      WP_Post Object ( => 10 => 5 => 2019-02-11 13:33:39 => 2019-02-11 13:33:39 => => Nou => => publica => închis => închis = > => nou => => => 2019-02-11 23:10:19 => 2019-02-11 23:10:19 => => 0 => http://dh5.com/?p= 10 => 1 => nav_menu_item => => 0 => brut => 10 => 0 => 10 => personalizat => personalizat => Legătură personalizată => Nou => # => => => => Array = > extra-sub-meniu => meniu-element => meniu-item-tip-personalizat => meniu-articol-obiect-personalizat => => => =>)

      Exemplu de utilizare a parametrului walker

      În walker puteți specifica un obiect care va construi un meniu. În acest obiect puteți descrie codul HTML al meniului rezultat.

      Dacă trebuie să creați un meniu pentru un aspect non-standard, uneori este mai ușor să refaceți acest obiect decât să refaceți aspectul.

      Ca exemplu de obiect walker, să luăm clasa Walker_Nav_Menu(), care este folosită implicit. În ea ne interesează doar o singură metodă, start_el() . El este responsabil pentru HTML-ul fiecărui element. De regulă, este suficient să schimbați doar acest lucru. Pentru a face acest lucru, trebuie să vă creați propria clasă care va extinde clasa Walker_Nav_Menu și să o specificați în parametrul walker atunci când apelați meniul.

      Să ne uităm la un exemplu. Codul pentru metoda start_el() este preluat fără modificări. Folosim ca șablon:

      Clasa My_Walker_Nav_Menu extinde Walker_Nav_Menu ( /** * Pornește ieșirea elementului. * * @de la 3.0.0 * @de la 4.4.0 Filtrul (@vede „nav_menu_item_args”) a fost adăugat. * * @see Walker::start_el() * * @param șir $ieșire Transmis prin referință. Folosit pentru a adăuga conținut suplimentar. * @param WP_Post $item Obiect de date ale articolului de meniu * @param int $depth Adâncimea articolului de meniu. Folosit pentru umplutură. * @param stdClass $args Un obiect de argumente wp_nav_menu(). * @param int $id ID curent al articolului. */ public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) ( if (isset) ($args->item_spacing) && "renunțare" === $args->item_spacing) ( $t = ""; $n = ""; ) else ( $t = "\t"; $n = "\n "; ) $indent = ($adâncime) ? str_repeat($t, $adâncime) : ""; $clase = gol($articol->clase) ? matrice () : (matrice) $articol->clase; $clase = "articol-meniu-" . $item->ID; $args = apply_filters("nav_menu_item_args", $args, $item, $depth); $class_names = join(" ", apply_filters("nav_menu_css_class", array_filter($) clase), $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) . """ : ""; // creăm cod HTML pentru elementul de meniu $output .= $indent . " "; $atts = matrice(); $atts["titlu"] = ! gol($articol->titr_attr) ? $articol->titlu_attr: ""; $atts["țintă"] = ! gol ($articol- >țintă) ? $item->țintă: ""; $atts["rel"] = ! gol($item->xfn) ? $item->xfn: ""; $atts["href"] = ! gol ($item->url) ? $item->url: ""; $atts = apply_filters("nav_menu_link_attributes", $atts, $item, $args, $depth); $attributes = ""; foreach ($atts ca $attr => $valoare) ( ​​dacă (! empty($valoare)) ( $valoare = ("href" === $attr) ? esc_url($valoare) : esc_attr($valoare); $atribute .= " " . $attr . "="" . $value . """; ) ) $title = apply_filters("the_title", $item->title, $item->ID); $title = apply_filters("nav_menu_item_title" , $ titlu, $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); ) )

      Acum, când apelați meniul, specificați mersul dvs.:

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

      Gata, acum fiecare element de meniu va fi construit conform schemei HTML de care avem nevoie.

      Meniul BEM folosind filtre

      Aspectul va fi creat conform metodologiei BEM:

      Fişier index.php sau altul pentru a afișa meniul

      "header-meniu", ]);

      Fişier funcții.php

      „Zona de sus”, „footer-menu” => „Zona de jos”, ]); )); // Schimbă parametrii meniului principal add_filter("wp_nav_menu_args", "filter_wp_menu_args"); funcția filter_wp_menu_args($args) ( dacă ($args["theme_location"] === "header-meniu") ( $args["container"] = false; $args["items_wrap"] = ""; $args[ "menu_class"] = "meniu meniu--meniu principal-orizontal"; ) return $args; ) // Schimbați atributul id al etichetei 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; ) // Schimbați atributul clasei etichetei li add_filter( „nav_menu_css_class”, „filter_nav_menu_css_classes”, 10, 4); function filter_nav_menu_css_classes($clase, $item, $args, $depth) ( if ($args->theme_location === "header-meniu") ( $classes = [ "menu-node", "menu-node--main_lvl_ " . ($depth + 1) ]; if ($item->current) ( $classes = "menu-node--active"; ) ) return $classes; ) // Schimbă clasa unui ul imbricat add_filter(" nav_menu_submenu_css_class" , "filter_nav_menu_submenu_css_class", 10, 3); function filter_nav_menu_submenu_css_class($clase, $args, $depth) ( if ($args->theme_location === "header-meniu") ( $clase = [ "meniu", "meniu--menu derulant", "meniu--vertical " ]; ) return $classes; ) // Adăugați clase la linkuri add_filter("nav_menu_link_attributes", "filter_nav_menu_link_attributes", 10, 4); funcția filter_nav_menu_link_attributes($atts, $item, $args, $depth) ( dacă ($args->theme_location === "header-meniu") ( $atts["class"] = "menu-link"; dacă ($ item->current) ( $atts["class"] .= "meniu-link--activ"; ) ) returnează $atts; )

      Comandați like-uri foarte ieftine pentru o pagină publică de Facebook pe acest serviciu și obțineți posibilitatea de a alege nu doar un preț rezonabil, ci și condiții personale pentru achiziționarea resursei. De exemplu, veți putea alege viteza de primire și calitatea paginilor semnate. În plus, serviciul oferă garanții clienților săi.

      Cod meniul wp nav: wp-includes/nav-menu-template.php WP 5.2.2

      "", "container" => "div", "container_class" => "", "container_id" => "", "menu_class" => "meniu", "menu_id" => "", "echo" => adevărat, "fallback_cb" => "wp_page_menu", "before" => "", "after" => "", "link_before" => "", "link_after" => "", "items_wrap" => "" , "item_spacing" => "preserve", "depth" => 0, "walker" => "", "theme_location" => "",); $args = wp_parse_args($args, $defaults); if (! in_array($args["item_spacing"], array("preserve", "discard"), true)) ( // valoare nevalidă, reveniți la implicit. $args["item_spacing"] = $defaults[" item_spacing"]; ) /** * Filtrează argumentele utilizate pentru afișarea unui meniu de navigare. * * @din 3.0.0 * * @see wp_nav_menu() * * @param array $args Matrice de argumente wp_nav_menu(). */ $args = apply_filters("wp_nav_menu_args", $args); $args = (obiect) $args; /** * Filtrează dacă să scurtcircuitați ieșirea wp_nav_menu(). * * Returnarea unei valori non-nule la filtru va scurtcircuita * wp_nav_menu(), ecou acea valoare dacă $args->echo este adevărat, * returnând acea valoare în caz contrar. * * @din 3.9.0 * * @see wp_nav_menu() * * @param string|null $output Ieșirea meniului Nav pentru a scurtcircuita cu. Null implicit. * @param stdClass $args Un obiect care conține argumente 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; ) // Obține meniul de navigare pe baza meniului solicitat $menu = wp_get_nav_menu_object($args- >meniu); // Obține meniul de navigare pe baza locației_temei dacă (! $menu && $args->locație_temă && ($locations = get_nav_menu_locations()) && isset($locations[ $args->theme_location ])) ( $menu = wp_get_nav_menu_object( $locations[ $args->theme_location ]); ) // obținem primul meniu care are elemente dacă tot nu putem găsi un meniu dacă (! $menu && ! $args->theme_location) ( $menius = wp_get_nav_menus() ; foreach ($meniu ca $menu_poate) ( if ($menu_items = wp_get_nav_menu_items($menu_poate->term_id, array("update_post_term_cache" => false))) ( $meniu = $menu_poate; break; ) )() ) $args->meniu)) ( $args->meniu = $meniu; ) // Dacă meniul există, obțineți elementele sale. if ($meniu && ! is_wp_error($meniu) && ! isset($menu_items)) ( $ menu_items = wp_get_nav_menu_items($menu->term_id, array("update_post_term_cache" => false)); ) /* * Dacă nu a fost găsit niciun meniu: * - Fall back (dacă a fost specificat unul), sau cauțiune. * * Dacă nu a fost găsit niciun meniu au fost găsite elemente: * - Reveniți, dar numai dacă nu a fost specificată nicio locație a temei. * - În caz contrar, cauțiune. */ if ((! $meniu || is_wp_error($meniu) || (isset($menu_items) && empty($menu_items) && ! $args->theme_location)) && isset($args->fallback_cb) && $args ->fallback_cb && is_callable($args->fallback_cb)) ( returnează call_user_func($args->fallback_cb, (matrice) $args); ) if (! $meniu || is_wp_error($meniu)) ( returnează false; ) $ nav_menu = $items = ""; $show_container = fals; if ($args->container) ( /** * Filtrează lista de etichete HTML care sunt valabile pentru a fi utilizate ca containere de meniu. * * @de la 3.0.0 * * @param array $tags Etichetele HTML acceptabile pentru a fi utilizate ca meniu containere. * Implicit este o matrice care conține „div” și „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="meniu -" . $menu->slug . "-container""; $id = $args->container_id ? " id="" . esc_attr($args->container_id) . """ : ""; $nav_menu .= "<" . $args->recipient. $id . $class. „>”; ) ) // Configurați variabilele $menu_item _wp_menu_item_classes_by_context($menu_items); $articole_meniu_sortate = $articole_meniu_cu_copii = matrice(); foreach ((matrice) $menu_items ca $menu_item) ( $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; if ($menu_item->menu_item_parent) ( $menu_items_with_children[ $menu_item->menu_item;_> _menu_item) = true_item; Adăugați clasa meniu-articol-are-copii acolo unde este cazul if ($menu_items_with_children) ( foreach ($sorted_menu_items ca &$menu_item) ( if (isset($menu_items_with_children[ $menu_item->ID ])) ( $menu_item->ID ])) "menu-element-are-children"; ) ) ) unset($menu_items, $menu_item); /** * Filtrează lista sortată de obiecte de meniu înainte de a genera codul HTML al meniului. * * @since 3.1.0 * * @param array $sorted_menu_items Elementele de meniu, sortate după ordinea meniului fiecărui element de meniu. * @param stdClass $args Un obiect care conține argumente 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($articole_menu_sortate); // Atribute if (! empty($args->menu_id)) ( $wrap_id = $args->menu_id; ) else ( $wrap_id = "meniu-" . $menu->slug; while (in_array($wrap_id, $ menu_id_slugs)) ( dacă (preg_match("#-(\d+)$#", $wrap_id, $match)) ( $wrap_id = preg_replace ("#-(\d+)$#", "-" . ++$ potriviri, $wrap_id); ) else ( $wrap_id = $wrap_id . "-1"; ) ) ) $menu_id_slugs = $wrap_id; $wrap_class = $args->menu_class ? $args->menu_class: ""; /** * Filtrează conținutul listei HTML pentru meniurile de navigare. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items Conținutul listei HTML pentru elementele de meniu. * @param stdClass $args Un obiect care conține argumente wp_nav_menu(). */ $items = apply_filters("wp_nav_menu_items", $items, $args); /** * Filtrează conținutul listei HTML pentru un anumit meniu de navigare. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items Conținutul listei HTML pentru elementele de meniu. * @param stdClass $args Un obiect care conține argumente wp_nav_menu(). */ $items = apply_filters("wp_nav_menu_($meniu->slug)_items", $items, $args); // Nu tipăriți niciun marcaj dacă nu există elemente în acest moment. 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 .= "recipient. „>”; ) /** * Filtrează conținutul HTML pentru meniurile de navigare. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $nav_menu Conținutul HTML pentru meniul de navigare. * @param stdClass $args Un obiect care conține argumente wp_nav_menu(). */ $nav_menu = apply_filters("wp_nav_menu", $nav_menu, $args); if ($args->echo) ( echo $nav_menu; ) else ( return $nav_menu; ) )

    În acest articol vă voi arăta cum puteți crea meniu pe mai multe niveluri în PHP și MySQL. Desigur, puteți veni cu multe opțiuni pentru a-l crea, dar judecând după numărul de întrebări pe această temă, aveți nevoie de un exemplu. Și o voi da în acest articol. Permiteți-mi să notez imediat că acest articol are sens doar pentru cei care știu PHPși știe să lucreze cu MySQL. Toți ceilalți trebuie să treacă prin asta mai întâi sau să citească câteva cărți PHP și MySQL.

    Mai întâi, să creăm un tabel în baza de date cu următoarele câmpuri:

    • id- identificator unic.
    • titlu- ancorați linkuri în meniu.
    • legătură- adresa la care va duce articolul de meniu.
    • parent_id- ID de părinte. Dacă nu există niciun element părinte, atunci va fi NULL (sau puteți pune și 0).

    Am aranjat masa, acum este timpul Cod PHP. Deplin Cod PHP este dat mai jos:

    $mysqli = mysqli nou("localhost", "root", "", "db"); // Conectați-vă la baza de date
    $result_set = $mysqli->query("SELECT * FROM `menu`"); // Selectați toate înregistrările din tabelul cu meniul
    $items = array(); // Matrice pentru elementele de meniu
    while (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // Umpleți matricea cu un eșantion din baza de date
    $copii = array(); // Matrice pentru potrivirea elementelor copil cu părinții lor
    foreach ($articole ca $item) (
    if ($item["parent_id"]) $childrens[$item["id"]] = $item["parent_id"]; // Umpleți matricea
    }
    funcția printItem($item, $items, $childrens) (
    /* Afișează elementul de meniu */
    ecou"

  • ";
    echo "".$item["titlu"]."";
    $ul = fals; // Au fost predați copii?
    în timp ce (adevărat) (
    /* O buclă infinită în care căutăm toți copiii */
    $key = array_search($item["id"], $copii); // Se caută un element copil
    dacă (!$cheie) (
    /* Nu s-au găsit copii */
    dacă ($ul) ecou ""; // Dacă au fost afișate elemente copil, atunci închideți lista
    pauză; // Ieși din buclă
    }
    unset($copii[$cheie]); // Eliminați elementul găsit (pentru ca acesta să nu fie afișat din nou)
    dacă (!$ul) (
    ecou"
      "; // Porniți lista internă dacă nu există încă elemente copil
      $ul = adevărat; // Setați steagul
      }
      echo printItem($articole[$cheie], $articole, $copii); // Afișează recursiv toate elementele copil
      }
      ecou"";
      }
      ?>

      Acest cod funcționează complet, cu toate acestea, trebuie să înțelegeți că nimeni nu scrie în acest fel (în special, ieșire prin ecou Etichete HTML). Și sarcina ta este să iei algoritmul din acest cod, dar nu și codul în sine. Și apoi conectați acest algoritm la motorul dvs. Am încercat să comentez cu atenție codul de ieșire meniu pe mai multe niveluri în PHP și MySQL, dar, desigur, nu este cel mai transparent și necesită cunoștințe inițiale destul de bune. Dacă încă nu știi bine PHP și MySQL, atunci recomand cu tărie să treci mai întâi prin aceasta