Контакти

Inurl php own menu id виплати. Багаторівневе меню на PHP та MySQL. #7 Додамо CSS класи до всіх меню

Поза минулою статтею блогу я писав про цікаве нововведення останньої версії wordpress — спеціальний механізм створення та управління. Тепер стало набагато зручніше і простіше звичайним користувачам створювати різні за складністю меню, які можуть бути не тільки сторінками або категоріями блогу, але й мати посилання на будь-які URL. Для відображення меню в шаблоні використовується спеціальна функція wp_nav_menu - про неї сьогодні розповім.

Якщо в адмінці wordpress немає розділу меню, то його можна активувати додаванням спеціального коду до файлу functions.php

Тут first – назва створеного нами меню. Це використання функції в загальному випадку без віджетів, з ними там потрібно буде трохи інакше працювати. Проте функція wp_nav_menu може виводитися і без аргументів, в результаті чого будуть «переглядатися» різні ситуації — спочатку збіг за назвою меню, якщо для нього вказано хоча б один пункт меню, інакше буде відображено непусте меню ну і т.п . Але знову ж таки раджу просто використовувати наведений вище код і не розбиратися потім, що повинна виводити функція без аргументів. Її синтаксис виглядає так:

Тут використовуються такі параметри:

$menu— Вибраний ідентифікатор меню — ID, slug або назва меню.

$container— меню UL за умовчанням «обертається» в контейнер DIV за допомогою налаштування.

$container_class— вказує клас контейнера, за умовчанням його значення menu-(menu slug)-container, тобто у нашому випадку, наприклад, буде клас menu-first-container.

$container_id— можна додати контейнер ID, за замовчуванням не вказано.

$menu_class- Клас для елемента меню UL, його значення - Menu.

$menu_id- ID для елемента ul, за умовчанням дорівнює значенню menu-(slug)

$echo— якщо ви не бажаєте відображати меню, а повертати значення функції використовуйте для цього параметра значення 0.

$fallback_cb— якщо меню не існує, функція wp_page_menu викликається.

$before- Задає текст, який виводиться перед посиланням А.

$link_before- Виводить фразу перед текстом посилання, не задано.

$link_after- Виводиться після тексту посилання, теж порожнє.

$depth- задає кількість рівнів ієрархії для виведення меню, значення за промовчанням 0 виводить все меню повністю.

$walker— якийсь незрозумілий «walker object», напевно, більше знадобиться розвиненим розробникам.

$theme_location— локація теми, де буде використане меню, має бути активована через register_nav_menu() для того, щоб користувач зміг її вибирати. Теж якесь не зовсім зрозуміле налаштування, зважаючи на все, при роботі з віджетами.

Приклади використання функції wp_nav_menu

Найпростіший код, наведений у кодексі:

Забираємо контейнер DIV з меню

"")); ?>

В принципі, нічого складного у створенні та управлінні меню Wordpress 3.0 немає. Розробники значно спростили процедуру роботи та розширили можливості даного елемента навігації. Рішення часто використовується в багатьох задачах за шаблоном, наприклад, при створенні для мобільної та десктопної версії. Трохи пізніше додам ще кілька сніпетів по темі.

P.S. Постовий. Цікавий і корисний вебмайстрам Блог з SEO , де ви знайдете відповіді на питання, що вас цікавлять по seo.
Компанія Aweb вже давно і дуже добре зарекомендувала себе в галузі послуг розкрутка сайту, оптимізація та пошукове просування в інтернеті.

Якщо вас цікавить відповідь на питання, як створити меню сайту, то ви прийшли за правильною адресою.

Ми розглянемо створення динамічного меню на php, написане спеціально для чайників у програмуванні, а також тих, хто ще в танку.

Меню на php для сайту робимо динамічним - чайникам

Створимо майбутній макет нашого сайту. Для цього намалюємо у фотошопі супер красивий сайт та розріжемо на шматочки. Уявимо, що шапка, логотип, меню та підвал не написані словами, як у даному прикладі, а це вишукано та барвисто оформлені елементи сайту.

Створимо для прикладу три сторінки та назвемо їх Розділ 1, Розділ 2, Розділ 3

Цей текст для різних сторінок буде різним, але ми не будемо на ньому морочитися і залишимо його як є на всіх сторінках.

Приступимо до створення сайту на php.

1. Виділимо блоки header, logo, menu, footer в окремі файли з розширенням php або html

header.html

logo.html

menu.html

footer.html

Додамо файл із цим текстом, щоб бачити його на всіх сторінках. Назвемо його text.html

Примітка. З цього моменту подальші записи вестиму безпосередньо у файлі text.html

