{"id":233990,"date":"2023-02-27T14:35:00","date_gmt":"2023-02-27T11:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233990"},"modified":"2022-11-11T13:37:18","modified_gmt":"2022-11-11T10:37:18","slug":"jak-utworzyc-niestandardowy-szablon-wyszukiwania-zaawansowanego-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jak-utworzyc-niestandardowy-szablon-wyszukiwania-zaawansowanego-w-wordpress\/","title":{"rendered":"Jak utworzy\u0107 niestandardowy szablon wyszukiwania zaawansowanego w WordPress"},"content":{"rendered":"\n<p>Ten przewodnik jest dla tych, kt\u00f3rzy maj\u0105 niestandardowy typ posta (CPT) i chc\u0105 mie\u0107 stron\u0119 wyszukiwania zaawansowanego, kt\u00f3ra wyszukuje wyniki w ramach tego CPT. W formularzu wyszukiwania mo\u017cesz ustawi\u0107 r\u00f3\u017cne dane wej\u015bciowe do wyszukiwania w r\u00f3\u017cnych polach; tytu\u0142 posta, tre\u015b\u0107 posta, dowolny rodzaj niestandardowej meta lub wed\u0142ug niestandardowej taksonomii.<\/p>\n<p>W tym po\u015bcie za\u0142o\u017cymy, \u017ce mamy niestandardowy typ wpisu dla ksi\u0105\u017cek, do\u0142\u0105czon\u0105 niestandardow\u0105 taksonomi\u0119 dla gatunku ksi\u0105\u017cki i kilka niestandardowych meta; autor, rok wydania, numer ISBN i pole wyboru, czy ksi\u0105\u017cka jest w magazynie. Niestandardowy typ i parametry post\u00f3w zale\u017c\u0105 wy\u0142\u0105cznie od Ciebie, aby dopasowa\u0107 je do Twoich potrzeb, poni\u017cszy kod po prostu spr\u00f3buje obj\u0105\u0107 wi\u0119kszo\u015b\u0107 podstaw.<\/p>\n<h2>Co zrobimy<\/h2>\n<p>Stworzymy niestandardowy typ postu dla ksi\u0105\u017cek i do\u0142\u0105czon\u0105 do niego niestandardow\u0105 hierarchiczn\u0105 taksonomi\u0119 dla gatunku. Ponadto ka\u017cda ksi\u0105\u017cka ma niestandardowe pola na autora (autor\u00f3w), rok wydania, numer ISBN i pole wyboru, czy uwzgl\u0119dni\u0107 ksi\u0105\u017cki, kt\u00f3rych nie ma w magazynie. Je\u015bli chodzi o sam\u0105 stron\u0119 wyszukiwania, stworzymy szablon strony, w kt\u00f3rym b\u0119dzie si\u0119 znajdowa\u0142a wi\u0119kszo\u015b\u0107 naszego kodu. Strona rozpocznie si\u0119 od renderowania niestandardowego formularza na pocz\u0105tku; pokazuj\u0105c wszystkie mo\u017cliwe parametry do filtrowania wynik\u00f3w. Pod nim wszystkie wyniki ksi\u0105\u017cek pojawi\u0105 si\u0119 na li\u015bcie. Decydujemy o liczbie wynik\u00f3w na stronie i dodajemy paginacj\u0119 na dole, je\u015bli liczba ta przekracza.<\/p>\n<p>Oto mo\u017cliwe parametry filtra, kt\u00f3re stworzymy dla naszego szablonu wyszukiwania zaawansowanego:<\/p>\n<ul>\n<li>Wprowadzanie tekstu do wyszukiwania dowolnego ci\u0105gu w tytule i tre\u015bci posta.<\/li>\n<li>Menu do wyboru gatunku. Pozwala wybra\u0107 termin lub pozostawi\u0107 go na \u201eDowolny&quot;.<\/li>\n<li>Dane wej\u015bciowe do wpisania nazwiska autora, kt\u00f3re wyszukuje w niestandardowej meta. Lu\u017ane dopasowanie, co oznacza wpisanie \u201eZnaku&#8221;, zwr\u00f3ci wszystkich autor\u00f3w, kt\u00f3rych nazwisko jest lub zawiera \u201eZnak&#8221;.<\/li>\n<li>Wprowadzanie liczb do wpisania roku publikacji ksi\u0105\u017cki, kt\u00f3re przeszukuje si\u0119 w niestandardowej meta. Dopasowanie lu\u017ane, co oznacza wpisanie np. \u201e20&#8243;, b\u0119dzie pasowa\u0107 do dowolnej ksi\u0105\u017cki wydanej w 1920 r. lub dowolnym roku zaczynaj\u0105cym si\u0119 od 20.<\/li>\n<li>Dane wej\u015bciowe do wpisania ISBN (mi\u0119dzynarodowy <a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Standard_Book_Number\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">identyfikator ksi\u0105\u017cki<\/a> ), kt\u00f3ry wyszukuje w niestandardowej meta. Zwraca tylko dok\u0142adne dopasowania.<\/li>\n<li>Pole wyboru, czy uwzgl\u0119dni\u0107 ksi\u0105\u017cki, kt\u00f3rych nie ma w magazynie, kolejna niestandardowa meta. Domy\u015blnie opcja ta nie jest zaznaczona, co oznacza, \u017ce \u200b\u200bwyniki pokazuj\u0105 tylko ksi\u0105\u017cki, kt\u00f3re s\u0105 w magazynie.<\/li>\n<\/ul>\n<p>Formularz jest skonfigurowany do korzystania z metody GET, co oznacza, \u017ce \u200b\u200bwyszukiwane parametry zostan\u0105 do\u0142\u0105czone do strony w adresie URL w postaci \u201e <code>?book-search=world&amp;year-published=2016&amp;book-author=mark<\/code>&#8222;. Inn\u0105 opcj\u0105, je\u015bli chcesz unikn\u0105\u0107 \u201ebrzydkich adres\u00f3w URL&#8221;, jest u\u017cycie JavaScript i AJAX. Ale s\u0105 z tym pewne wady. Przede wszystkim nie b\u0119dzie mo\u017cna doda\u0107 wyszukiwania do zak\u0142adek z okre\u015blonymi parametrami wyszukiwania \u201ewst\u0119pnie wype\u0142nionymi&#8221;. Wyobra\u017a sobie, \u017ce w innym miejscu w swojej witrynie chcesz umie\u015bci\u0107 link bezpo\u015brednio do Twojej strony wyszukiwania niestandardowego okre\u015blonego autora. Mo\u017cesz wtedy sprawi\u0107, \u017ce link przejdzie do Twojej strony wyszukiwania, do\u0142\u0105czy\u0107 \u201e <code>?author=mark<\/code>&#8222;, a klikni\u0119cie linku b\u0119dzie prowadzi\u0107 bezpo\u015brednio do wynik\u00f3w dla tego autora. Nie jest to mo\u017cliwe do osi\u0105gni\u0119cia z AJAX.<\/p>\n<p>Parametry wyszukiwania wzajemnie si\u0119 wykluczaj\u0105. Oznacza to, \u017ce po\u0142\u0105czenie np. roku \u201e2011&#8243; i autora \u201eJaki\u015b facet&#8221; zwr\u00f3ci tylko ksi\u0105\u017cki pasuj\u0105ce do OBU tych. Je\u015bli okre\u015blimy r\u00f3wnie\u017c \u201ezabawny&#8221; w og\u00f3lnym wyszukiwaniu, otrzymamy tylko zwroty, kt\u00f3re pasuj\u0105 do wszystkich tych trzech. Powiedziane innymi s\u0142owami; u\u017cyjemy logiki AND. Jest to najcz\u0119stsza metoda filtrowania wynik\u00f3w wyszukiwania.<\/p>\n<p>Ten samouczek nie b\u0119dzie zawiera\u0142 stylizacji, wi\u0119c ta cz\u0119\u015b\u0107 zale\u017cy od Ciebie. Poni\u017cej znajduje si\u0119 przyk\u0142ad tego, jak mo\u017ce to wygl\u0105da\u0107 przy podstawowej stylizacji.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4caf8ea62c.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-151388-61e4caf8ea62c.png\" alt=\"Jak utworzy\u0107 niestandardowy szablon wyszukiwania zaawansowanego w WordPress\" ><\/a><\/p>\n<h2>Uwaga o paginacji z niestandardowym zapytaniem<\/h2>\n<p>Je\u015bli chcesz podzieli\u0107 na strony niestandardowe zapytanie na jednej stronie, musisz pami\u0119ta\u0107 o kilku rzeczach. Podzia\u0142 na strony zapytania mo\u017cna wygenerowa\u0107 za pomoc\u0105 funkcji WordPressa <code>[the_posts_pagination](https:\/\/developer.wordpress.org\/reference\/functions\/the_posts_pagination\/)()<\/code>, <code>[paginate_links](https:\/\/developer.wordpress.org\/reference\/functions\/paginate_links\/)()<\/code>lub dw\u00f3ch <code>[next_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/next_post_link\/)()<\/code>i <code>[previous_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/previous_post_link\/)()<\/code>. S\u0105 one jednak zakodowane do pracy z <code>wp_query<\/code>obiektem globalnym (kt\u00f3rym dla szablonu strony jest sama strona), a nie z zapytaniem niestandardowym.<\/p>\n<p>Istnieje kilka obej\u015b\u0107, takich jak samodzielne pisanie funkcji stronicowania. Mo\u017cesz te\u017c u\u017cy\u0107 akcji <code>pre_get_posts<\/code>i manipulowa\u0107 <code>wp_query<\/code>obiektem. Niestety ta metoda jest za p\u00f3\u017ano, aby wp\u0142yn\u0105\u0107 na funkcje stronicowania. Inn\u0105 alternatyw\u0105 jest ca\u0142kowite pomini\u0119cie paginacji i po prostu pokazanie wszystkich post\u00f3w. Mo\u017ce to by\u0107 opcja, je\u015bli nie masz wielu post\u00f3w, ale je\u015bli tworzysz zaawansowany niestandardowy szablon wyszukiwania \u2013 zak\u0142adam, \u017ce masz sporo post\u00f3w.<\/p>\n<p>To, co zrobimy w tym przewodniku, to rodzaj \u201ehackowej&#8221; metody. W szablonie strony zast\u0105pimy <code>wp_query<\/code>obiekt naszym niestandardowym zapytaniem, aby funkcje p\u0119tli i paginacji dzia\u0142a\u0142y zgodnie z oczekiwaniami. Ta metoda jest tym, co odnios\u0142em najwi\u0119kszy sukces.<\/p>\n<p>Bez zb\u0119dnych ceregieli zacznijmy kodowa\u0107!<\/p>\n<h2>Konfigurowanie niestandardowych typ\u00f3w post\u00f3w, taksonomii i p\u00f3l meta<\/h2>\n<p>Pierwszym krokiem jest zdefiniowanie niestandardowego typu posta, dla kt\u00f3rego chcemy utworzy\u0107 zaawansowany szablon wyszukiwania. Je\u015bli masz ju\u017c skonfigurowany niestandardowy typ postu lub chcesz go zaimplementowa\u0107 dla post\u00f3w lub stron, mo\u017cesz przej\u015b\u0107 od razu do nast\u0119pnej cz\u0119\u015bci.<\/p>\n<p>Definiujemy niestandardowy typ posta <code>book<\/code>z hierarchiczn\u0105 taksonomi\u0105 niestandardow\u0105 <code>book_category<\/code>. Nie b\u0119d\u0119 tutaj szczeg\u00f3\u0142owo wyja\u015bnia\u0142, jak tworzy\u0107 niestandardowe typy post\u00f3w i taksonomie. Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej, mam post szczeg\u00f3\u0142owo na ten temat.<\/p>\n<p>Umie\u015b\u0107 ten kod w dowolnym miejscu w kodzie motywu <code>functions.php<\/code>lub wtyczki:<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_category'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],\n    ]);\n\u00a0\n    register_taxonomy('book_category', ['book'], [\n        'label' =&gt; __('Book Category', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-category'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book Category', 'txtdomain'),\n            'all_items' =&gt; __('All Book Categories', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Book Category', 'txtdomain'),\n            'view_item' =&gt; __('View Book Category', 'txtdomain'),\n            'update_item' =&gt; __('Update Book Category', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Book Category', 'txtdomain'),\n            'new_item_name' =&gt; __('New Book Category Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Book Categories', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Book Category', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Book Category:', 'txtdomain'),\n            'not_found' =&gt; __('No Book Categories found', 'txtdomain'),\n        ]\n    ]);\n});<\/code><\/pre>\n<p>Spowoduje to powstanie niestandardowego typu posta z do\u0142\u0105czon\u0105 do niego taksonomi\u0105 w admin.<\/p>\n<p>Konfiguracja niestandardowej meta postu zale\u017cy od Ciebie \u2013 albo obs\u0142u\u017c j\u0105 r\u0119cznie, <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)()<\/code>albo u\u017cyj wtyczki <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF), kt\u00f3ra jest idealna do tego rodzaju pracy. U\u017cyj\u0119 ACF, aby programowo skonfigurowa\u0107 pola, na przyk\u0142ad:<\/p>\n<pre><code>if (function_exists('acf_add_local_field_group')) {\n    add_action('acf\/init', function() {\n        $fields = [\n            [\n                'key' =&gt; 'field_author',\n                'label' =&gt; __('Author(s)', 'txtdomain'),\n                'name' =&gt; 'book_author',\n                'type' =&gt; 'textarea',\n                'rows' =&gt; 3,\n                'new_lines' =&gt; 'wpautop',\n            ],\n            [\n                'key' =&gt; 'field_year_published',\n                'label' =&gt; __('Year published', 'txtdomain'),\n                'name' =&gt; 'year_published',\n                'type' =&gt; 'number',\n            ],\n            [\n                'key' =&gt; 'field_isbn',\n                'label' =&gt; __('ISBN', 'txtdomain'),\n                'name' =&gt; 'isbn',\n                'type' =&gt; 'text',\n            ],\n            [\n                'key' =&gt; 'field_in_stock',\n                'label' =&gt; __('Stock status', 'txtdomain'),\n                'name' =&gt; 'in_stock',\n                'type' =&gt; 'true_false',\n                'message' =&gt; __('In stock', 'txtdomain'),\n                'default_value' =&gt; 1,\n            ],\n        ];\n\u00a0\n        acf_add_local_field_group([\n            'key' =&gt; 'group_book_fields',\n            'title' =&gt; __('Book Details', 'txtdomain'),\n            'fields' =&gt; $fields,\n            'label_placement' =&gt; 'top',\n            'menu_order' =&gt; 0,\n            'style' =&gt; 'default',\n            'position' =&gt; 'normal',\n            'location' =&gt; [\n                [\n                    [\n                        'param' =&gt; 'post_type',\n                        'operator' =&gt; '==',\n                        'value' =&gt; 'book'\n                    ]\n                ]\n            ],\n        ]);\n    });\n}<\/code><\/pre>\n<p>Oczywi\u015bcie mo\u017cesz skonfigurowa\u0107 pola ACF za pomoc\u0105 GUI administratora ACF. Istnieje jednak kilka korzy\u015bci z dodawania ich za pomoc\u0105 kodu. Na przyk\u0142ad upewniaj\u0105c si\u0119, \u017ce zachowujesz te same pola, gdziekolwiek aktywujesz sw\u00f3j motyw lub wtyczk\u0119. Je\u015bli ustawisz pola w admin, musisz pami\u0119ta\u0107, aby je wyeksportowa\u0107 i zaimportowa\u0107, je\u015bli zmienisz witryn\u0119 WordPress.<\/p>\n<p>Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 na nazwy meta; np <code>book_author<\/code>., <code>year_published<\/code>i tak dalej. Odniesiesz si\u0119 do nich podczas tworzenia zapytania niestandardowego w szablonie wyszukiwania zaawansowanego.<\/p>\n<p>Z wtyczk\u0105 ACF i powy\u017cszym kodem edycja pojedynczej ksi\u0105\u017cki wygl\u0105da\u0142aby tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4cafa3c2c8.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-151388-61e4cafa3c2c8.png\" alt=\"Jak utworzy\u0107 niestandardowy szablon wyszukiwania zaawansowanego w WordPress\" ><\/a><\/p>\n<p>Dzi\u0119ki temu wszyscy jeste\u015bmy dobrzy, aby tworzy\u0107 tyle post\u00f3w o ksi\u0105\u017ckach, ile chcemy. Nast\u0119pnym krokiem jest stworzenie szablonu strony dla naszego wyszukiwania.<\/p>\n<h2>Tworzenie szablonu strony<\/h2>\n<p>Utw\u00f3rzmy szablon strony, w kt\u00f3rym umie\u015bcimy nasz szablon wyszukiwania zaawansowanego. Utw\u00f3rz kopi\u0119 swojego motywu <code>single.php<\/code>lub <code>page.php<\/code>zmie\u0144 jego nazw\u0119 na na przyk\u0142ad <code>template-booksearch.php<\/code>. Kod HTML zale\u017cy od Ciebie, ale powodem, dla kt\u00f3rego tworzymy kopi\u0119 pojedynczego lub strony, jest prawdopodobnie najbli\u017cszy szablon pod wzgl\u0119dem uk\u0142adu.<\/p>\n<p>Na samej g\u00f3rze szablonu strony oznaczamy, \u017ce jest to szablon strony, pisz\u0105c \u201eNazwa szablonu&#8221; i jego nazw\u0119 w bloku komentarzy. Dzi\u0119ki temu upewnimy si\u0119, \u017ce mo\u017cemy wybra\u0107 szablon strony podczas edycji strony.<\/p>\n<pre><code>&lt;?php \/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n...<\/code><\/pre>\n<p>Sekcje, kt\u00f3re musimy zakodowa\u0107 w naszym szablonie, s\u0105 nast\u0119puj\u0105ce, w tej kolejno\u015bci:<\/p>\n<ol>\n<li>Zapisz wszystkie zmienne wcze\u015bniej przes\u0142ane przez formularz, u\u017cywaj\u0105c <code>get_query_var()<\/code>. Nale\u017cy r\u00f3wnie\u017c przechowywa\u0107 bie\u017c\u0105c\u0105 stron\u0119<\/li>\n<li>Wyrenderuj formularz wyszukiwania za pomoc\u0105 przycisku przesy\u0142ania do przeprowadzenia wyszukiwania<\/li>\n<li>Zresetuj <code>wp_query<\/code>obiekt<\/li>\n<li>Ustaw argumenty dla nowego <code>WP_Query()<\/code>w zale\u017cno\u015bci od szukanych parametr\u00f3w i uruchom zapytanie. Przypisz niestandardowe zapytanie do <code>wp_query<\/code>obiektu<\/li>\n<li>Przegl\u0105daj wyniki i wy\u015bwietlaj je. Renderuj r\u00f3wnie\u017c linki do stronicowania<\/li>\n<li>Zresetuj <code>wp_query<\/code>obiekt z powrotem do tego, czym by\u0142<\/li>\n<\/ol>\n<p>Powodem, dla kt\u00f3rego musimy wcze\u015bniej przechowywa\u0107 wszystkie wyszukiwane zmienne i bie\u017c\u0105c\u0105 stron\u0119, jest to, \u017ce te zmienne zostan\u0105 utracone po zresetowaniu <code>wp_query<\/code>obiektu w kroku 3. Potrzebujemy r\u00f3wnie\u017c zmiennych dla naszego formularza wyszukiwania, aby wype\u0142ni\u0107 pola.<\/p>\n<p>W swoim szablonie zdecyduj, gdzie chcesz wyprowadzi\u0107 swoje niestandardowe wyszukiwanie, i zacznijmy od g\u00f3ry:<\/p>\n<h3>1 Pobierz wszystkie wyszukiwane zmienne<\/h3>\n<p>Otrzymujemy parametry GET (z adresu URL) za pomoc\u0105 <code>[get_query_var](https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/)()<\/code>. Na przyk\u0142ad; je\u015bli mamy parametr <code>?book-author=benjamin<\/code>w adresie URL, u\u017cycie <code>get_query_var('book-author')<\/code>zwr\u00f3ci ci\u0105g \u201e <code>benjamin<\/code>&#8222;. Pobranie wszystkich zmiennych mo\u017cna wykona\u0107 w ten spos\u00f3b:<\/p>\n<pre><code>$search_string = get_query_var('book-search');\n$author = get_query_var('book-author');\n$category = get_query_var('book-category');\n$year = get_query_var('year-published');\n$isbn = get_query_var('isbn');\n$out_of_stock = get_query_var('out-of-stock');<\/code><\/pre>\n<p>Ale s\u0105 to wszystkie parametry niestandardowe, kt\u00f3re nie s\u0105 cz\u0119\u015bci\u0105 standardowych parametr\u00f3w GET WordPressa. WordPress zignoruje wszystkie nieznane parametry GET, wi\u0119c wywo\u0142anie ich zawsze zwr\u00f3ci pusty ci\u0105g. Musimy powiedzie\u0107 WordPressowi, aby zezwoli\u0142 na ka\u017cdy z tych parametr\u00f3w GET. Robimy to poprzez filtrowanie <code>query_vars<\/code>. W swoim <code>functions.php<\/code>, dodaj r\u00f3wnie\u017c to:<\/p>\n<pre><code>add_filter('query_vars', function($vars) {\n    $vars[] = 'book-search';\n    $vars[] = 'book-author';\n    $vars[] = 'book-category';\n    $vars[] = 'year-published';\n    $vars[] = 'isbn';\n    $vars[] = 'out-of-stock';\n    return $vars;\n});<\/code><\/pre>\n<p>Teraz nasze <code>get_query_var()<\/code>powinny by\u0107 w stanie pobra\u0107 parametry GET. Je\u015bli nie s\u0105 ustawione, zwraca pusty ci\u0105g.<\/p>\n<p>Musimy r\u00f3wnie\u017c pobra\u0107 bie\u017c\u0105c\u0105 stron\u0119, zanim zepsujemy <code>wp_query<\/code>obiekt. Bie\u017c\u0105ca strona to ukryty parametr GET o nazwie <code>paged<\/code>. Pobieramy go w taki sam spos\u00f3b, jak nasze inne parametry GET, ale ustawimy go na domy\u015bln\u0105 warto\u015b\u0107 1, je\u015bli jest pusty.<\/p>\n<pre><code>$paged = (get_query_var('paged'))? get_query_var('paged'): 1;<\/code><\/pre>\n<p>Uwaga: tak jak <code>paged<\/code>w przypadku standardowego parametru WordPress, nie musimy dodawa\u0107 <code>paged<\/code>do <code>query_vars<\/code>filtra.<\/p>\n<h3>2 Wyrenderuj formularz wyszukiwania<\/h3>\n<p>Formularz wyszukiwania b\u0119dzie po prostu <code>&lt;form&gt;<\/code>przyciskiem z niezb\u0119dnymi danymi wej\u015bciowymi i przyciskiem przesy\u0142ania formularza. HTML zale\u017cy wy\u0142\u0105cznie od Ciebie, w poni\u017cszym przyk\u0142adzie dodaj\u0119 dane wej\u015bciowe w postaci prostej listy. Nie b\u0119d\u0119 zawiera\u0142 \u017cadnych stylizacji w tym samouczku, to zale\u017cy od Ciebie. Mo\u017cesz wybra\u0107 styl formularza wyszukiwania tak, aby znajdowa\u0142 si\u0119 u g\u00f3ry wynik\u00f3w lub z boku \u2013 pionowo w d\u00f3\u0142 wraz z wynikami wyszukiwania.<\/p>\n<p>Uwaga: Aby skr\u00f3ci\u0107 i zmodularyzowa\u0107 szablon wyszukiwania zaawansowanego, mo\u017cesz wydzieli\u0107 cz\u0119\u015b\u0107 formularza wyszukiwania w osobnym pliku szablonu i do\u0142\u0105czy\u0107 go za pomoc\u0105 <code>[get_template_part](https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/)()<\/code>. Ale dla uproszczenia tego samouczka uwzgl\u0119dni\u0119 wszystko w jednym pliku szablonu.<\/p>\n<p>Sam formularz musi by\u0107 z metody GET, a akcja musi wskazywa\u0107 na stron\u0119, na kt\u00f3rej si\u0119 znajdujemy. Aby to zrobi\u0107, uzyskujemy dost\u0119p do <code>$post<\/code>obiektu globalnego i otrzymujemy z niego link bezpo\u015bredni. Na koniec dodajemy przycisk prze\u015blij, kt\u00f3ry prze\u015ble formularz.<\/p>\n<pre><code>global $post;\n?&gt;\n&lt;form method=\"GET\" action=\"&lt;?php echo get_permalink($post-&gt;ID); ?&gt;\"&gt;\n    &lt;ul class=\"book-search-form\"&gt;\n\u00a0\n    &lt;\/ul&gt;\n    &lt;input type=\"submit\" value=\"&lt;?php _e('Search', 'txtdomain'); ?&gt;\" \/&gt;\n&lt;\/form&gt;\n&lt;?php<\/code><\/pre>\n<p>W ramach listy nieuporz\u0105dkowanej dodamy odpowiednie dane wej\u015bciowe dla ka\u017cdego z naszych mo\u017cliwych parametr\u00f3w wyszukiwania. Dostosuj kod HTML i parametry wyszukiwania do swoich potrzeb:<\/p>\n<pre><code>global $post;\n?&gt;\n&lt;form method=\"GET\" action=\"&lt;?php echo get_permalink($post-&gt;ID); ?&gt;\"&gt;\n    &lt;ul class=\"book-search-form\"&gt;\n        &lt;li&gt;\n            &lt;label for=\"book-search\"&gt;&lt;?php _e('Search...', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" id=\"book-search\" name=\"book-search\" value=\"&lt;?php echo $search_string; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"book-category\"&gt;&lt;?php _e('Genre', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;?php \n            wp_dropdown_categories([\n                'taxonomy' =&gt; 'book_category',\n                'name' =&gt; 'book-category',\n                'id' =&gt; 'book-category',\n                'value_field' =&gt; 'slug',\n                'selected' =&gt; $category,\n                'show_option_none' =&gt; __('Any genre', 'txtdomain'),\n                'option_none_value' =&gt; '',\n                'hierarchical' =&gt; true,\n                'hide_if_empty' =&gt; false,\n            ]);\n            ?&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"book-author\"&gt;&lt;?php _e('Author', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" id=\"book-author\" name=\"book-author\" value=\"&lt;?php echo $author; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"year-published\"&gt;&lt;?php _e('Year published', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"number\" id=\"year-published\" name=\"year-published\" value=\"&lt;?php echo $year; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"isbn\"&gt;&lt;?php _e('ISBN', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" id=\"isbn\" name=\"isbn\" value=\"&lt;?php echo $isbn; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;input type=\"checkbox\" id=\"out-of-stock\" name=\"out-of-stock\" value=\"out-of-stock\" &lt;?php checked($out_of_stock, 'out-of-stock'); ?&gt; \/&gt;&lt;label for=\"out-of-stock\"&gt;&lt;?php _e('Include out of stock', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;\/li&gt;\n    &lt;\/ul&gt;\n    &lt;input type=\"submit\" value=\"&lt;?php _e('Search', 'txtdomain'); ?&gt;\" \/&gt;\n&lt;\/form&gt;\n&lt;?php<\/code><\/pre>\n<p>Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 na <code>name<\/code>atrybuty; to one pojawi\u0105 si\u0119 w adresie URL po przes\u0142aniu formularza. Musz\u0105 odpowiada\u0107 <code>query_vars<\/code>i <code>get_query_var()<\/code>zdefiniowali\u015bmy wcze\u015bniej!<\/p>\n<p>Powy\u017cszy kod zaczyna si\u0119 od renderowania danych wej\u015bciowych do og\u00f3lnego wyszukiwania tekstu. Ustawiamy na <code>value<\/code>poprzednio wyszukiwan\u0105 zmienn\u0105, kt\u00f3r\u0105 pobrali\u015bmy za pomoc\u0105 <code>get_query_var()<\/code>. Gwarantuje to, \u017ce dane wej\u015bciowe nie zostan\u0105 wyczyszczone po przeprowadzeniu wyszukiwania.<\/p>\n<p>Nast\u0119pnym parametrem jest lista gatunk\u00f3w z naszej niestandardowej taksonomii. Aby to wyrenderowa\u0107, korzystamy z funkcji <code>[wp_dropdown_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_dropdown_categories\/)()<\/code>. Zajrzyj na stron\u0119 dokumentacji, aby zobaczy\u0107, dlaczego dodajemy te wszystkie parametry, aby dostosowa\u0107 menu rozwijane do naszych potrzeb. Wa\u017cne <code>taxonomy<\/code>jest, aby atrybut by\u0142 ustawiony na nasz\u0105 niestandardow\u0105 taksonomi\u0119, <code>name<\/code>atrybut by\u0142 poprawny i <code>selected<\/code>by\u0142 ustawiony na warto\u015b\u0107 poprzednio wyszukiwanej zmiennej. Ustawiamy r\u00f3wnie\u017c warto\u015bci termin\u00f3w jako ich slugi zamiast identyfikator\u00f3w termin\u00f3w. Wygl\u0105da lepiej z <code>?book-category=fiction<\/code>zamiast <code>?book-category=42<\/code>. Aktywujemy r\u00f3wnie\u017c opcj\u0119 \u201ebrak&#8221;, aby doda\u0107 opcj\u0119 \u201eDowolny gatunek&#8221;.<\/p>\n<p>Nast\u0119pnie renderujemy kolejny tekst w celu wyszukania autora, wpis liczby dla roku publikacji, wpis tekstu dla numeru ISBN i na koniec pole wyboru, kt\u00f3re jest domy\u015blnie niezaznaczone, aby uwzgl\u0119dni\u0107 ksi\u0105\u017cki niedost\u0119pne.<\/p>\n<h3>3 Zresetuj wp_query<\/h3>\n<p>Nast\u0119pnym krokiem jest ma\u0142y hack, aby upewni\u0107 si\u0119, \u017ce podzia\u0142 na strony dzia\u0142a dla naszego niestandardowego zapytania. Po prostu przechowujemy pr\u0105d <code>$wp_query<\/code>w jakiej\u015b zmiennej, a nast\u0119pnie ustawiamy j\u0105 na <code>null<\/code>. P\u00f3\u017aniej, w kroku 6, zresetujemy go ze <code>$tmp_wpquery<\/code>zmiennej.<\/p>\n<pre><code>$tmp_wpquery = $wp_query;\n$wp_query = null;<\/code><\/pre>\n<h3>4 Skonfiguruj argumenty i uruchom niestandardowe zapytanie<\/h3>\n<p>Ta cz\u0119\u015b\u0107 dotyczy wykonania nowego zapytania. Zaczynamy od ustawienia najbardziej podstawowych argument\u00f3w, a nast\u0119pnie warunkowo dodajemy parametry w zale\u017cno\u015bci od tego, co zosta\u0142o znalezione we wcze\u015bniej wyszukiwanych zmiennych (z naszych <code>get_query_var()<\/code>).<\/p>\n<pre><code>$args = [\n    'post_type' =&gt; 'book',\n    'posts_per_page' =&gt; 20,\n    'paged' =&gt; $paged\n];\n\u00a0\n$meta_query = [];\n$tax_query = [];\n\u00a0\nif (!empty($search_string)) {\n    $args['s'] = $search_string;\n}\n\u00a0\nif (!empty($category)) {\n    $tax_query[] = [\n        'taxonomy' =&gt; 'book_category',\n        'field' =&gt; 'slug',\n        'terms' =&gt; $category\n    ];\n}\n\u00a0\nif (!empty($author)) {\n    $meta_query[] = [\n        'key' =&gt; 'book_author',\n        'value' =&gt; $author,\n        'compare' =&gt; 'LIKE'\n    ];\n}\n\u00a0\nif (!empty($year)) {\n    $year = (int) $year;\n    $meta_query[] = [\n        'key' =&gt; 'year_published',\n        'value' =&gt; $year,\n        'compare' =&gt; 'LIKE'\n    ];\n}\n\u00a0\nif (!empty($isbn)) {\n    $meta_query[] = [\n        'key' =&gt; 'isbn',\n        'value' =&gt; $isbn,\n    ];\n}\n\u00a0\nif (empty($out_of_stock)) {\n    $meta_query[] = [\n        'key' =&gt; 'in_stock',\n        'value' =&gt; true,\n    ];\n}\n\u00a0\nif (!empty($meta_query)) {\n    $args['meta_query'] = $meta_query;\n}\nif (!empty($tax_query)) {\n    $args['tax_query'] = $tax_query;\n}\n\u00a0\n\/\/ Perform query and assign it to wp_query\n$books = new WP_Query($args);\n$wp_query = $books;<\/code><\/pre>\n<p>Powy\u017cszy kod w zasadzie buduje <code>WP_Query<\/code>z parametrami. Strona <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacji<\/a> dla <code>WP_Query<\/code>jest doskona\u0142ym \u017ar\u00f3d\u0142em informacji, jak zbudowa\u0107 zapytanie.<\/p>\n<p>Ju\u017c pierwsze argumenty daj\u0105 pewno\u015b\u0107, \u017ce odpytujemy tylko ksi\u0105\u017cki i poprawnie informujemy o tym, na kt\u00f3rej stronie aktualnie si\u0119 znajdujemy \u2013 ze <code>paged<\/code>zmiennej, kt\u00f3r\u0105 pobrali\u015bmy wcze\u015bniej. Liczba post\u00f3w na stronie zale\u017cy od Ciebie, po prostu ustawi\u0142em j\u0105 na 20.<\/p>\n<p>Pami\u0119taj, \u017ce dodanie \u201e <code>compare<\/code>&#8221; do \u201e <code>LIKE<\/code>&#8221; spowoduje, \u017ce WordPress wyszuka wszystko, co zawiera podany ci\u0105g. Nie doda\u0142em tego do wyszukiwania ISBN, poniewa\u017c dla tego pola chc\u0119 znale\u017a\u0107 wyniki, kt\u00f3re pasuj\u0105 idealnie.<\/p>\n<p>Wa\u017cna rzecz jest na samym ko\u0144cu, kiedy faktycznie wykonujemy zapytanie i przypisujemy je do <code>wp_query<\/code>zmiennej.<\/p>\n<h3>5 Przejrzyj wyniki zapytania i wyrenderuj paginacj\u0119<\/h3>\n<p>Ten krok jest naprawd\u0119 \u0142atwy. Wszystko, czego potrzebujemy, to standardowa p\u0119tla i dla ka\u017cdego renderujemy post ksi\u0105\u017cki w dowolny spos\u00f3b. Ta cz\u0119\u015b\u0107 zale\u017cy wy\u0142\u0105cznie od Ciebie.<\/p>\n<p>Poni\u017cszy kod pokazuje podstawowy przyk\u0142ad p\u0119tli wynik\u00f3w, wywo\u0142ywania <code>get_template_part()<\/code>ka\u017cdego posta. Po u\u017cyciu p\u0119tli <code>the_posts_pagination()<\/code>do renderowania link\u00f3w stronicowania. Je\u015bli zapytanie nie zwr\u00f3ci\u0142o \u017cadnych post\u00f3w, wy\u015bwietlany jest prosty akapit z tekstem.<\/p>\n<pre><code>if (have_posts()) { \n    while (have_posts()): the_post();\n        get_template_part('content', 'book');\n    endwhile;\n\u00a0\n    the_posts_pagination([\n        'mid_size' =&gt; 2,\n        'prev_text' =&gt; __('\u00ab Previous', 'txdomain'),\n        'next_text' =&gt; __('Next \u00bb', 'txdomain')\n    ]);\n} else {\n    ?&gt;&lt;p class=\"no-posts\"&gt;&lt;?php _e('No books found.', 'txdomain'); ?&gt;&lt;\/p&gt;&lt;?php\n}<\/code><\/pre>\n<p>Dostosuj kod HTML i dane wyj\u015bciowe do swoich potrzeb. Powy\u017cszy kod oczekuje pliku szablonu w motywie nazwanym <code>content-book.php<\/code>do renderowania pojedynczej ksi\u0105\u017cki w p\u0119tli. Nie poka\u017c\u0119 Ci, jak renderowa\u0107 ka\u017cdy post, poniewa\u017c jest to co\u015b, nad czym najprawdopodobniej masz ju\u017c kontrol\u0119.<\/p>\n<h3>6 Zresetuj wp_query z powrotem do tego, co by\u0142o<\/h3>\n<p>Ostatnim krokiem jest zresetowanie <code>wp_query<\/code>obiektu do tego, co zapisali\u015bmy wcze\u015bniej w kroku 3. Ustawili\u015bmy go na <code>null<\/code>pierwszy, aby upewni\u0107 si\u0119, \u017ce zostanie zresetowany.<\/p>\n<pre><code>$wp_query = null;\n$wp_query = $tmp_wpquery;<\/code><\/pre>\n<h2>Wniosek i wynik ko\u0144cowy<\/h2>\n<p>I to by\u0142o to! Powiniene\u015b mie\u0107 teraz w pe\u0142ni funkcjonalny zaawansowany szablon wyszukiwania niestandardowego. Mam nadziej\u0119, \u017ce to ci pomog\u0142o \u2013 kod zosta\u0142 napisany tak og\u00f3lnie, jak to tylko mo\u017cliwe, aby u\u0142atwi\u0107 ci dostosowanie si\u0119 do twoich potrzeb. By\u0107 mo\u017ce potrzebujesz r\u00f3\u017cnych typ\u00f3w parametr\u00f3w lub Tw\u00f3j niestandardowy typ postu dotyczy film\u00f3w lub czego\u015b innego!<\/p>\n<p>Przy podstawowej stylizacji mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4caf8ea62c.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-151388-61e4caf8ea62c.png\" alt=\"Jak utworzy\u0107 niestandardowy szablon wyszukiwania zaawansowanego w WordPress\" ><\/a><\/p>\n<p>Oto ostateczny kod; cz\u0119\u015b\u0107 <code>functions.php<\/code>i szablon:<\/p>\n<pre><code>\/\/ Custom post type for books and custom taxonomy\nadd_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_category'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],\n    ]);\n\u00a0\n    register_taxonomy('book_category', ['book'], [\n        'label' =&gt; __('Book Category', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-category'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book Category', 'txtdomain'),\n            'all_items' =&gt; __('All Book Categories', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Book Category', 'txtdomain'),\n            'view_item' =&gt; __('View Book Category', 'txtdomain'),\n            'update_item' =&gt; __('Update Book Category', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Book Category', 'txtdomain'),\n            'new_item_name' =&gt; __('New Book Category Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Book Categories', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Book Category', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Book Category:', 'txtdomain'),\n            'not_found' =&gt; __('No Book Categories found', 'txtdomain'),\n        ]\n    ]);\n});\n\u00a0\n\/\/ ACF for custom meta fields\nif (function_exists('acf_add_local_field_group')) {\n    add_action('acf\/init', function() {\n        $fields = [\n            [\n                'key' =&gt; 'field_author',\n                'label' =&gt; __('Author(s)', 'txtdomain'),\n                'name' =&gt; 'book_author',\n                'type' =&gt; 'textarea',\n                'rows' =&gt; 3,\n                'new_lines' =&gt; 'wpautop',\n            ],\n            [\n                'key' =&gt; 'field_year_published',\n                'label' =&gt; __('Year published', 'txtdomain'),\n                'name' =&gt; 'year_published',\n                'type' =&gt; 'number',\n            ],\n            [\n                'key' =&gt; 'field_isbn',\n                'label' =&gt; __('ISBN', 'txtdomain'),\n                'name' =&gt; 'isbn',\n                'type' =&gt; 'text',\n            ],\n            [\n                'key' =&gt; 'field_in_stock',\n                'label' =&gt; __('Stock status', 'txtdomain'),\n                'name' =&gt; 'in_stock',\n                'type' =&gt; 'true_false',\n                'message' =&gt; __('In stock', 'txtdomain'),\n                'default_value' =&gt; 1,\n            ],\n        ];\n\u00a0\n        acf_add_local_field_group([\n            'key' =&gt; 'group_book_fields',\n            'title' =&gt; __('Book Details', 'txtdomain'),\n            'fields' =&gt; $fields,\n            'label_placement' =&gt; 'top',\n            'menu_order' =&gt; 0,\n            'style' =&gt; 'default',\n            'position' =&gt; 'normal',\n            'location' =&gt; [\n                [\n                    [\n                        'param' =&gt; 'post_type',\n                        'operator' =&gt; '==',\n                        'value' =&gt; 'book'\n                    ]\n                ]\n            ],\n        ]);\n    });\n}\n\u00a0\n\/\/ Allow custom GET parameters\nadd_filter('query_vars', function($vars) {\n    $vars[] = 'book-search';\n    $vars[] = 'book-author';\n    $vars[] = 'book-category';\n    $vars[] = 'year-published';\n    $vars[] = 'isbn';\n    $vars[] = 'out-of-stock';\n    return $vars;\n});<\/code><\/pre>\n<pre><code>&lt;?php \n\/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n\u00a0\n&lt;main class=\"content\"&gt;\n    &lt;?php \n\u00a0\n    \/\/ Store variables\n    $paged = (get_query_var('paged'))? get_query_var('paged'): 1;\n    $search_string = get_query_var('book-search');\n    $author = get_query_var('book-author');\n    $category = get_query_var('book-category');\n    $year = get_query_var('year-published');\n    $isbn = get_query_var('isbn');\n    $out_of_stock = get_query_var('out-of-stock');\n\u00a0\n    \/\/ Search form\n    global $post;\n    ?&gt;&lt;form method=\"GET\" action=\"&lt;?php echo get_permalink($post-&gt;ID); ?&gt;\"&gt;\n        &lt;ul class=\"book-search-form\"&gt;\n            &lt;li&gt;\n                &lt;label for=\"book-search\"&gt;&lt;?php _e('Search...', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"text\" id=\"book-search\" name=\"book-search\" value=\"&lt;?php echo $search_string; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"book-category\"&gt;&lt;?php _e('Genre', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;?php \n                wp_dropdown_categories([\n                    'taxonomy' =&gt; 'book_category',\n                    'name' =&gt; 'book-category',\n                    'id' =&gt; 'book-category',\n                    'value_field' =&gt; 'slug',\n                    'selected' =&gt; $category,\n                    'show_option_none' =&gt; __('Any genre', 'txtdomain'),\n                    'option_none_value' =&gt; '',\n                    'hierarchical' =&gt; true,\n                    'hide_if_empty' =&gt; false,\n                ]);\n                ?&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"book-author\"&gt;&lt;?php _e('Author', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"text\" id=\"book-author\" name=\"book-author\" value=\"&lt;?php echo $author; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"year-published\"&gt;&lt;?php _e('Year published', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"number\" id=\"year-published\" name=\"year-published\" value=\"&lt;?php echo $year; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"isbn\"&gt;&lt;?php _e('ISBN', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"text\" id=\"isbn\" name=\"isbn\" value=\"&lt;?php echo $isbn; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;input type=\"checkbox\" id=\"out-of-stock\" name=\"out-of-stock\" value=\"out-of-stock\" &lt;?php checked($out_of_stock, 'out-of-stock'); ?&gt; \/&gt;&lt;label for=\"out-of-stock\"&gt;&lt;?php _e('Include out of stock', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;\/li&gt;\n        &lt;\/ul&gt;\n        &lt;input type=\"submit\" value=\"&lt;?php _e('Search', 'txtdomain'); ?&gt;\" \/&gt;\n    &lt;\/form&gt;\n    &lt;?php\n\u00a0\n    \/\/ Reset wp_query temporary\n    $tmp_wpquery = $wp_query;\n    $wp_query = null;\n\u00a0\n    \/\/ Start setting up custom query\n    $args = [\n        'post_type' =&gt; 'book',\n        'posts_per_page' =&gt; 20,\n        'paged' =&gt; $paged\n    ];\n\u00a0\n    $meta_query = [];\n    $tax_query = [];\n\u00a0\n    \/\/ Search post title and content\n    if (!empty($search_string)) {\n        $args['s'] = $search_string;\n    }\n\u00a0\n    \/\/ Search by category\n    if (!empty($category)) {\n        $tax_query[] = [\n            'taxonomy' =&gt; 'book_category',\n            'field' =&gt; 'slug',\n            'terms' =&gt; $category\n        ];\n    }\n\u00a0\n    \/\/ Search by ISBN\n    if (!empty($author)) {\n        $meta_query[] = [\n            'key' =&gt; 'book_author',\n            'value' =&gt; $author,\n            'compare' =&gt; 'LIKE'\n        ];\n    }\n\u00a0\n    \/\/ Search by year\n    if (!empty($year)) {\n        $year = (int) $year;\n        $meta_query[] = [\n            'key' =&gt; 'year_published',\n            'value' =&gt; $year,\n            'compare' =&gt; 'LIKE'\n        ];\n    }\n\u00a0\n    \/\/ Search by ISBN\n    if (!empty($isbn)) {\n        $meta_query[] = [\n            'key' =&gt; 'isbn',\n            'value' =&gt; $isbn,\n        ];\n    }\n\u00a0\n    \/\/ Filter out of stock\n    if (empty($out_of_stock)) {\n        $meta_query[] = [\n            'key' =&gt; 'in_stock',\n            'value' =&gt; true,\n        ];\n    }\n\u00a0\n    \/\/ Add to query arguments\n    if (!empty($meta_query)) {\n        $args['meta_query'] = $meta_query;\n    }\n    if (!empty($tax_query)) {\n        $args['tax_query'] = $tax_query;\n    }\n\u00a0\n    \/\/ Perform query and assign it to wp_query\n    $books = new WP_Query($args);\n    $wp_query = $books;\n\u00a0\n    \/\/ Loop through results\n    if (have_posts()) { \n        while (have_posts()): the_post();\n            get_template_part('content', 'book');\n        endwhile;\n\u00a0\n        the_posts_pagination([\n            'mid_size' =&gt; 2,\n            'prev_text' =&gt; __('\u00ab Previous', 'txdomain'),\n            'next_text' =&gt; __('Next \u00bb', 'txdomain')\n        ]);\n    } else {\n        ?&gt;&lt;p class=\"no-posts\"&gt;&lt;?php _e('No books found.', 'txdomain'); ?&gt;&lt;\/p&gt;&lt;?php\n    }\n\u00a0\n    \/\/ Reset wp_query back to what it was\n    $wp_query = null;\n    $wp_query = $tmp_wpquery;\n    ?&gt;\n&lt;\/main&gt;\n&lt;?php get_footer(); ?&gt;<\/code><\/pre>\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>Ten samouczek jest przeznaczony dla tych, kt\u00f3rzy maj\u0105 niestandardowy typ post\u00f3w i chc\u0105 utworzy\u0107 niestandardow\u0105 stron\u0119 zaawansowanego wyszukiwania z niestandardowymi polami i parametrami wyszukiwania.<\/p>\n","protected":false},"author":1,"featured_media":151389,"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,836,836,845,845,866,866],"tags":[1169],"class_list":["post-233990","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-deweloper","category-inny","category-n-a","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233990","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=233990"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233990\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/151389"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}