{"id":233887,"date":"2023-02-24T09:09:00","date_gmt":"2023-02-24T06:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233887"},"modified":"2022-11-11T13:00:10","modified_gmt":"2022-11-11T10:00:10","slug":"dowiedz-sie-jak-pisac-menu-walkers-dla-menu-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/dowiedz-sie-jak-pisac-menu-walkers-dla-menu-wordpress\/","title":{"rendered":"Dowiedz si\u0119, jak pisa\u0107 menu Walkers dla menu WordPress"},"content":{"rendered":"\n<p>WordPress umo\u017cliwia korzystanie z tzw. klas Walkera do przemierzania i wy\u015bwietlania element\u00f3w w strukturze hierarchicznej. W tym po\u015bcie dowiemy si\u0119, jak tworzy\u0107, implementowa\u0107 i dostosowywa\u0107 nasz\u0105 w\u0142asn\u0105 klas\u0119 walkera, aby dostosowa\u0107 wyj\u015bcie naszego menu.<\/p>\n<p>Najbardziej znane zastosowanie dostosowywania za pomoc\u0105 klas Walkera w WordPressie dotyczy menu, ale w rzeczywisto\u015bci WordPress u\u017cywa klas Walkera w wielu przypadkach, na przyk\u0142ad wyprowadzanie hierarchii taksonomii, hierarchii komentarzy <code>[wp_list_pages](https:\/\/developer.wordpress.org\/reference\/functions\/wp_list_pages\/)()<\/code>i <code>[wp_list_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_list_categories\/)()<\/code>. Wszyscy oni rozszerzaj\u0105 <code>Walker<\/code>klas\u0119 og\u00f3ln\u0105. Rozszerzymy ten <code>Walker_Nav_Menu<\/code>, kt\u00f3ry jest u\u017cywany do menu w WordPressie.<\/p>\n<p>Poniewa\u017c rozszerzamy kolejn\u0105 klas\u0119, wystarczy doda\u0107 funkcje, kt\u00f3re chcemy przes\u0142oni\u0107. Je\u015bli funkcja nie istnieje w naszej klasie, WordPress uruchomi funkcj\u0119 klasy nadrz\u0119dnej (klasy, kt\u00f3r\u0105 rozszerzamy).<\/p>\n<h2>Przygotowanie<\/h2>\n<p>Mo\u017cesz doda\u0107 swoj\u0105 klas\u0119 walkera do plik\u00f3w wtyczek, motyw\u00f3w <code>function.php<\/code>lub dowolnego pliku PHP zawartego w <code>functions.php<\/code>(aby uzyska\u0107 czystszy kod). Zaczynasz od zdefiniowania swojej klasy wed\u0142ug wybranej przez siebie nazwy (upewnij si\u0119, \u017ce nazwa klasy jest unikalna i obejmuje to mo\u017cliwe nazwy klas w rdzeniu WordPressa!), rozszerzaj\u0105c <code>Walker_Nav_Menu<\/code>:<\/p>\n<pre><code>class AWP_Menu_Walker extends Walker_Nav_Menu {\n}<\/code><\/pre>\n<p>Aby powiedzie\u0107 WordPressowi, aby u\u017cywa\u0142 naszego chodzika, definiujemy to w naszych <code>[wp_nav_menu](https:\/\/developer.wordpress.org\/reference\/functions\/wp_nav_menu\/)()<\/code>rozmowach. Ta funkcja jest odpowiedzialna za wy\u015bwietlanie menu i prawdopodobnie masz przynajmniej jedno w swoim motywie g\u0142\u00f3wnego menu.<\/p>\n<p>W tablicy argument\u00f3w <code>wp_nav_menu()<\/code>dodajesz nowy element z kluczem \u201ewalker&quot; i tworzysz now\u0105 instancj\u0119 twojej klasy walker, jak na przyk\u0142ad:<\/p>\n<pre><code>wp_nav_menu([\n    'theme_location' =&gt; 'primary',\n    'menu_class' =&gt; 'main-menu',\n    'container' =&gt; 'nav',\n    'container_class' =&gt; 'header__main-nav',\n    'walker' =&gt; new AWP_Menu_Walker()\n]);<\/code><\/pre>\n<p>Je\u015bli od\u015bwie\u017cysz witryn\u0119, nie zobaczysz \u017cadnych zmian. Dzieje si\u0119 tak, poniewa\u017c nasza klasa nie nadpisuje \u017cadnej z funkcji rodzica, a zatem WordPress po prostu uruchamia normalne funkcje walkera menu podczas wy\u015bwietlania menu, tak jak wcze\u015bniej powiedzieli\u015bmy mu, aby u\u017cywa\u0142 naszego walkera.<\/p>\n<h2>Przegl\u0105d funkcji, kt\u00f3re mo\u017cemy nadpisa\u0107<code>Walker_Nav_Menu<\/code><\/h2>\n<p>Poni\u017cej znajduj\u0105 si\u0119 funkcje, kt\u00f3re mo\u017cesz doda\u0107 do swojej niestandardowej klasy chodzika, aby zast\u0105pi\u0107 funkcje klasy rodzicielskiej <code>Walker_Nav_Menu<\/code>:<\/p>\n<p>Pierwsze cztery to funkcje, kt\u00f3re s\u0105 po prostu odpowiedzialne za wypisywanie i wszystkie wymagaj\u0105 do\u0142\u0105czenia do \u0142a\u0144cucha \u2013 pierwszej zmiennej parametru. Wa\u017cne jest, aby wiedzie\u0107, \u017ce <code>echo<\/code>nic tu nie robisz, wszystko ma by\u0107 zbudowane jako sznurek.<\/p>\n<h3>start_lvl<\/h3>\n<p>Funkcja <code>start_lvl<\/code>odpowiada za wyprowadzenie kodu HTML na pocz\u0105tek nowego poziomu. Kr\u00f3tko m\u00f3wi\u0105c, powinien wypisa\u0107 pocz\u0105tkowy <code>&lt;ul&gt;<\/code>.<\/p>\n<pre><code>function start_lvl(&amp;$output, $depth=0, $args=null) { }<\/code><\/pre>\n<p>Pierwszy parametr <code>$output<\/code>\u2013 przekazany przez odwo\u0142anie, to ci\u0105g, do kt\u00f3rego do\u0142\u0105czysz swoje dane wyj\u015bciowe. <code>$depth<\/code>jest liczb\u0105 ca\u0142kowit\u0105 sygnalizuj\u0105c\u0105 poziom, na kt\u00f3rym si\u0119 znajdujesz; 0 dla najwy\u017cszego poziomu, 1 dla bezpo\u015bredniego dziecka najwy\u017cszego poziomu i tak dalej. <code>$args<\/code>jest obiektem wszystkich argument\u00f3w podanych w <code>wp_nav_menu()<\/code>.<\/p>\n<h3>end_lvl<\/h3>\n<p>Funkcja <code>end_lvl<\/code>jest odpowiedzialna za wyprowadzenie kodu HTML na koniec poziomu. Zwykle jest to tylko zamkni\u0119cie <code>&lt;\/ul&gt;<\/code>.<\/p>\n<pre><code>function end_lvl(&amp;$output, $depth=0, $args=null) { }<\/code><\/pre>\n<p>Parametry s\u0105 dok\u0142adnie takie same jak <code>start_lvl<\/code>powy\u017cej.<\/p>\n<h3>start_el<\/h3>\n<p>Ta funkcja jest odpowiedzialna za wyprowadzenie kodu HTML ka\u017cdego elementu. W skr\u00f3cie powinien wypisa\u0107 pocz\u0105tek <code>&lt;li&gt;<\/code>i <code>&lt;a&gt;<\/code>tag z tytu\u0142em linku w \u015brodku.<\/p>\n<pre><code>function start_el(&amp;$output, $item, $depth=0, $args=null, $id=0) { }<\/code><\/pre>\n<p>Pierwszy argument, <code>$output<\/code>, jest jak zwykle \u0142a\u0144cuchem, do kt\u00f3rego do\u0142\u0105czysz dane wyj\u015bciowe. Drugi argument, <code>$item<\/code>, to obiekt elementu menu \u2014 i to w\u0142a\u015bnie z niego pobierzesz wi\u0119kszo\u015b\u0107 danych do wyprowadzenia elementu menu. Je\u015bli link do menu jest pozycj\u0105 menu posta, otrzymasz tutaj obiekt posta. Niezale\u017cnie od rodzaju menu, otrzymasz r\u00f3wnie\u017c kilka dodatkowych przydatnych element\u00f3w; takich jak <code>classes<\/code>, <code>url<\/code>, <code>title<\/code>i <code>description<\/code>.<\/p>\n<p>Trzeci argument, <code>$depth<\/code>, jest liczb\u0105 ca\u0142kowit\u0105 m\u00f3wi\u0105c\u0105, na jakim poziomie jeste\u015bmy. Poziom 0 jest najwy\u017cszym poziomem, 1 jest bezpo\u015brednim dzieckiem najwy\u017cszego poziomu i tak dalej. Czwarty argument, <code>$args<\/code>, jest obiektem wszystkich argument\u00f3w dostarczonych do <code>wp_nav_menu()<\/code>. Pi\u0105ty parametr, <code>$id<\/code>, to identyfikator aktualnej pozycji menu.<\/p>\n<h3>end_el<\/h3>\n<p>Funkcja <code>end_el<\/code>odpowiada za wyprowadzenie zamkni\u0119cia elementu. Zwykle po prostu wyprowadza\u0142by <code>&lt;\/li&gt;<\/code>tag.<\/p>\n<pre><code>function end_el(&amp;$output, $item, $depth=0, $args=null) { }<\/code><\/pre>\n<p>Argumenty dla <code>end_el<\/code>s\u0105 takie same jak <code>start_el<\/code>powy\u017cej, z wyj\u0105tkiem tego, \u017ce funkcja nie ma pi\u0105tego parametru, <code>$id<\/code>.<\/p>\n<h3>display_element<\/h3>\n<p>Funkcja <code>display_element<\/code>jest funkcj\u0105 dziedziczon\u0105 z <code>Walker<\/code>klasy og\u00f3lnej i jest funkcj\u0105 odpowiedzialn\u0105 za przechodzenie. Jest to funkcja, kt\u00f3ra kolejno wywo\u0142uje wszystkie powy\u017csze funkcje.<\/p>\n<p>W\u0142\u0105czam to tutaj, poniewa\u017c w niekt\u00f3rych przypadkach, na przyk\u0142ad, je\u015bli chcesz zapobiec przechodzeniu ca\u0142ej ga\u0142\u0119zi, u\u017cyjesz do tego tej funkcji.<\/p>\n<pre><code>function display_element($element, &amp;$children_elements, $max_depth, $depth, $args, &amp;$output) { }<\/code><\/pre>\n<p>Pierwszym argumentem, <code>$element<\/code>, jest obiekt pozycji menu \u2013 to jest to, co jest przekazywane jak <code>$item<\/code>w powy\u017cszych funkcjach. Drugi argument <code>$children_elements<\/code>\u2013 \u200b\u200bprzekazany przez odwo\u0142anie, zawiera wszystkie elementy potomne, kt\u00f3re ta funkcja b\u0119dzie przemierza\u0107. <code>$max_depth<\/code>, trzeci argument, to liczba ca\u0142kowita, kt\u00f3ra sygnalizuje, jak g\u0142\u0119boko powinni\u015bmy przeby\u0107, a czwarty argument, <code>$depth<\/code>, to g\u0142\u0119boko\u015b\u0107, na kt\u00f3rej aktualnie si\u0119 znajdujemy. Pi\u0105ty argument, <code>$args<\/code>, to argumenty przekazywane do funkcji, kt\u00f3ra wywo\u0142a\u0142a walker (w przypadku menu by\u0142yby to argumenty dostarczone do <code>wp_nav_menu()<\/code>), a ostatni argument <code>$output<\/code>\u2013 \u200b\u200bprzekazywany przez referencj\u0119, to dane wyj\u015bciowe przekazywane jako pierwszy argument we wszystkich z powy\u017cszych funkcji.<\/p>\n<h2>Modyfikowanie wyj\u015bcia ka\u017cdego elementu<\/h2>\n<p>W powy\u017cszym przegl\u0105dzie powiniene\u015b zobaczy\u0107, \u017ce funkcja <code>start_el()<\/code>jest odpowiedzialna za wyprowadzenie kodu HTML dla pojedynczego elementu menu. Zacznijmy od zast\u0105pienia tej funkcji w naszej klasie chodzika prostym przyk\u0142adem.<\/p>\n<h3>Przyk\u0142ad: zapobieganie dodawaniu link\u00f3w dla element\u00f3w \u201e#&#8221;<\/h3>\n<p>Upewnijmy si\u0119, \u017ce ka\u017cdy <code>#<\/code>link \u201e &#8221; otrzymuje <code>&lt;span&gt;<\/code>element zamiast tagu linku, aby unikn\u0105\u0107 od\u015bwie\u017cania strony.<\/p>\n<pre><code>class AWP_Menu_Walker extends Walker_Nav_Menu {\n    function start_el(&amp;$output, $item, $depth=0, $args=[], $id=0) {\n        $output .= \"&lt;li class='\". implode(\" \", $item-&gt;classes). \"'&gt;\";\n\u00a0\n        if ($item-&gt;url &amp;&amp; $item-&gt;url != '#') {\n            $output .= '&lt;a href=\"'. $item-&gt;url. '\"&gt;';\n        } else {\n            $output .= '&lt;span&gt;';\n        }\n\u00a0\n        $output .= $item-&gt;title;\n\u00a0\n        if ($item-&gt;url &amp;&amp; $item-&gt;url != '#') {\n            $output .= '&lt;\/a&gt;';\n        } else {\n            $output .= '&lt;\/span&gt;';\n        }\n    }\n}<\/code><\/pre>\n<p>Element zaczniemy od dodania <code>&lt;li&gt;<\/code>tagu do <code>$output<\/code>. Chcemy mie\u0107 pewno\u015b\u0107, \u017ce domy\u015blne klasy WordPressa (na przyk\u0142ad 'menu-item&#8217;, 'menu-item-has-children&#8217; itp.), a tak\u017ce klasy wprowadzone r\u0119cznie w edytorze menu zostan\u0105 dodane do naszego elementu listy. Klasy dostarczone w postaci tablicy przyklejamy za <code>$item-&gt;classes<\/code>pomoc\u0105 funkcji PHP <code>[implode](https:\/\/www.php.net\/manual\/en\/function.implode.php)()<\/code>oddzielaj\u0105c ka\u017cdy element spacj\u0105.<\/p>\n<p>W liniach #5-9 i #13-17 zajmujemy si\u0119 warunkowym wyj\u015bciem elementu opakowuj\u0105cego. Wyprowadzamy <code>&lt;a&gt;<\/code>tag, chyba \u017ce adres URL elementu to \u201e <code>#<\/code>&#8222;, w kt\u00f3rym to przypadku <code>&lt;span&gt;<\/code>zamiast tego dostarczamy tag. W linii #11 po prostu wypisujemy tekst linku, kt\u00f3ry znajduje si\u0119 w <code>$item-&gt;title<\/code>.<\/p>\n<p>To wszystko, czego potrzebujemy, aby upewni\u0107 si\u0119, \u017ce <code>#<\/code>nie mo\u017cna klikn\u0105\u0107 wszystkich element\u00f3w menu, kt\u00f3re maj\u0105 \u201e &#8221; jako adres URL!<\/p>\n<p>Je\u015bli robisz to w motywie stylizowanym, pami\u0119taj, \u017ce mo\u017cesz straci\u0107 troch\u0119 stylu, je\u015bli motyw stylizuje <code>&lt;a&gt;<\/code>tag bezpo\u015brednio. Mo\u017cesz rozwi\u0105za\u0107 ten problem, zmieniaj\u0105c styl i ewentualnie dodaj\u0105c klas\u0119 do elementu span.<\/p>\n<h3>Przyk\u0142ad: wy\u015bwietlanie opis\u00f3w pozycji menu<\/h3>\n<p>Jako przyk\u0142ad, inn\u0105 rzecz\u0105, kt\u00f3r\u0105 mo\u017cesz tutaj zrobi\u0107, jest wy\u015bwietlenie opisu menu. Istnieje, ale nie jest domy\u015blnie aktywowany. W edytorze menu WordPress musisz klikn\u0105\u0107 \u201eOpcje ekranu&#8221; w prawym g\u00f3rnym rogu i zaznaczy\u0107 \u201eOpis&#8221;:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151802-61e4cfd7d3371.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151802-61e4cfd7d3371.png\" alt=\"Dowiedz si\u0119, jak pisa\u0107 menu Walkers dla menu WordPress\" ><\/a><\/p>\n<p>Pozwala to u\u017cytkownikowi na wprowadzenie opisu do ka\u017cdego elementu. Mo\u017cesz wypisa\u0107 ten opis w swojej klasie chodzika. Za\u0142\u00f3\u017cmy, \u017ce chcesz wy\u015bwietli\u0107 opis tylko element\u00f3w najwy\u017cszego poziomu, poniewa\u017c jest to cz\u0119\u015b\u0107 projektu Twojego motywu. Mo\u017cesz po prostu sprawdzi\u0107, czy <code>$item<\/code>ma opis i czy <code>$depth<\/code>jest 0, tak:<\/p>\n<pre><code>        ...\n        $output .= $item-&gt;title;\n\u00a0\n        if ($depth == 0 &amp;&amp; !empty($item-&gt;description)) {\n            $output .= '&lt;span class=\"description\"&gt;'. $item-&gt;description. '&lt;\/span&gt;';\n        }\n        ...<\/code><\/pre>\n<h3>Przyk\u0142ad: dodawanie karetek rozwijanych<\/h3>\n<p>Bardziej powszechnym i u\u017cytecznym przyk\u0142adem jest dodanie \u201edaszka&#8221;, ikony sygnalizuj\u0105cej, \u017ce ta pozycja menu ma menu rozwijane (ma elementy podrz\u0119dne).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151802-61e4cfd965e21.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151802-61e4cfd965e21.png\" alt=\"Dowiedz si\u0119, jak pisa\u0107 menu Walkers dla menu WordPress\" ><\/a><\/p>\n<p>Przyk\u0142ad karetek w akcji \u2013 za \u201eBlogiem&#8221; i \u201eAktualno\u015bciami&#8221;<\/p>\n<p>Musisz ustali\u0107, jaki kod wyj\u015bciowy w postaci karetki zostanie wy\u015bwietlony. W moim przypadku wyprowadzam <code>&lt;i&gt;<\/code>element z okre\u015blonymi klasami dla \u0142adnej strza\u0142ki w d\u00f3\u0142 dost\u0119pnej przez bibliotek\u0119 <a href=\"https:\/\/fontawesome.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fontawesome<\/a>, kt\u00f3ra zapewnia tysi\u0105ce ikon. Chcesz r\u00f3wnie\u017c zapewni\u0107, aby ta karetka wyprowadza\u0142a tylko elementy, kt\u00f3re maj\u0105 dzieci. Najlepszym sposobem, jaki znalaz\u0142em, aby dowiedzie\u0107 si\u0119, czy bie\u017c\u0105cy element ma dzieci, jest odwo\u0142anie si\u0119 do obiektu walker (tak, kt\u00f3ry jest samym naszym walkerem, ale tak\u017ce klasami, kt\u00f3re rozszerza!) w <code>$args<\/code>i sprawdzenie warto\u015bci logicznej <code>has_children<\/code>. Wyprowadzanie karetki jest tak proste, jak:<\/p>\n<pre><code>if ($args-&gt;walker-&gt;has_children) {\n    $output .= '&lt;i class=\"caret fa fa-angle-down\"&gt;&lt;\/i&gt;';\n}<\/code><\/pre>\n<p>Kompletna klasa chodzika wygl\u0105da\u0142aby tak:<\/p>\n<pre><code>class AWP_Menu_Walker extends Walker_Nav_Menu {\n    function start_el(&amp;$output, $item, $depth=0, $args=[], $id=0) {\n        $output .= \"&lt;li class='\". implode(\" \", $item-&gt;classes). \"'&gt;\";\n\u00a0\n        if ($item-&gt;url &amp;&amp; $item-&gt;url != '#') {\n            $output .= '&lt;a href=\"'. $item-&gt;url. '\"&gt;';\n        } else {\n            $output .= '&lt;span&gt;';\n        }\n\u00a0\n        $output .= $item-&gt;title;\n\u00a0\n        if ($item-&gt;url &amp;&amp; $item-&gt;url != '#') {\n            $output .= '&lt;\/a&gt;';\n        } else {\n            $output .= '&lt;\/span&gt;';\n        }\n\u00a0\n        if ($args-&gt;walker-&gt;has_children) {\n            $output .= '&lt;i class=\"caret fa fa-angle-down\"&gt;&lt;\/i&gt;';\n        }\n    }\n}<\/code><\/pre>\n<p>I to wszystko, czego potrzebujesz, aby zapewni\u0107, \u017ce Twoje menu b\u0119dzie mia\u0142o \u0142adne ikony karetki na elementach nadrz\u0119dnych i \u017ce <code>#<\/code>linki \u201e &#8221; nie b\u0119d\u0105 klikalne.<\/p>\n<p>Je\u015bli chcesz, aby ikona karetki zmieni\u0142a si\u0119, na przyk\u0142ad w strza\u0142k\u0119 w g\u00f3r\u0119, gdy menu jest aktywne, musisz doda\u0107 to za pomoc\u0105 JavaScript do swojego motywu.<\/p>\n<p>Jak sugeruj\u0105 powy\u017csze przyk\u0142ady, mo\u017cesz manipulowa\u0107 danymi wyj\u015bciowymi w dowolny spos\u00f3b, na podstawie dowolnych warunk\u00f3w. Mo\u017cesz na przyk\u0142ad zmodyfikowa\u0107 dane wyj\u015bciowe na podstawie obecno\u015bci okre\u015blonej klasy (na przyk\u0142ad klasy wprowadzonej r\u0119cznie w edytorze menu), wyszukuj\u0105c klas\u0119 w <code>$item-&gt;classes<\/code>, lub mo\u017cesz manipulowa\u0107 (na przyk\u0142ad wielkimi literami) wy\u015bwietlanym tekstem elementu podanym w <code>$item-&gt;title<\/code>.<\/p>\n<h2>Dostarczanie argument\u00f3w szwendaczowi przez twoje<code>wp_nav_menu<\/code><\/h2>\n<p>Chcia\u0142bym wspomnie\u0107 o jeszcze jednej przydatnej rzeczy. Pami\u0119taj, \u017ce $args zawiera wszystkie argumenty dostarczone do <code>wp_nav_menu()<\/code>. Obejmuje to na przyk\u0142ad <code>theme_location<\/code>i inne, wi\u0119c je\u015bli mo\u017cesz modyfikowa\u0107 dane wyj\u015bciowe tylko dla okre\u015blonych lokalizacji motywu &#8211; na przyk\u0142ad menu g\u0142\u00f3wnego. Ale w rzeczywisto\u015bci mo\u017cesz poda\u0107 dowolne niestandardowe argumenty!<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce wielokrotnie wy\u015bwietlasz to samo menu, na przyk\u0142ad jedno na komputerze i ponownie na urz\u0105dzeniu mobilnym. A mo\u017ce chcesz, aby tw\u00f3j chodzik manipulowa\u0142 elementami tylko wtedy, gdy s\u0105 one wy\u015bwietlane <code>wp_nav_menu()<\/code>w twoim motywie, a nie wtedy, gdy menu jest dodawane za pomoc\u0105 wid\u017cetu? By\u0107 mo\u017ce chcesz, aby tw\u00f3j chodzik radzi\u0142 sobie inaczej w takich przypadkach?<\/p>\n<p>Mo\u017cesz poda\u0107 dowolne argumenty niestandardowe do <code>wp_nav_menu()<\/code>. Jako prosty przyk\u0142ad dodam boolean &#8217; <code>show_carets<\/code>&#8217; do argument\u00f3w, aby upewni\u0107 si\u0119, \u017ce karetki s\u0105 dodawane tylko w tych przypadkach, w kt\u00f3rych je chc\u0119 \u2013 zamiast mojej klasy chodzika dodawania karetek do wszystkich menu.<\/p>\n<pre><code>wp_nav_menu([\n    'theme_location' =&gt; 'primary',\n    'menu_class' =&gt; 'main-menu',\n    'container' =&gt; 'nav',\n    'container_class' =&gt; 'header__main-nav',\n    'walker' =&gt; new AWP_Menu_Walker(),\n    'show_carets' =&gt; true\n]);<\/code><\/pre>\n<p>Nast\u0119pnie mog\u0119 po prostu zmieni\u0107 m\u00f3j fragment kodu z dodawaniem karetki powy\u017cej (wiersz 19-21) w celu sprawdzenia, czy <code>show_carets<\/code>jest obecny i prawdziwy w <code>$args<\/code>, na przyk\u0142ad:<\/p>\n<pre><code>if ($args-&gt;show_carets &amp;&amp; $args-&gt;walker-&gt;has_children) {\n    $output .= '&lt;i class=\"caret fa fa-angle-down\"&gt;&lt;\/i&gt;';\n}<\/code><\/pre>\n<p>Mo\u017cesz doda\u0107 dowolne argumenty, upewniaj\u0105c si\u0119, \u017ce chodzik dostosowuje tylko te menu, kt\u00f3re chcesz. Na przyk\u0142ad proste warto\u015bci logiczne dla r\u00f3\u017cnych przypadk\u00f3w, np <code>is_mobile_menu<\/code>. lub cokolwiek innego, czego potrzebujesz.<\/p>\n<p>I to wszystko. Zach\u0119camy do eksperymentowania i daj mi zna\u0107, je\u015bli masz jakie\u015b pytania lub sugestie poni\u017cej!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym po\u015bcie dowiemy si\u0119, jak tworzy\u0107, implementowa\u0107 i dostosowywa\u0107 nasz\u0105 w\u0142asn\u0105 klas\u0119 walkera, aby dostosowa\u0107 wyj\u015bcie naszego menu w WordPress.<\/p>\n","protected":false},"author":1,"featured_media":224083,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,919,897,919,1110,845,929,929,845,866,866],"tags":[1169],"class_list":["post-233887","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-inny","category-n-a","category-samouczki","category-tematy","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233887","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=233887"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233887\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224083"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233887"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233887"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233887"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}