2. Створимо шаблон для нашого сайту на PHP.

Для цього зробимо просто - збережемо справжній файл, але вже з розширенням php і зітремо все текстове наповнення. Нехай це не професійно, проте зрозуміло, а ускладнювати все будемо пізніше. Нині головне зрозуміти принцип верстки.

3. Тепер файл template.html нам не потрібний.

Завдяки йому ми маємо уявлення про те, як виглядатиме наш сайт.

4. Нашим шаблоном є файл template.php

У нього ми зараз вставимо за допомогою команди include всі елементи сайту.

5. Створимо три сторінки, як збиралися спочатку.

Розділ 1, назвемо 1.php

Розділ 2, назвемо 2.php

Розділ 3, назвемо 3.php

Для цього можна скористатися найпростішою командою зберегти як...

Для найменших поясню: відкриваємо файл template.phpпотім натискаємо зберегти як...та зберігаємо під назвою 1.php, повторюємо процедуру та послідовно збережемо сторінки сайту 2.php, 3.php

У нас вийшло 3 сторінки з однаковим дизайном. Достатньо вставляти замість файлу text.htmlінший, доповнювати різними картинками або будь-якими HTML кодами, скриптами і вміст кожної сторінки буде унікальним.

Увага!

Якщо не буде створено файл index.phpдля головної сторінки, то в браузері, набравши адресу сайту ми не побачимо сам сайт, а лише структуру директорії (перелік папок).

Можете подивитися у денвері та переконатися. Виправимо ситуацію - створимо файл index.phpі назвемо довго не мудруючи Головна. Заодно створимо файл text-home.htmlта за допомогою команди includeвставимо на щойно створену головну сторінку сайту.

6. Як переглянути сайт на php?

Що вийшло – так просто не побачимо. Це вже не шаблон із розширенням html.

Але й не проблема. Нам потрібен свій, тобто. локального сервера на комп'ютері. Для цього встановимо денвер і результат роботи будемо дивитися в браузері, не виходячи в інтернет.

Ось тепер лад. Набрала адресу сайту та побачила все щойно створене у нормальному вигляді з дизайном.

Тепер візьмемося до php меню сайту.

1. Відкриємо файл menu.html і перетворимо розділ 1, 2 та 3 на посилання по сайту. Посилання у php створюються по-різному.

Наше завдання – навчитися відчувати сайт, створений на php. Тому посилання будемо робити як на звичайному статичному сайті Розділ 1 і т.д.

Мені ця процедура створення посилань шалено подобається в Macromedia Dreamweaver. Встигай тиснути ОКі пити каву.

2. Як зробити посилання в меню неактивним, якщо відвідувач знаходиться на даній сторінці.

Відвідувачу буде зручніше орієнтуватися на сайті знаючи, на якій саме сторінці він знаходиться.

Якщо ви виконали всі кроки по пунктах, то бачите, що у нас всі посилання в меню активні постійно. Як це виправити?

Для початку згадаємо визначення що таке Умовні оператори

– це коли якась дія виконується чи не виконується залежно від умов.

Виконаємо такі дії:

  • Нам знадобляться змінніі один умовний оператор:

if ($master == "Головна")// Це умова. Якщо воно виконується – то в цьому місці меню за допомогою команди echo вставляються звичайні HTML-теги, що виводять напис «Головна».

echo "

Головна

";

else// означає «інакше» - що станеться, якщо умова не виконується. У разі при невиконанні умови напис «Головна» буде посиланням, яка веде головну сторінку.

echo "

Головна

";

  • Умову ми вигадали, але щоб перевірити зміннупотрібно її задати.

Для цього на всіх сторінках розмістимо такі блоки коду:

$master = "Головна";

$master = "Розділ 1";

$master = "Розділ 2";

$master = "Розділ 3";

Як бачимо для кожної сторінки свій код.

Отже, наші практичні кроки зі створення php меню будуть наступні:

1) Відкриваємо файл index.php

та вставляємо код

$master = "Головна";

до місця вставки коду, що виводить саме меню сайту include "menu.html";
?>

2) Відкриваємо файл menu.htmlі вставляємо код із умовою замість простого html посилання на головну сторінку.

Дивимося у браузері та милуємося! Якщо зайдемо на головну сторінку, то посилання перестало бути активним!

3) Повторюємо пункт 1 та 2 зі сторінками 1.php, 2.php, 3.php

Повторення 1:

1) Відкриваємо файл 1.php і вставляємо до коду, що виводить меню блок із заданою змінною

$master = "Розділ 1";

2) Відкриваємо файл menu.html та вставляємо код із умовою замість простого посилання Розділ 1, внісши такі зміни:

