{"id":233784,"date":"2023-02-21T15:49:00","date_gmt":"2023-02-21T12:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233784"},"modified":"2023-02-21T15:49:03","modified_gmt":"2023-02-21T12:49:03","slug":"implementacja-animowanego-filtrowania-postow-wedlug-kategorii","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/implementacja-animowanego-filtrowania-postow-wedlug-kategorii\/","title":{"rendered":"Implementacja animowanego filtrowania post\u00f3w wed\u0142ug kategorii"},"content":{"rendered":"\n<p>Czy kiedykolwiek chcia\u0142e\u015b zrobi\u0107 \u0142adn\u0105 prezentacj\u0119 kolumnow\u0105 post\u00f3w z filtrami kategorii powy\u017cej, kt\u00f3ra tasuje i filtruje posty z \u0142adn\u0105 animacj\u0105? To jest samouczek dla Ciebie.<\/p>\n<p>To, co zrobimy w tym samouczku, to lista wszystkich post\u00f3w (najlepiej w ramach niestandardowego typu postu, takiego jak pracownicy) \u0142adnie w kolumnach i z ich polecanymi obrazami. Nad postami generujemy filtry dla po\u0142\u0105czonej taksonomii. Po klikni\u0119ciu na filtr, posty zostan\u0105 z \u0142adn\u0105 animacj\u0105 przetasowane i ukryj\u0105 posty, kt\u00f3rych nie ma w wybranej kategorii.<\/p>\n<\/p>\n<p>W tym celu korzystamy z biblioteki Javascript do filtrowania. Dost\u0119pnych jest wiele \u2014 niekt\u00f3re wymagaj\u0105 jQuery, a inne nie \u2014 niekt\u00f3re s\u0105 open source, a niekt\u00f3re wymagaj\u0105 licencji komercyjnej. Najpopularniejsze z nich to <a href=\"https:\/\/www.kunkalabs.com\/mixitup\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">MixItUp<\/a> i <a href=\"https:\/\/isotope.metafizzy.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Isotope<\/a>. Jednak oba wymagaj\u0105 licencji komercyjnej. Do mojego projektu potrzebowa\u0142em biblioteki, kt\u00f3ra za\u0142atwia spraw\u0119, a jednocze\u015bnie jest ca\u0142kowicie darmowa do wykorzystania w projektach komercyjnych. Pr\u00f3bowa\u0142em kilku, a najlepszym, jaki do tej pory znalaz\u0142em, jest <a href=\"https:\/\/yiotis.net\/filterizr\/#\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">FilterizR<\/a>. Zacznijmy ten samouczek od zdobycia tej biblioteki!<\/p>\n<h2>Biblioteka FilterizR<\/h2>\n<p>Sprawd\u017a demo na <a href=\"https:\/\/yiotis.net\/filterizr\/#\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stronie g\u0142\u00f3wnej FilterizR<\/a>, aby sprawdzi\u0107, czy ta biblioteka jest dla Ciebie. Mo\u017cesz nawet gra\u0107 z opcjami w czasie rzeczywistym. Ta biblioteka obs\u0142uguje filtrowanie (co zrobimy w tym samouczku), tasowanie (kolejno\u015b\u0107 losowa), wyszukiwanie i sortowanie. Jest responsywny i zoptymalizowany pod k\u0105tem urz\u0105dze\u0144 mobilnych. Do tej pory z tego, czego do\u015bwiadczy\u0142em, bardzo dobrze radzi sobie z ustawianiem automatycznej wysoko\u015bci na pojemniku na ka\u017cdym elemencie.<\/p>\n<p>FilterizR oferuje trzy r\u00f3\u017cne typy u\u017cytkowania:<\/p>\n<ul>\n<li>Waniliowy JavaScript: Udost\u0119pnia FilterizR jako globaln\u0105 funkcj\u0119 do wywo\u0142ania w standardowym JavaScript.<\/li>\n<li>jQuery: pozwala u\u017cywa\u0107 <code>jQuery<\/code>do inicjowania i konfigurowania.<\/li>\n<li>Biblioteka Pure Javascript\/npm: Do u\u017cycia w importach ES6 (np. je\u015bli piszesz niestandardowe bloki dla Gutenberga).<\/li>\n<\/ul>\n<p>Druga opcja jest naj\u0142atwiejsza dla os\u00f3b niezaznajomionych z Javascriptem. Wi\u0119kszo\u015b\u0107 ludzi zaczyna od jQuery. Pami\u0119taj jednak, \u017ce jQuery to du\u017ca i ci\u0119\u017cka biblioteka do za\u0142adowania w twoim projekcie, a je\u015bli mo\u017cna tego unikn\u0105\u0107, powiniene\u015b. W tym samouczku u\u017cyjemy waniliowej metody JavaScript. Je\u015bli wdra\u017casz to w niestandardowym bloku Gutenberga, powiniene\u015b rozwa\u017cy\u0107 u\u017cycie trzeciej opcji. Nast\u0119pnie mo\u017cesz po prostu zainstalowa\u0107 go przez <code>npm<\/code>i zaimportowa\u0107 bibliotek\u0119 do swojego kodu blokowego.<\/p>\n<h2>Pobieranie i konfigurowanie plik\u00f3w<\/h2>\n<p>Zdob\u0105d\u017amy odpowiedni plik! Przejd\u017a do <a href=\"https:\/\/github.com\/giotiskl\/filterizr\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Github FilterizR,<\/a> aby pobra\u0107. Je\u015bli nie instalujesz przez npm (trzecia opcja), mo\u017cesz przej\u015b\u0107 do folderu \u201e <code>dist<\/code>&quot; i pobra\u0107 potrzebn\u0105 bibliotek\u0119 zminimalizowan\u0105. Poniewa\u017c u\u017cyj\u0119 go z waniliowym JavaScriptem w tym samouczku, pobior\u0119 <code>vanilla.filterizr.min.js<\/code>plik i umieszcz\u0119 go w moim <code>theme-folder\/assets\/js\/<\/code>folderze. To, gdzie umie\u015bcisz bibliotek\u0119, zale\u017cy oczywi\u015bcie od Ciebie, po prostu dostosuj \u015bcie\u017ck\u0119 dalej.<\/p>\n<p>B\u0119dziemy r\u00f3wnie\u017c potrzebowa\u0107 innego pliku JavaScript, aby zainicjowa\u0107 i zdecydowa\u0107 o opcjach. Stworz\u0119 plik <code>theme-folder\/assets\/js\/filtering-main.js<\/code>. Wr\u00f3cimy do tego pliku p\u00f3\u017aniej. Nie jest to oczywi\u015bcie konieczne, je\u015bli wdra\u017casz to w niestandardowym bloku Gutenberga.<\/p>\n<p>Aby WordPress zawiera\u0142 skrypty, musimy zakolejkowa\u0107 oba skrypty w <code>wp_enqueue_scripts<\/code>haczyku. Mo\u017cna to doda\u0107 gdzie\u015b w motywie <code>functions.php<\/code>. Tak jak:<\/p>\n<pre><code>add_action('wp_enqueue_scripts', function() {\n    wp_enqueue_script('filterizr', get_template_directory_uri(). '\/assets\/js\/vanilla.filterizr.min.js', [], false, true);\n    wp_enqueue_script('filtering-script', get_template_directory_uri(). '\/assets\/js\/filtering-main.js', ['filterizr'], false, true);\n});<\/code><\/pre>\n<p>Dostosuj nazwy plik\u00f3w i\/lub \u015bcie\u017cki do swojego projektu\/motywu. Powy\u017cszy kod umieszcza w kolejce skrypt vanilla filterizR, a po drugie <code>filtering-main.js<\/code>skrypt, kt\u00f3ry jest zale\u017cny od skryptu filterizR. Dzi\u0119ki temu skrypt inicjuj\u0105cy zostanie za\u0142adowany po wymaganej bibliotece.<\/p>\n<h2>Renderowanie szablonu<\/h2>\n<p>Nast\u0119pnym krokiem jest posiadanie miejsca, w kt\u00f3rym chcemy wyrenderowa\u0107 t\u0119 list\u0119 post\u00f3w. To zale\u017cy wy\u0142\u0105cznie od Ciebie. Aby upro\u015bci\u0107 ten samouczek, u\u017cyj\u0119 szablonu strony w moim motywie. Je\u015bli implementujesz to w bloku Gutenberga, mo\u017cesz renderowa\u0107 to za pomoc\u0105 PHP (dla blok\u00f3w dynamicznych) lub JavaScript w <code>save<\/code>metodzie bloku. Wa\u017cn\u0105 cz\u0119\u015bci\u0105 jest poprawne renderowanie kodu HTML otaczaj\u0105cego posty i filtry.<\/p>\n<h3>Renderowanie filtr\u00f3w<\/h3>\n<p>Utworz\u0119 szablon strony <code>template-filters.php<\/code>w moim folderze motywu i dodam m\u00f3j kod PHP, aby wyrenderowa\u0107 tam dane wyj\u015bciowe.<\/p>\n<p>W tym samouczku zak\u0142adamy, \u017ce chcemy renderowa\u0107 posty w ramach niestandardowego typu posta. Mo\u017cesz to zrobi\u0107 za pomoc\u0105 standardowych post\u00f3w i kategorii, ale post\u00f3w zwykle b\u0119dzie do\u015b\u0107 du\u017co \u2013 co nie jest wykonalne w przypadku tego rodzaju wy\u015bwietlania. Za\u0142\u00f3\u017cmy na przyk\u0142ad niestandardowy typ wpisu dla pracownik\u00f3w z po\u0142\u0105czon\u0105 niestandardow\u0105 taksonomi\u0105 dla dzia\u0142u. W tym samouczku nie poka\u017c\u0119, jak doda\u0107 niestandardowy typ posta, pami\u0119taj tylko, \u017ce nazwa typu posta to <code>employees<\/code>, a nazwa taksonomii niestandardowej to <code>department<\/code>. Zamie\u0144 nazwy typu posta i taksonomii. Je\u015bli nie jeste\u015b pewien, jak doda\u0107 niestandardowy typ postu, mam <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/tworz-niestandardowe-typy-postow-i-niestandardowe-taksonomie-w-wordpress-wedlug-kodu\/\" title=\"post samouczka na temat tworzenia niestandardowych typ\u00f3w post\u00f3w i taksonomii\">post samouczka na temat tworzenia niestandardowych typ\u00f3w post\u00f3w i taksonomii<\/a>.<\/p>\n<p>W moim szablonie zaczynam od wygenerowania filtr\u00f3w. Pobior\u0119 wszystkie niepuste terminy w mojej niestandardowej taksonomii <code>[get_terms](https:\/\/developer.wordpress.org\/reference\/functions\/get_terms\/)()<\/code>i dodam je do listy nieuporz\u0105dkowanej.<\/p>\n<pre><code>&lt;?php\n$departments = get_terms([\n    'taxonomy' =&gt; 'department'\n]);\n?&gt;&lt;ul class=\"filter-controls\"&gt;\n    &lt;li data-filter=\"all\"&gt;&lt;?php _e('All', 'txtdomain'); ?&gt;&lt;\/li&gt;&lt;?php\n    foreach ($departments as $department) {\n        ?&gt;&lt;li data-filter=\"&lt;?php echo $department-&gt;slug; ?&gt;\"&gt;&lt;?php echo $department-&gt;name; ?&gt;&lt;\/li&gt;&lt;?php\n    }\n?&gt;&lt;\/ul&gt;\n\u00a0<\/code><\/pre>\n<p>Przed wygenerowaniem element\u00f3w dla ka\u017cdego terminu w taksonomii upewni\u0119 si\u0119, \u017ce zrobi\u0119 jeden element dla \u201eWszystkich&#8221; (linia <code>#6<\/code>). Aby filtrowanie FilterizR zadzia\u0142a\u0142o musimy dostarczy\u0107 atrybut danych \u201e <code>data-filter<\/code>&#8221; do ka\u017cdego elementu jednoznacznie oznaczaj\u0105 unikaln\u0105 warto\u015b\u0107 filtrowania, w naszym przypadku slug terminu (mo\u017cesz u\u017cy\u0107 identyfikatora terminu lub czego\u015b innego, je\u015bli chcesz).Oznacza to, \u017ce musz\u0119 doda\u0107 slug terminu jako atrybuty danych r\u00f3wnie\u017c do post\u00f3w (patrz dalej), wi\u0119c FilterizR mo\u017ce wiedzie\u0107, kt\u00f3re posty nale\u017c\u0105 do kt\u00f3rego filtra.<\/p>\n<p>Z powy\u017cszym kodem powiniene\u015b otrzyma\u0107 list\u0119 z \u201eWszystko&#8221;, po kt\u00f3rej nast\u0119puj\u0105 wszystkie niepuste terminy. \u015awietny!<\/p>\n<p>Teraz tu\u017c pod tym zaczn\u0119 renderowa\u0107 posty.<\/p>\n<h3>Renderowanie post\u00f3w<\/h3>\n<p>Podczas renderowania post\u00f3w musisz pami\u0119ta\u0107 o dw\u00f3ch rzeczach. Jednym z nich jest zawini\u0119cie wszystkich post\u00f3w do kontenera, kt\u00f3remu podam nazw\u0119 klasy <code>filter-container<\/code>. Ta klasa jest tym, czego potrzebujemy za pomoc\u0105 JavaScript, aby FilterizR dzia\u0142a\u0142. Po drugie, ka\u017cdy element musi mie\u0107 atrybut danych \u201e <code>data-category<\/code>&#8222;, kt\u00f3ry zawiera wszystkie terminy oddzielone przecinkami. Warto\u015bci tutaj musz\u0105 odpowiada\u0107 warto\u015bciom wygenerowanym w <code>data-filter<\/code>atrybucie \u201e &#8221; filtr\u00f3w.<\/p>\n<p>Wysy\u0142am zapytania do wszystkich post\u00f3w z niestandardowego typu post\u00f3w <code>[WP_Query](https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/)<\/code>i zap\u0119tlam je. To, co wy\u015bwietlasz w po\u015bcie, zale\u017cy wy\u0142\u0105cznie od Ciebie, ale poni\u017cszy przyk\u0142ad renderuje wyr\u00f3\u017cniony obraz, tytu\u0142 posta i pojedyncz\u0105 niestandardow\u0105 meta postu dla tytu\u0142u stanowiska. Wszystkie zawini\u0119te wewn\u0105trz linki, kt\u00f3re trafiaj\u0105 do jednego pracownika.<\/p>\n<pre><code>&lt;?php\n$employees = new WP_Query([\n    'post_type' =&gt; 'employees',\n    'posts_per_page' =&gt; -1,\n    'orderby' =&gt; 'name',\n    'order' =&gt; 'ASC'\n]);\nif ($employees-&gt;have_posts()) {\n    ?&gt;&lt;div class=\"filter-container\"&gt;&lt;?php\n    while ($employees-&gt;have_posts()) {\n        $employees-&gt;the_post();\n\u00a0\n        $dep = wp_get_object_terms(get_the_ID(), 'department', ['fields' =&gt; 'slugs']);\n        ?&gt;&lt;div class=\"filtr-item\" data-category=\"&lt;?php echo implode(',', $dep); ?&gt;\"&gt;\n            &lt;a href=\"&lt;?php the_permalink(); ?&gt;\" title=\"&lt;?php the_title(); ?&gt;\"&gt;&lt;?php\n        if (has_post_thumbnail()) {\n            the_post_thumbnail('employees-thumb');\n        }\n\u00a0\n        $job_title = get_post_meta(get_the_ID(), 'job_title', true);\n        ?&gt;&lt;div class=\"employee-info\"&gt;\n            &lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;\/h2&gt;\n            &lt;span class=\"job-title\"&gt;&lt;?php echo $job_title; ?&gt;&lt;\/span&gt;\n        &lt;\/div&gt;&lt;?php\n\u00a0\n\u00a0\n        ?&gt;&lt;\/a&gt;&lt;\/div&gt;&lt;?php\n    }\n    wp_reset_postdata();\n    ?&gt;&lt;\/div&gt;&lt;?php\n}\n?&gt;<\/code><\/pre>\n<p>Zapytanie w wierszu <code>#2-7<\/code>zapewnia pobranie wszystkich opublikowanych post\u00f3w pracownik\u00f3w typu post, uporz\u0105dkowanych alfabetycznie. Przed renderowaniem opakowania <code>div<\/code>dla ka\u017cdego posta, w linii <code>#13<\/code>, <code>[wp_get_object_terms](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_object_terms\/)()<\/code>pobieram wszystkie terminy przypisane do tego posta. Jako parametr prosz\u0119 tylko o \u015blimaki warunk\u00f3w. Zwracana jest tablica dowolnych przypisanych fragment\u00f3w termin\u00f3w. Nast\u0119pnie u\u017cywam funkcji PHP, <code>[implode](https:\/\/www.php.net\/manual\/en\/function.implode.php)()<\/code>aby utworzy\u0107 ci\u0105g znak\u00f3w ze wszystkich element\u00f3w tablicy oddzielonych przecinkami. Jest to powtarzane jako wymagany <code>data-category<\/code>atrybut do katalogu g\u0142\u00f3wnego <code>div<\/code>\u2013 co sprawia, \u017ce \u200b\u200bfiltry dzia\u0142aj\u0105.<\/p>\n<p>Je\u015bli chodzi o tre\u015b\u0107 ka\u017cdego posta, wyj\u015bcie jest do\u015b\u0107 standardowe. Polecany obraz posta generujemy przy u\u017cyciu niestandardowego rozmiaru obrazu (\u201e <code>employees-thumb<\/code>&#8222;), tytu\u0142u posta i warto\u015bci pojedynczej niestandardowej meta postu (dla tytu\u0142u stanowiska). Wszystko jest opakowane w link, kt\u00f3ry prowadzi do pojedynczego widoku dla tego pracownika. Doda\u0142em r\u00f3wnie\u017c kilka klas i wrapper\u00f3w, aby u\u0142atwi\u0107 kierowanie za pomoc\u0105 CSS. Wynik dla ka\u017cdego elementu zale\u017cy oczywi\u015bcie ca\u0142kowicie od Ciebie.<\/p>\n<p>W tym momencie renderowanie PHP powinno by\u0107 kompletne. Mo\u017cesz stylizowa\u0107 i \u0142adnie wygl\u0105da\u0107, ale nie zawracaj sobie g\u0142owy stylizacj\u0105 kolumn. FilterizR wygeneruje dla Ciebie kolumny (flexbox). Nast\u0119pnym krokiem jest inicjalizacja skryptu filtruj\u0105cego!<\/p>\n<h2>Inicjowanie skryptu filtruj\u0105cego<\/h2>\n<p>Ostatnia cz\u0119\u015b\u0107 to edycja <code>filtering-main.js<\/code>skryptu. Musimy po prostu powiedzie\u0107 FilterizR, aby zainicjowa\u0142 filtrowanie na naszej renderowanej tre\u015bci. Nale\u017cy jednak pami\u0119ta\u0107 o kilku rzeczach:<\/p>\n<p>FilterizR upewni si\u0119, \u017ce opakowanie wszystkich post\u00f3w jest automatycznie dopasowywane do widoku. Na przyk\u0142ad, je\u015bli aktywny filtr wy\u015bwietla posty w jednym wierszu, a klikniemy inny filtr, kt\u00f3ry ma cztery wiersze, kontener przeskaluje si\u0119 automatycznie do odpowiedniej wysoko\u015bci. W ten spos\u00f3b upewniaj\u0105c si\u0119, \u017ce wszelkie tre\u015bci, kt\u00f3re pojawiaj\u0105 si\u0119 p\u00f3\u017aniej, nie zostan\u0105 ukryte. Ale aby ta automatyczna zmiana rozmiaru dzia\u0142a\u0142a, wszystkie obrazy musz\u0105 by\u0107 najpierw za\u0142adowane. W niekt\u00f3rych przypadkach skrypt mo\u017ce zosta\u0107 za\u0142adowany i uruchomiony przed zako\u0144czeniem \u0142adowania ka\u017cdego obrazu, co powoduje automatyczne zwijanie kontenera do wysoko\u015bci 0. To nie jest dobre. Musimy wi\u0119c umie\u015bci\u0107 kod inicjuj\u0105cy w funkcji, w kt\u00f3rej wiemy, \u017ce obrazy s\u0105 \u0142adowane. Dla waniliowego Javascriptu jest to <code>window.onload<\/code>. W przypadku jQuery u\u017cyjesz <code>$(window).load()<\/code>.<\/p>\n<p>Po drugie, chcemy si\u0119 upewni\u0107, \u017ce nasz skrypt inicjalizuje FilterizR tylko wtedy, gdy rzeczywi\u015bcie istnieje kontener, kt\u00f3ry mo\u017cna filtrowa\u0107. Je\u015bli zainicjujemy FilterizR, a bie\u017c\u0105ca strona nie ma wymaganej klasy wrappera, spowoduje to b\u0142\u0105d JavaScript. Mo\u017cemy to rozwi\u0105za\u0107, sprawdzaj\u0105c najpierw, czy klasa kontenera istnieje. W waniliowym JavaScript mo\u017cesz u\u017cy\u0107 <code>document.getElementById()<\/code>lub <code>document.getElementsByClassName()<\/code>. Zobacz przyk\u0142ad poni\u017cej. W przypadku jQuery u\u017cy\u0142by\u015b <code>jQuery('&lt;selector&gt;').length<\/code>do sprawdzenia tego.<\/p>\n<p>Sposobem na zainicjowanie FilterizR przez waniliowy JavaScript jest utworzenie nowej instancji <code>Filterizr<\/code>, dostarczaj\u0105c selektor kontenera jako pierwszy parametr i opcjonalnie obiekt ustawie\u0144 jako drugi parametr. Oto przyk\u0142ad najbardziej podstawowego:<\/p>\n<pre><code>window.onload = function() {\n    var filterContainer = document.getElementsByClassName('filter-container');\n    if (filterContainer.length &gt; 0) {\n        filterizr = new Filterizr('.filter-container');\n    }\n\u00a0\n}<\/code><\/pre>\n<p>Inicjalizacja nast\u0119puje w linii <code>#4<\/code>. Podajemy nazw\u0119 klasy do kontenera, kt\u00f3ry otacza nasze posty z kropk\u0105 z przodu, oznaczaj\u0105c\u0105 selektor klasy. Z powy\u017cszym kodem FilterizR powinien teraz przej\u0105\u0107 Twoje posty i umie\u015bci\u0107 je w kolumnach. Poniewa\u017c u\u017cyli\u015bmy odpowiednich atrybut\u00f3w danych, filtry r\u00f3wnie\u017c powinny dzia\u0142a\u0107 automatycznie!<\/p>\n<h3>Dostosowywanie opcji FilterizR<\/h3>\n<p>Mam tylko kilka ko\u0144cowych wskaz\u00f3wek, jak zoptymalizowa\u0107 FilterizR, co mo\u017cemy zrobi\u0107, dostarczaj\u0105c obiekt ustawie\u0144. Polecam przyjrze\u0107 si\u0119 <a href=\"https:\/\/yiotis.net\/filterizr\/#\/documentation\/vanilla\/options\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mo\u017cliwym opcjom<\/a> FilterizR, aby zobaczy\u0107, co mo\u017cesz zrobi\u0107. Mo\u017cesz kontrolowa\u0107 szybko\u015b\u0107 animacji, typ animacji i nie tylko!<\/p>\n<p>Aby kolumny dzia\u0142a\u0142y optymalnie w responsywnych rozmiarach, odkry\u0142em, \u017ce ustawienie <code>layout<\/code>\u201e <code>sameWidth<\/code>&#8221; sprawia, \u017ce \u200b\u200bFilterizR dzia\u0142a lepiej z postami o r\u00f3\u017cnej wysoko\u015bci. Daje to styl \u201emurarski&#8221;. W naszym przyk\u0142adzie wysy\u0142amy echo dodatkowej tre\u015bci po obrazie, co mo\u017ce skutkowa\u0107 r\u00f3\u017cnymi wysoko\u015bciami (nazwy mog\u0105 by\u0107 d\u0142u\u017csze, wymuszaj\u0105c wiele wierszy). Mo\u017ce to spowodowa\u0107 dziwne zachowanie.<\/p>\n<p>Domy\u015blnie ka\u017cdy element nie ma odst\u0119pu mi\u0119dzy sob\u0105. Je\u015bli chcesz mie\u0107 troch\u0119 odst\u0119p\u00f3w mi\u0119dzy poszczeg\u00f3lnymi elementami, mo\u017cesz ustawi\u0107 rozmiar odst\u0119pu w pikselach dla <code>gutterPixels<\/code>. W powy\u017cszym przyk\u0142adzie u\u017cy\u0142em 10px jako rozmiaru przerwy. PS: Rozmiar szczeliny jest r\u00f3wnie\u017c dodawany do pojemnika do pakowania. To mo\u017ce nie zawsze by\u0107 to, czego chcesz. Aby to zmieni\u0107, po prostu doda\u0142em stylizacj\u0119 <code>padding: 0!important<\/code>do <code>.filter-container<\/code>.<\/p>\n<p>Oto dostosowany kod do inicjalizacji FilterizR z moimi opcjami:<\/p>\n<pre><code>window.onload = function() {\n    var filterContainer = document.getElementsByClassName('filter-container');\n    if (filterContainer.length &gt; 0) {\n        var options = {\n            layout: 'sameWidth',\n            gutterPixels: 10,\n        }\n        filterizr = new Filterizr('.filter-container', options);\n    }\n\u00a0\n}<\/code><\/pre>\n<p>Przy niewielkiej stylizacji wynik wygl\u0105da mniej wi\u0119cej tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152296-61e4d54c4aa2b.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-152296-61e4d54c4aa2b.png\" alt=\"Implementacja animowanego filtrowania post\u00f3w wed\u0142ug kategorii\"><\/a><\/p>\n<p>Pami\u0119taj, \u017ce filtrowanie to tylko jedna rzecz, kt\u00f3r\u0105 mo\u017ce zrobi\u0107 FilterizR! Sprawd\u017a przyk\u0142ady w sekcji \u201eSamouczki&#8221; na ich <a href=\"https:\/\/yiotis.net\/filterizr\/#\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stronie g\u0142\u00f3wnej<\/a>. Mo\u017cesz doda\u0107 elementy steruj\u0105ce do sortowania, mieszania i\/lub wyszukiwania. Masz te\u017c wi\u0119cej opcji kontrolowania uk\u0142adu.<\/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>Czy kiedykolwiek chcia\u0142e\u015b zrobi\u0107 \u0142adn\u0105 prezentacj\u0119 kolumnow\u0105 post\u00f3w z filtrami kategorii powy\u017cej, kt\u00f3re filtruj\u0105 posty z \u0142adn\u0105 animacj\u0105? Nie szukaj dalej!<\/p>\n","protected":false},"author":1,"featured_media":152297,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,721,721,919,897,919,1110,845,929,929,845,866,866],"tags":[1169],"class_list":["post-233784","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-deweloper","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\/233784","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=233784"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233784\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/152297"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}