if ($master == "Розділ 1")// Це умова. Якщо воно виконується – то в цьому місці меню за допомогою команди echo вставляються звичайні HTML-теги, що виводять напис «Розділ 1».

echo "

Розділ 1

";

else// означає «інакше» - що станеться, якщо умова не виконується. У разі при невиконанні умови напис «Розділ 1» буде посиланням, яка веде головну сторінку.

echo "

Розділ 1

";

Чудо повторилося! Тепер, якщо ми знаходимося на сторінці Розділ 1, посилання в меню не активне.

Повторення – мати навчання! Або для тих, хто у танку! Ще раз

Повторення 2

1) Відкриваємо файл 2.phpта вставляємо код.

$master = "Розділ 2";

2) Знову відкриємо файл menu.html і вставляємо код за умови

if ($master == "Розділ 2")// Це умова. Якщо воно виконується, то в цьому місці меню за допомогою команди echo вставляються звичайні HTML-теги, що виводять напис «Розділ 2».

echo "

Розділ 2

";

else// означає «інакше» - що станеться, якщо умова не виконується. У разі при невиконанні умови напис «Розділ 2» буде посиланням, яка веде головну сторінку.

echo "

Розділ 2

";

Повторення 3

1) Відкриваємо файл 3.phpі задаємо змінну.

$master = "Розділ 3";

2) У файл menu.html вставляємо код із умовою замість посилання Розділ 3, зміни такі:

if ($master == "Розділ 3")// Це умова. Якщо воно виконується, то в цьому місці меню за допомогою команди echo вставляються звичайні HTML-теги, що виводять напис «Розділ 3».

echo "

Розділ 3

";

else// означає «інакше» - що станеться, якщо умова не виконується. У разі при невиконанні умови напис «Розділ 3» буде посиланням, яка веде головну сторінку.

echo "

Розділ 3

";

Підсумок: ми замість посилань у меню такого виду

Головна


Розділ 1

Розділ 2


Розділ 3

Цей урок про php був написаний на численні прохання відвідувачів сайту і є практичним посібником з вивчення створення динамічного меню для сайту на php.

Наступна шпрагалка вебмайстра розповість про те, як зробити на php унікальні заголовки, описи та ключові слова для кожної сторінки.

Ви можете завантажити архів з усіма файлами шаблону сайту та меню php. Початківцям у програмуванні рекомендується.

Якщо ж ви готові до серйозного вивчення php, краще відео курсу від Попова знайти складно. У нього величезний досвід та гарний склад.

]]> ]]>

Оскільки вона розкриває зміст модуля menu.php. Нижче буде представлено власну розробку меню на PHP, яка була написана з нуля в блокноті.

Цей код особливо корисний для динамічних сайтів, які мають самописні движки. Я запропоную два варіанти коду, які мають незначні відмінності (у чому різниця буде пояснена після).

Для початку наведу зразкову структуру сайту, для якого підійде це меню. Структура сайту повинна мати такий вигляд (класичний вигляд):

/index.html /razdel_1/ /razdel_1/articles_1.html /razdel_1/articles_2.html ... /razdel_2/ /razdel_2/articles_1.html /razdel_2/articles_2.html ... ... ... /razdel_N/articles_2 .html

Сайт може містити розділи ще й підрозділи:

/razdel_1/podzaderl_1/ /razdel_1/podzaderl_1/articles_1.html /razdel_1/podzaderl_1/articles_2.html ... /razdel_1/podzaderl_2/articles_1.html /razdel_1/podzaderl_2/articles_2.html

Така структура також працюватиме для нашого меню лише з невеликими відмінностями.

Я пропоную створити окремий файл для меню на PHP. Наприклад, menu.php було б чудовою назвою для такого файлика. Для реалізації меню також представлений стиль меню CSS, щоб відразу зробити його більш менш красивим. Природно, цей стиль дається тільки для ознайомлення, оскільки дизайни у ​​сайтів дуже різні.

Код для стилю меню CSS:

.menu ( height:42px; padding:0 0 0 16px; background:url(images/spacer.png) repeat; ) .menu li ( display:block; float:left; ) .menu li.active ( background: #000011 ; ) .menu a ( color:#FFF; display:block; line-height:42px; text-decoration:none; ;)

Тепер, давайте розглянемо перший варіант реалізації меню на PHP, який є трохи спрощеним.

Перший варіант коду меню на PHP

\n"; for ($i=0;$i ": "
  • "; echo" ".$array_menu[$i]["name"]."
  • \n"; ) echo ""; ?>

    Меню можна поділити на дві частини. Перша містить інформаційний масив $array_menu, до якого заносяться назви наших розділів із посиланнями на розділи. Є варіант забити ці дані в базу даних mySQL, але особливо сенсу в цьому немає, оскільки вибірка зовсім невелика, тому швидкість роботи це ніяк не вплине.

    Друга частина містить виведення меню через цикл for. У циклі відбувається порівняння адреси сайту з адресою з масиву $array_menu. Якщо є збіг, то виводимо черговий розділ меню зі спеціальним класом active:

  • , інакше просто
  • . Це дозволяє нам виділити якимось кольором ту частину меню, де знаходиться користувач. На мій погляд, це необхідна річ для будь-якого сайту, щоб користувач міг розуміти, в якому розділі він знаходиться.

    Порядок прямування в масиві буде зберігатися при виведенні меню на сайті. Тобто масив треба заповнювати у порядку, в якому потрібно виводити меню.

    Примітка:
    Якщо URL (адреса) заголовком розділів мають вигляд:
    /razdel_1
    або такий
    /razdel_1/nazvanie_razdela.html
    то в array_menu потрібно записувати точний збіг:
    $array_menu[$i]["url"]="/razdel_1"
    або для другого випадку:
    $array_menu[$i]["url"]="/razdel_1/nazvanie_razdela.html";

    Як працює перший варіант меню?
    Він підсвічує меню лише, якщо Ви знаходитесь за адресою розділу. Наприклад, якщо адреса сторінки буде /razdel_1/articles_1.html, то меню ніяк не підсвічуватиметься.

    Другий варіант коду є модифікованим варіантом першого та передбачає можливість підсвічування меню навіть у статтях, які знаходяться у розділах.

    Другий варіант коду меню на PHP

    "; for ($i=0;$i ": "
  • "; echo "".$array_menu[$i]["title"]."
  • "; ) else ( echo ($URL) == ($array_menu[$i]["url"]) ? "
  • ": "
  • "; echo "".$array_menu[$i]["title"]."
  • ";)) echo""; ?>

    Виводить довільне меню, створене на панелі: "Зовнішній вигляд > меню" (Appearance > Menus).

    Яке саме меню навігації виводити (їх може бути кілька), вказується у параметрі theme_location .

    Якщо не вказано параметр theme_location , то меню для виводу підбиратиметься в такому порядку:

      Меню, що підходить за ID, налаштуванням або описом переданим у параметрі "menu" і якщо в цьому меню є хоч одне посилання (один елемент);

      інакше, перше не пусте меню;

      або, виведе значення, що повертається функцією вказаною в параметрі "fallback_cb" (за замовчуванням там вказано функція wp_page_menu);

    1. якщо нічого не підійшло, функція нічого не виведе.

    Щоб тема підтримувала меню, потрібно увімкнути цю можливість за допомогою:
    add_theme_support("menus");

    Або можна зареєструвати місце для меню за допомогою register_nav_menu() , тоді підтримка меню темою ввімкнеться автоматично.

    Фільтри зміни елемента меню

    • 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. Видалимо контейнер, тільки в одного меню, що виводиться

      "" ]); ?>

      #5 Видалимо ul обгортку

      Цей приклад видаляє обгортку тега ul у меню:

      "% 3 $ s"]); ?>

      #6 Додамо слово на початок меню

      Цей приклад показує, як додати слово на початок списку меню, у вигляді того ж елемента меню, тільки не посилання. Додамо на початок меню, слово "Список", а також вкажемо атрибут id створеному тегу li:

      "primary", "items_wrap" => "

      • Перелік:
      • %3$s
      " ]); ?>

      #7 Додамо CSS класи до всіх меню

      Використовуючи хук, ми можемо додати свої CSS класи, якщо дотримується потрібна нам умова.

      Додамо CSS клас, якщо ця пост і назва елемента меню дорівнює "blog":

      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 Використання своєї функції для побудови меню

      По-перше, потрібно вказати аргумент "walker" => new Your_Walker_Function .

      Your_Walker_Function – це наш новий клас, який будує меню. Щоб не винаходити велосипед, можна скопіювати її з оригіналу, див. клас Walker_Nav_Menu . Копіюємо код класу і просто виправляємо його там де потрібно.

      Ось приклад, що додає глибину меню та парні/непарні CSS класи до елементів меню (обом ul і li):

      // свій клас побудови меню: class magomra_walker_nav_menu extends Walker_Nav_Menu ( // add classes to ul sub-menus function start_lvl(&$output, $depth) t", $depth) : ""); // code indent $display_depth = ($depth + 1); // because it counts the first submenu as $classes = array("sub-menu", ($display_depth % 2 ? "menu-odd" : "menu-even"), ($display_depth >=2 ? "sub-sub-menu" : ""), "menu-depth-" . " ", $classes); // build html $output .= "\n" . $indent . "

        " . \n"; ) // add main/sub classes to li"s and links function start_el(&$output, $item, $depth, $args) ( global $wp_query; $indent = ($depth > 0 ? str_repeat("\t", $depth) : ""); item"), ($depth >=2 ? "sub-sub-menu-item" : ""), ($depth % 2 ? "menu-item-odd" : "menu-item-even"), "menu -item-depth-" . $depth); $depth_class_names = esc_attr(implode(" ", $depth_classes)); // passed classes $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 .
      • ) return $items; ) 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 Додавання класу до окремих елементів меню

        З версії 4.1.

        З'явився спеціальний хук для цього: nav_menu_css_class . І тепер класи можна додавати чи видаляти через нього. Для прикладу давайте додамо клас my__class до всіх елементів меню:

        Add_filter("nav_menu_css_class", "add_my_class_to_nav_menu", 10, 2); function add_my_class_to_nav_menu($classes, $item)( /* $classes містить Array( => menu-item => menu-item-type-post_type => menu-item-object-page => menu-item-284) */ $classes = "my__class"; return $classes; )

        До версії 4.1.

        Класи елементів меню додаються функцією _wp_menu_item_classes_by_context(&$menu_items); . Але на жаль у ній не передбачено жодних фільтрів, щоб додати свій клас. Тому підемо обхідним шляхом і використовуємо милицю str_replace() :

        // отримуємо, а не виводимо меню $menu = wp_nav_menu(array("echo" => 0,)); // додаємо до всіх пунктів клас my__class $menu = str_replace("class="menu-item", "class="menu-item my__class", $menu); // Виводимо на екран echo $menu;

        #12 Виводити меню, тільки якщо воно існує

        За замовчуванням, якщо меню немає, замість нього будуть виведені сторінки сайту. Але якщо потрібно виводити меню, тільки якщо воно створене в адмін-панелі, вкажіть параметр fallback_cb як "__return_empty_string" :

        Wp_nav_menu(array("theme_location" => "primary-menu", "fallback_cb" => "__return_empty_string"));

        #13 Виведення лише підпункту меню

        Допустимо, є перший рівень і у кожного з елементів першого рівня є своє підменю. Нам потрібно вивести таке підменю у пункту з класом menu-item-135:

        ## Вирізаємо всі LI потрібного submenu і виводимо їх у своєму UL блоці $menu = wp_nav_menu(array("theme_location" => "header_menu", "container" => "", "echo" => 0,)); $regex_part = preg_quote("menu-item-135"); // виведемо підменю пункту "gotovye-resheniya" preg_match("~". $regex_part .".*sub-menu[^>]+>(.*?)

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

      Не дуже оптимальний, але робочий приклад. Іноді може стати в нагоді, для маловідвідуваних сайтів де потрібно швидко отримати результат.

      CSS класи елементів меню

      Наступні класи CSS додаються до елементів меню (розділ за умовами на яких сторінках знаходиться користувач):

      Для всіх елементів на всіх сторінках

        .menu-item- до всіх елементів меню;

        .menu-item-object-(object)- до всіх елементів, де (object) замінитися на назву типу запису чи таксономії:
        .menu-item-object-category (для категорій)
        .menu-item-object-tag (для тегів)
        .menu-item-object-page (для постійних сторінок)
        .menu-item-object-(custom)

      • .menu-item-type-(type)- до всіх елементів меню, де (type) замінити тип посилання (запис чи таксономія). Групує всі типи посилань:
        .menu-item-type-post_type (постійна сторінка, довільний тип запису)
        .menu-item-type-taxonomy (категорія, мітка або довільна таксономія)

      Для елементів поточної сторінки

      • .current-menu-item- якщо посилання в меню збігається з адресою сторінки, що переглядається. Поточна сторінка.

      Для батьківських елементів для перегляданої сторінки

      • .current-menu-parent
      • .current-(object)-ancestor
      • .current-(type)-ancestor

      Для елементів якось пов'язаних зі сторінкою, що переглядається

      • .current-menu-ancestor
      • .current-(object)-ancestor
      • .current-(type)-ancestor

      Для елементів, пов'язаних з головною сторінкою сайту

      • .menu-item-home

      Сумісність із функцією wp_page_menu()

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

      Об'єкт $item

      Параметри $item

      У прикладах часто використовується елемент меню $item. Нижче показано майже всі параметри цього елемента:

      Поле Опис
      ID ID елементу меню
      menu_item_parent ID батьківського елемента меню
      classes масив класів елементу меню
      post_date дата додавання
      post_modified дата останньої зміни
      post_author ID користувача, який додав цей елемент меню
      title заголовок елемента меню
      url посилання елемента меню
      attr_title title атрибут посилання
      xfn rel атрибут посилання
      target target атрибут посилання
      current дорівнює 1, якщо це поточний елемент
      current_item_ancestor 1, якщо поточний елемент – це вкладений елемент
      current_item_parent 1 якщо поточний елемент - це батьківський елемент
      menu_order порядковий номер у меню
      object_id ID об'єкта меню. Записи, терміни та ін.
      type тип об'єкта меню (такса, запис)
      object назва такси, типу запису: page, category, post_tag...
      type_label локалізована назва типу: Рубрика, Сторінка
      post_parent ID батьківського запису
      post_title заголовок запису
      post_name ярлик запису
      Приклад об'єкта $item
      WP_Post Object ( => 10 => 5 => 2019-02-11 13:33:39 => 2019-02-11 13:33:39 => => New => => publish => closed => closed = > => new => => => 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 => => => =>)

      Приклад використання параметра walker

      У Walker можна вказати об'єкт, який будуватиме меню. У цьому об'єкті можна описати HTML код одержуваного меню.

      Якщо потрібно створити меню для нестандартної верстки, іноді простіше переробити цей об'єкт, ніж переробляти верстку.

      Як приклад walker об'єкта, візьмемо клас Walker_Nav_Menu() , який використовується за умовчанням. У ньому нас цікавить лише один метод start_el(). Саме він відповідає за HTML кожного елемента. Як правило, достатньо змінити лише його. Для цього потрібно створити свій клас, який буде розширювати клас Walker_Nav_Menu та вказати його у параметрі walker під час виклику меню.

      Дивимося з прикладу. Взято код методу start_el() без змін. Використовуємо як шаблон:

      Class My_Walker_Nav_Menu extends Walker_Nav_Menu ( /** * Starts the element output. * * @since 3.0.0 * @since 4.4.0 The (@see "nav_menu_item_args") filter was added. * * @see Walker::start_el() * @param string $output Опубліковано за додатковим вмістом.* @param WP_Post $item Menu item data object. of wp_nav_menu() arguments. * @param int $id Current item ID. ($args->item_spacing) && "discard" === $args->item_spacing) ( $t = ""; $n = ""; ) else ( $t = "\t"; $n = "\n "; ) $indent = ($depth) ? str_repeat($t, $depth) : ""; $classes = empty($item->classes) ? array() : (array) $item->classes; = "menu-item-" . $item->ID; $args = apply_filters("nav_menu_item_args", $args, $item, $depth); classes), $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) . """ : ""; // створюємо HTML код елемента меню $output. = $ indent. " $atts = array(); $atts["title"] = ! empty($item->attr_title) ? $item->attr_title: ""; $atts["target"] = ! >target) $item->target: ""; $atts["rel"] = !empty($item->xfn) $item->xfn: ""; $atts["href"] = ! ($item->url) $item->url: ""; $atts = apply_filters("nav_menu_link_attributes"; $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, $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); ) )

      Тепер при виклику меню вказуємо свій walker:

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

      Готово, тепер кожен елемент меню будуватиметься за потрібною нам HTML схемою.

      БЕМ меню за допомогою фільтрів

      Формуватиметься верстка за методологією БЕМ:

      Файл index.phpабо інший для виведення меню

      "header-menu",]);

      Файл functions.php

      "Верхня область", "footer-menu" => "Нижня область", ]); )); // Змінює основні параметри меню 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--main menu-horizontal"; ) return $args; ) // Змінюємо атрибут id у тега 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; ) // Змінюємо атрибут class у тега li add_filter(" ", "filter_nav_menu_css_classes", 10, 4); function filter_nav_menu_css_classes($classes, $item, $args, $depth) ( if ($args->theme_location === "header-menu") ( $classes = [ "menu-node", "menu-node--main_lvl_ " . ($depth + 1) ]; if ($item->current) ( $classes = "menu-node--active"; ) ) return $classes; ) // Змінює клас у вкладеного 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 = [ "menu", "menu--dropdown", "menu--vertical " ]; ) return $classes; ) // Додаємо класи посиланням 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; )

      Бронюйте дуже дешеві лайки на публічну сторінку в Facebook на даному сервісі та отримуйте можливість вибрати не тільки приємну ціну, а й персональні умови для придбання ресурсу. Так, наприклад, Вам буде доступний вибір швидкісного режиму надходження та якості сторінок, що підписуються. Окрім того, сервіс надає гарантії своїм клієнтам.

      Код 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" => "preserve", "depth" => 0, "walker" => "", "theme_location" => "",); $args = wp_parse_args($args, $defaults); if (! item_spacing"]; ) /** * Filters the arguments used до display a navigation menu. * * @since 3.0.0 * * @see wp_nav_menu() * * @param array $args Array of wp_nav_menu() arguments. */ $args = apply_filters("wp_nav_menu_args", $args); $args = (object) $args; /** * Filters whether to short-circuit wp_nav_menu() output. * * Returning non-null value to filter will short-circuit * wp_nav_menu(), echoing that value if $args->echo is true, * returning that value otherwise. * * @since 3.9.0 * * @see wp_nav_menu() * * @param string|null $output Nav menu output to short-circuit with. Default null. * @param stdClass $args An object containing wp_nav_menu() arguments. */ $nav_menu = apply_filters("pre_wp_nav_menu", null, $args); if (null !== $nav_menu) ( if ($args->echo) ( echo $nav_menu; return; ) return $nav_menu; ) // Get the nav menu based on the requested menu $menu = wp_get_nav_menu_object($args- >menu); // Get the nav menu based on theme_location if (! $locations[ $args->theme_location ]); ) // get the first menu that has items if we still can"t find a menu if (! $menu && ! $args->theme_location) ( $menus = wp_get_nav_menus() ; foreach ($menus as $menu_maybe) ( if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array("update_post_term_cache" => false))) ( $menu = $menu_maybe; ; $args->menu)) ( $args->menu = $menu; ) // If the menu exists, get its 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)); Items were found: * - Fall back, але тільки якщо немає місця розташування було specified. * - Otherwise, bail. */ if ((! $menu || is_wp_error($menu) || (isset($menu_items) && empty($menu_items) && ! ->fallback_cb && is_callable($args->fallback_cb)) ( return call_user_func($args->fallback_cb, (array) $args); ) if (! $menu || is_wp_error($menu)) ( return false; ) $ nav_menu = $items = ""; $ show_container = false; if ($args->container) ( /** * Filters list html tags, які є вірними для використання як menu containers. * * @since 3.0.0 * * @param array $tags The aceptable HTML tags for use as menu containers * Default is array containing "div" і "nav". */ $allowed_tags = apply_filters("wp_nav_menu_container_allowedtags", array("div", "nav")); ($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. $class. ">"; ) ) // Set up the $menu_item variables _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_items_with_children[ $menu_item_item Add the menu-item-has-children class where applicable if ($menu_items_with_children) ( foreach ($sorted_menu_items as &$menu_item) ( if (isset($menu_items_with_children) $menu_item->es "menu-item-has-children"; ) ) ) unset($menu_items, $menu_item); /** * Filters sorted list menu objects objects before generating the menu"s HTML. * @param stdClass $args An object containing wp_nav_menu() arguments. */ $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); // Attributes 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: ""; /** * Filters HTML content content for navigation menus. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items HTML-файл вміст для menu items. * @param stdClass $args An object containing wp_nav_menu() arguments. */ $items = apply_filters("wp_nav_menu_items", $items, $args); /** * Filters HTML content content for specific navigation menu. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items HTML-файл вміст для menu items. * @param stdClass $args An object containing wp_nav_menu() arguments. */ $items = apply_filters("wp_nav_menu_($menu->slug)_items", $items, $args); // Ви не можете писати будь-яку мітку, якщо не є елементи в цьому пункті. $wrap_class), $items); unset($items); if ($show_container)container. ">"; ) /** * Filters HTML content for navigation menus. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $nav_menu HTML content for the navigation menu. * @param stdClass $args An object containing wp_nav_menu() arguments. */ $nav_menu = apply_filters("wp_nav_menu", $nav_menu, $args); if ($args->echo) ( echo $nav_menu; ) else ( return $nav_menu; ) )

    Жоден сайт не обходиться без навігації або як ще називають "меню сайту". Так ось меню сайту буває однорівневим та багаторівневим у вигляді дерева. Якщо з однорівневим меню особливих складнощів у плані реалізації немає, то при створенні багаторівневого меню потрібно добре подумати.

    Найголовніше у цій задачі це спроектувати базу даних для нашого багаторівневого меню. Створимо таблицю Categories із трьома полями id, title, parentде:

    • ID- ідентифікатор
    • Title- Назва меню
    • Parent- Батько категорії за замовчуванням 0

    За розгалуження меню відповідає поле Parentякщо Parent = 0, то ця категорія є батьківською. Для того щоб додати нащадків до батьківської категорії, потрібно в полі parent вказати IDпотрібного батька. Наприклад:

    Таблиці з категоріями

    Як видно з таблиці, у батьківської категорії Автомобіліє два нащадки - це Маздаі Хондапов'язаних по полю Parent. А у категорії Мотоциклидва нащадки - це Кавасакіі Харлей. При цьому категорія Човна не має нащадків. Сподіваюся, що Ви зрозуміли, як зв'язати категорії.

    Далі переходимо від слів до практики. Створимо таблицю категорії.

    CREATE TABLE IF NOT EXISTS `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; -- -- Дамп даних таблиці `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`) VALUES (1, "Автомобілі", 0), (2, "Мотоцикли", 0) , (3, "Мазда", 1), (4, "Хонда", 1), (5, "Кавасакі", 2), (6, "Харлей", 2), (7, "Мазда 3", 3 ), (8, "Мазда 6", 3), (9, "Седан", 7), (10, "Хечбек", 7), (11, "Човни", 0), (12, "Ліфтбек", 8), (13, "Кросовер", 8), (14, "Білий", 13), (15, "Червоний", 13), (16, "Чорний", 13), (17, "Зелений", 13), (18, "Мазда CX", 3), (19, "Мазда MX", 3);

    Алгоритм роботи складається з наступного:

    Створюємо з'єднання з базою даних

    query("SET NAMES "utf8""); /* * Це "офіційний" об'єктно-орієнтований спосіб зробити це * проте $connect_error не працював аж до версій PHP 5.2.9 та 5.3.0. */ if ($mysqli->connect_error) ( die("Помилка підключення (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Якщо потрібно бути впевненим у сумісності з версіями до 5.2 .9, * краще використовувати такий код */ if (mysqli_connect_error()) ( die("Помилка підключення (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

    Пишемо функцію отримання даних із таблиці Categories

    //Отримуємо масив нашого меню з БД у вигляді масиву function getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Створюємо масив де ключ масиву є ID меню $cat = array();

    Отримуємо масив такого виду, де ключ масиву це ID категорії.

    Функція побудови дерева із масиву від Tommy Lacroix

    //Функція побудови дерева з масиву від Tommy Lacroix function getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Якщо немає вкладень if (!$node[" parent"])( $tree[$id] = &$node; )else( //Якщо є нащадки то перебираємо масив $dataset[$node["parent"]]["childs"][$id] = &$ node;)) return $tree;)

    Отримуємо масив у вигляді дерева

    Скрипт цілком

    query("SET NAMES "utf8""); /* * Це "офіційний" об'єктно-орієнтований спосіб зробити це * проте $connect_error не працював аж до версій PHP 5.2.9 та 5.3.0. */ if ($mysqli->connect_error) ( die("Помилка підключення (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Якщо потрібно бути впевненим у сумісності з версіями до 5.2 .9, * краще використовувати такий код */ if (mysqli_connect_error()) ( die("Помилка підключення (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Отримуємо масив нашого меню з БД у вигляді масиву function getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Створюємо масив де ключ масиву є ID меню $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; ) //Функція побудови дерева з масиву від Tommy Lacroix function getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Якщо немає вкладень if (!$node["parent"])( $tree[$id] = &$node; )else( //Якщо є нащадки, то перебираємо масив $dataset[$node["parent"]]["childs"][$id] = &$node; ) ) return $tree; ) //Отримуємо підготовлений масив з даними $ cat = getCat ($ mysqli); //Створюємо деревоподібне меню $tree = getTree($cat); //Шаблон для виведення меню у вигляді дерева function tplMenu($category)( $menu = "
  • ". $category["title"].""; if(isset($category["childs"]))( $menu .= "
      ". showCat($category["childs"]) ."
    "; ) $menu .= "
  • "; return $menu; ) /** * Рекурсивно зчитуємо наш шаблон **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) return $string; ) //Отримуємо HTML розмітку $cat_menu = showCat($tree); //Виводимо на екран echo "
      ". $cat_menu ."
    "; ?>

    Результат праці

    Багаторівневе меню на PHP + MySQL для адмінки

    Якщо Ви хочете використовувати дане меню в адмінці свого сайту, потрібно переписати пару функцій tplMenu(), showCat().

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

    Результат праці

    Автомобілі → Mazda →→ Mazda 3 →→→ Sedan →→→ Хечбек →→ Mazda 6 →→→ Ліфтбек →→→ Кросовер →→→→ Білий →→→→ Червоний →→→→ Чорний →→→→ Зелений →→ Мазда CX →→ Мазда MX → Хонда Мотоцикли → Кавасакі → Харлей Човни

    Сподобалася стаття? Поділіться їй