{"id":234010,"date":"2023-02-27T15:01:00","date_gmt":"2023-02-27T12:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234010"},"modified":"2022-11-11T13:50:55","modified_gmt":"2022-11-11T10:50:55","slug":"kuinka-luoda-mukautettu-tarkennettu-hakumalli-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/kuinka-luoda-mukautettu-tarkennettu-hakumalli-wordpressissae\/","title":{"rendered":"Kuinka luoda mukautettu tarkennettu hakumalli WordPressiss\u00e4"},"content":{"rendered":"\n<p>T\u00e4m\u00e4 opas on sinulle, jolla on mukautettu viestityyppi (CPT) ja haluat tarkennetun hakusivun, joka hakee tuloksia t\u00e4st\u00e4 CPT:st\u00e4. Hakulomakkeessa voit m\u00e4\u00e4ritt\u00e4\u00e4 eri sy\u00f6tteit\u00e4 eri kenttien sis\u00e4ll\u00e4 etsimist\u00e4 varten; viestin otsikko, sis\u00e4lt\u00f6, mink\u00e4 tahansa mukautetun metan tai mukautetun taksonomian mukaan.<\/p>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 oletetaan, ett\u00e4 meill\u00e4 on mukautettu viestityyppi kirjoille, liitteen\u00e4 mukautettu taksonomia kirjalajille ja joukko mukautettuja metatietoja; tekij\u00e4, julkaisuvuosi, ISBN-numero ja valintaruutu, onko kirjaa varastossa vai ei. Mukautettu viestityyppi ja parametrit ovat t\u00e4ysin sinun tarpeidesi mukaisia, alla oleva koodi yritt\u00e4\u00e4 yksinkertaisesti kattaa suurimman osan perusteista.<\/p>\n<h2>Mit\u00e4 teemme<\/h2>\n<p>Luomme kirjoille mukautetun viestityypin ja siihen liitett\u00e4v\u00e4n mukautetun hierarkkisen taksonomian genrelle. Lis\u00e4ksi jokaisessa kirjassa on mukautetut kent\u00e4t tekij\u00e4(t), julkaisuvuosi, ISBN-numero ja valintaruutu, sis\u00e4llytet\u00e4\u00e4nk\u00f6 loppuneet kirjat vai ei. Mit\u00e4 tulee itse hakusivuun, teemme sivumallin, jossa suurin osa koodistamme sijaitsee. Sivu alkaa hahmontamalla mukautettu lomake alussa; n\u00e4ytt\u00e4\u00e4 kaikki mahdolliset parametrit tulosten suodattamiseksi. Sen alapuolella kaikki kirjojen tulokset n\u00e4kyv\u00e4t luettelona. P\u00e4\u00e4t\u00e4mme tulosten lukum\u00e4\u00e4r\u00e4n sivua kohden ja lis\u00e4\u00e4mme sivuttamisen alareunaan, jos m\u00e4\u00e4r\u00e4 ylitt\u00e4\u00e4 t\u00e4m\u00e4n.<\/p>\n<p>N\u00e4m\u00e4 ovat mahdolliset suodatinparametrit, jotka luomme tarkennettua hakumalliamme varten:<\/p>\n<ul>\n<li>Tekstinsy\u00f6tt\u00f6 mink\u00e4 tahansa merkkijonon hakemiseen viestin otsikossa ja sis\u00e4ll\u00f6ss\u00e4.<\/li>\n<li>Pudotusvalikko genren valintaa varten. Mahdollistaa termin valitsemisen tai sen j\u00e4tt\u00e4misen &quot;Mik\u00e4 tahansa&quot;.<\/li>\n<li>Sy\u00f6te kirjoittajan nimen kirjoittamista varten, joka hakee mukautetusta metasta. L\u00f6ys\u00e4 vastaavuus, mik\u00e4 tarkoittaa &quot;Mark&quot;-merkin kirjoittamista, palauttaa kaikki kirjoittajat, joiden nimi on tai sis\u00e4lt\u00e4\u00e4 &quot;Mark&quot;.<\/li>\n<li>Numerosy\u00f6tt\u00f6 kirjan julkaisuvuodelle, joka hakee mukautetussa metamuodossa. L\u00f6ys\u00e4 yhteensopivuus, mik\u00e4 tarkoittaa esimerkiksi &quot;20&quot; kirjoittamista, sopii mihin tahansa vuonna 1920 julkaistuun kirjaan tai mink\u00e4 tahansa 20-luvulla alkavan vuoden kirjan kanssa.<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Standard_Book_Number\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Sy\u00f6te ISBN:n (kansainv\u00e4linen kirjatunnus<\/a>) sy\u00f6tt\u00e4miseen, joka hakee mukautetusta metasta. Palauttaa vain tarkat osumat.<\/li>\n<li>Valintaruutu, sis\u00e4llytet\u00e4\u00e4nk\u00f6 loppukirjat, viel\u00e4 yksi mukautettu meta. Oletuksena t\u00e4t\u00e4 ei ole valittu, mik\u00e4 tarkoittaa, ett\u00e4 tulokset n\u00e4ytt\u00e4v\u00e4t vain varastossa olevat kirjat.<\/li>\n<\/ul>\n<p>Lomake on m\u00e4\u00e4ritetty k\u00e4ytt\u00e4m\u00e4\u00e4n GET-menetelm\u00e4\u00e4, mik\u00e4 tarkoittaa, ett\u00e4 kaikki haetut parametrit liitet\u00e4\u00e4n sivulle URL-osoitteessa muodossa &quot; <code>?book-search=world&amp;year-published=2016&amp;book-author=mark<\/code>&quot;. Toinen vaihtoehto, jos haluat v\u00e4ltt\u00e4\u00e4 &quot;rumien URL-osoitteiden&quot; k\u00e4ytt\u00e4misen, on Javascriptin ja AJAXin k\u00e4ytt\u00f6. Mutta t\u00e4ss\u00e4 on joitain huonoja puolia. Ensinn\u00e4kin hakua ei voi lis\u00e4t\u00e4 kirjanmerkkeihin tietyill\u00e4 hakuparametreilla &quot;esit\u00e4ytetyill\u00e4&quot;. Kuvittele, ett\u00e4 haluat muualla sivustossasi linkitt\u00e4\u00e4 suoraan tietyn kirjoittajan mukautettuun hakusivullesi. Voit sitten saada linkin siirtym\u00e4\u00e4n hakusivullesi, lis\u00e4t\u00e4 &quot; <code>?author=mark<\/code>&quot;, jolloin linkin napsauttaminen johtaa suoraan kyseisen kirjoittajan tuloksiin. T\u00e4m\u00e4 ei ole mahdollista saavuttaa AJAXilla.<\/p>\n<p>Hakuparametrit kattavat toisensa. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 yhdist\u00e4m\u00e4ll\u00e4 esimerkiksi vuosi &quot;2011&quot; ja kirjoittaja &quot;Some guy&quot; palauttaa vain kirjat, jotka vastaavat molempia. Jos m\u00e4\u00e4rit\u00e4mme my\u00f6s &quot;hauska&quot; yleisess\u00e4 haun tekstinsy\u00f6t\u00f6ss\u00e4, saamme vain tulokset, jotka vastaavat kaikkia n\u00e4it\u00e4 kolmea. Sanotaan eri sanoin; k\u00e4yt\u00e4mme JA-logiikkaa. T\u00e4m\u00e4 on yleisin tapa suodattaa hakutuloksia.<\/p>\n<p>T\u00e4m\u00e4 opetusohjelma ei sis\u00e4ll\u00e4 muotoilua, joten t\u00e4m\u00e4 osa on sinun. Alla on esimerkki siit\u00e4, milt\u00e4 t\u00e4m\u00e4 voisi n\u00e4ytt\u00e4\u00e4 jollain perustyylill\u00e4.<\/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=\"Kuinka luoda mukautettu tarkennettu hakumalli WordPressiss\u00e4\" ><\/a><\/p>\n<h2>Huomautus sivutuksesta mukautetulla kyselyll\u00e4<\/h2>\n<p>Jos haluat sivutusta mukautetussa kyselyss\u00e4 yhdell\u00e4 sivulla, sinun on otettava huomioon muutama seikka. Kyselyn sivutus voidaan luoda WordPress-funktioilla <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>tai kahdella <code>[next_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/next_post_link\/)()<\/code>ja <code>[previous_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/previous_post_link\/)()<\/code>. N\u00e4m\u00e4 on kuitenkin koodattu toimimaan globaalin <code>wp_query<\/code>objektin kanssa (joka sivumallille on itse sivu), ei mukautetun kyselyn kanssa.<\/p>\n<p>On olemassa muutamia kiertotapoja, kuten sivutustoiminnon kirjoittaminen itse. Tai voit k\u00e4ytt\u00e4\u00e4 toimintoa <code>pre_get_posts<\/code>ja manipuloida <code>wp_query<\/code>objektia. Valitettavasti t\u00e4m\u00e4 menetelm\u00e4 on liian my\u00f6h\u00e4ist\u00e4 vaikuttaa sivutustoimintoihin. Toinen vaihtoehto on ohittaa sivutus kokonaan ja n\u00e4ytt\u00e4\u00e4 kaikki viestit. T\u00e4m\u00e4 voisi olla vaihtoehto, jos sinulla ei ole paljon viestej\u00e4, mutta jos teet tarkennettua mukautettua hakumallia \u2013 oletan, ett\u00e4 sinulla on melko v\u00e4h\u00e4n viestej\u00e4.<\/p>\n<p>Se, mit\u00e4 teemme t\u00e4ss\u00e4 oppaassa, on er\u00e4\u00e4nlainen &quot;hakkeroitu&quot; menetelm\u00e4. Sivumallin sis\u00e4ll\u00e4 ohitamme <code>wp_query<\/code>objektin mukautetulla kyselyll\u00e4mme, jotta silmukka- ja sivutustoiminnot toimivat odotetulla tavalla. T\u00e4ll\u00e4 menetelm\u00e4ll\u00e4 olen onnistunut eniten.<\/p>\n<p>Aloitetaan koodaaminen ilman pitki\u00e4 puheita!<\/p>\n<h2>Mukautetun viestityypin, taksonomian ja metakenttien m\u00e4\u00e4ritt\u00e4minen<\/h2>\n<p>Ensimm\u00e4inen vaihe on m\u00e4\u00e4ritt\u00e4\u00e4 mukautettu viestityyppi, jolle haluamme luoda tarkennetun hakumallin. Jos olet jo m\u00e4\u00e4ritt\u00e4nyt mukautetun viestityypin tai haluat ottaa sen k\u00e4ytt\u00f6\u00f6n viesteiss\u00e4 tai sivuissa, voit siirty\u00e4 suoraan eteenp\u00e4in seuraavaan osaan.<\/p>\n<p>M\u00e4\u00e4rittelemme <code>book<\/code>mukautetun viestityypin hierarkkisella mukautetulla taksonomialla <code>book_category<\/code>. En mene yksityiskohtiin selitt\u00e4\u00e4kseni kuinka luodaan mukautettuja viestityyppej\u00e4 ja taksonomioita t\u00e4ss\u00e4. Jos olet kiinnostunut oppimaan lis\u00e4\u00e4, minulla on postaus, joka k\u00e4sittelee t\u00e4t\u00e4 yksityiskohtaisesti.<\/p>\n<p>Laita t\u00e4m\u00e4 koodi mihin tahansa teemasi <code>functions.php<\/code>tai laajennuskoodiisi:<\/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>T\u00e4m\u00e4 johtaa mukautettuun viestityyppiin, johon on liitetty taksonomia j\u00e4rjestelm\u00e4nvalvojassa.<\/p>\n<p>Mukautetun postin metan m\u00e4\u00e4ritt\u00e4minen on hieman sinun p\u00e4\u00e4tett\u00e4viss\u00e4si \u2013 joko k\u00e4sittele sit\u00e4 manuaalisesti <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)()<\/code>tai k\u00e4yt\u00e4 <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) -laajennusta, joka sopii t\u00e4ydellisesti t\u00e4llaiseen ty\u00f6h\u00f6n. K\u00e4yt\u00e4n ACF:\u00e4\u00e4 kenttien ohjelmointiin, kuten:<\/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>Voit tietysti m\u00e4\u00e4ritt\u00e4\u00e4 ACF-kent\u00e4t k\u00e4ytt\u00e4m\u00e4ll\u00e4 ACF:n j\u00e4rjestelm\u00e4nvalvojan k\u00e4ytt\u00f6liittym\u00e4\u00e4. Mutta niiden lis\u00e4\u00e4misest\u00e4 koodilla on useita etuja. Esimerkiksi varmistamalla, ett\u00e4 pid\u00e4t samat kent\u00e4t aina, kun aktivoit teemasi tai laajennuksen. Jos m\u00e4\u00e4rit\u00e4t kent\u00e4t j\u00e4rjestelm\u00e4nvalvojassa, sinun on muistettava vied\u00e4 ja tuoda ne, jos vaihdat WordPress-sivustoa.<\/p>\n<p>Huomaa meta-nimet; esim <code>book_author<\/code>. <code>year_published<\/code>, ja niin edelleen. Viittaat n\u00e4ihin, kun luomme mukautetun kyselyn tarkennetun haun malliin.<\/p>\n<p>ACF-laajennuksen ja yll\u00e4 olevan koodin avulla yksitt\u00e4inen kirja n\u00e4ytt\u00e4isi t\u00e4lt\u00e4:<\/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=\"Kuinka luoda mukautettu tarkennettu hakumalli WordPressiss\u00e4\" ><\/a><\/p>\n<p>T\u00e4m\u00e4n avulla voimme kaikki luoda niin monta kirjapostausta kuin haluamme. Seuraava vaihe on sivumallin luominen hakuamme varten.<\/p>\n<h2>Sivumallin luominen<\/h2>\n<p>Luodaan sivumalli, johon laitamme tarkennetun haun mallimme. Tee kopio teemastasi <code>single.php<\/code>tai <code>page.php<\/code>ja nime\u00e4 se uudelleen esimerkiksi <code>template-booksearch.php<\/code>. HTML on sinun p\u00e4\u00e4tett\u00e4viss\u00e4si, mutta syy, miksi teemme kopion yksitt\u00e4isest\u00e4 tai sivusta, johtuu siit\u00e4, ett\u00e4 ne ovat luultavasti asettelultaan l\u00e4hin malli.<\/p>\n<p>Sivun mallipohjan yl\u00e4reunassa ilmoitamme, ett\u00e4 t\u00e4m\u00e4 on sivumalli, kirjoittamalla &quot;Mallin nimi&quot; ja sen nimi kommenttikentt\u00e4\u00e4n. N\u00e4in varmistamme, ett\u00e4 voimme valita sivumallin, kun muokkaamme sivua.<\/p>\n<pre><code>&lt;?php \/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n...<\/code><\/pre>\n<p>Osat, jotka meid\u00e4n on koodattava mallissamme, ovat seuraavat t\u00e4ss\u00e4 j\u00e4rjestyksess\u00e4:<\/p>\n<ol>\n<li>Tallenna kaikki lomakkeen aiemmin l\u00e4hett\u00e4m\u00e4t muuttujat k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>get_query_var()<\/code>. On my\u00f6s tallennettava nykyinen sivu<\/li>\n<li>Piirr\u00e4 hakulomake l\u00e4hetyspainikkeella haun suorittamista varten<\/li>\n<li>Nollaa <code>wp_query<\/code>objekti<\/li>\n<li>Aseta uuden argumentit <code>WP_Query()<\/code>haettujen parametrien mukaan ja suorita kysely. M\u00e4\u00e4rit\u00e4 mukautettu kysely <code>wp_query<\/code>objektille<\/li>\n<li>Selaa tuloksia ja n\u00e4yt\u00e4 ne. Muodosta my\u00f6s sivutuslinkit<\/li>\n<li>Palauta <code>wp_query<\/code>objekti siihen, mik\u00e4 se oli<\/li>\n<\/ol>\n<p>Syy, miksi meid\u00e4n on tallennettava kaikki haetut muuttujat ja nykyinen sivu aikaisin, johtuu siit\u00e4, ett\u00e4 n\u00e4m\u00e4 muuttujat menetet\u00e4\u00e4n, kun nollaamme <code>wp_query<\/code>objektin vaiheessa 3. Tarvitsemme my\u00f6s muuttujat hakulomakkeellemme kenttien t\u00e4ytt\u00e4miseksi.<\/p>\n<p>Valitse mallissasi paikka, johon haluat tulostaa mukautetun haun, ja aloitetaan ylh\u00e4\u00e4lt\u00e4:<\/p>\n<h3>1 Hae kaikki haetut muuttujat<\/h3>\n<p>Saamme GET-parametrit (URL-osoitteesta) <code>[get_query_var](https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/)()<\/code>. Esimerkiksi; jos <code>?book-author=benjamin<\/code>URL-osoitteessa on parametri, k\u00e4ytt\u00e4minen <code>get_query_var('book-author')<\/code>palauttaisi merkkijonon &quot; <code>benjamin<\/code>&quot;. Kaikkien muuttujien hakeminen voidaan tehd\u00e4 seuraavasti:<\/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>Mutta n\u00e4m\u00e4 ovat kaikki mukautettuja parametreja, jotka eiv\u00e4t ole osa WordPressin standardi GET-parametreja. WordPress j\u00e4tt\u00e4\u00e4 huomioimatta kaikki GET-parametrit, joita se ei tunne, joten niiden kutsuminen palauttaa aina tyhj\u00e4n merkkijonon. Meid\u00e4n on kehotettava WordPressi\u00e4 sallimaan jokainen n\u00e4ist\u00e4 GET-parametreista. Teemme t\u00e4m\u00e4n suodattamalla <code>query_vars<\/code>. Lis\u00e4\u00e4 my\u00f6s t\u00e4m\u00e4 <code>functions.php<\/code>:<\/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>Nyt meid\u00e4n <code>get_query_var()<\/code>pit\u00e4isi pysty\u00e4 hakemaan GET-parametrit. Jos niit\u00e4 ei ole asetettu, se palauttaa tyhj\u00e4n merkkijonon.<\/p>\n<p>Meid\u00e4n on my\u00f6s noudettava nykyinen sivu ennen kuin sotkemme <code>wp_query<\/code>kohteen. Nykyinen sivu on piilotettu GET-parametri nimelt\u00e4 <code>paged<\/code>. Haemme sen samalla tavalla kuin muut GET-parametrimme, mutta asetamme sen oletusarvoon 1, jos se on tyhj\u00e4.<\/p>\n<pre><code>$paged = (get_query_var('paged'))? get_query_var('paged'): 1;<\/code><\/pre>\n<p>Huomautus: Kuten <code>paged<\/code>tavallinen WordPress-parametri, meid\u00e4n ei tarvitse lis\u00e4t\u00e4 <code>paged<\/code>suodattimeen <code>query_vars<\/code>.<\/p>\n<h3>2 Suorita hakulomake<\/h3>\n<p>Hakulomake on yksinkertaisesti a <code>&lt;form&gt;<\/code>, jossa on tarvittavat sy\u00f6tteet ja lomakkeen l\u00e4hetyspainike. HTML on t\u00e4ysin sinun p\u00e4\u00e4tett\u00e4viss\u00e4si. Alla olevassa esimerkiss\u00e4 lis\u00e4\u00e4n sy\u00f6tteet yksinkertaiseen luetteloon. En sis\u00e4llyt\u00e4 t\u00e4h\u00e4n opetusohjelmaan mit\u00e4\u00e4n tyyli\u00e4, se on sinun. Voit valita hakulomakkeen tyylin niin, ett\u00e4 se sijaitsee tulosten yl\u00e4osassa tai sivussa \u2013 pystysuoraan alasp\u00e4in hakutulosten mukana.<\/p>\n<p>Huomautus: Tarkennetun haun mallin lyhent\u00e4miseksi ja modulisoimiseksi voit erottaa hakulomakkeen osan erilliseksi mallitiedostoksi ja sis\u00e4llytt\u00e4\u00e4 sen tiedostoon <code>[get_template_part](https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/)()<\/code>. Mutta t\u00e4m\u00e4n opetusohjelman yksinkertaisuuden vuoksi sis\u00e4llyt\u00e4n kaiken yhden mallitiedoston sis\u00e4ll\u00e4.<\/p>\n<p>Itse lomakkeen on oltava menetelm\u00e4ll\u00e4 GET, ja toiminnon on osoitettava sivulle, jolla olemme. T\u00e4t\u00e4 varten k\u00e4yt\u00e4mme globaalia <code>$post<\/code>objektia ja saamme pysyv\u00e4n linkin siit\u00e4. Lopuksi lis\u00e4\u00e4mme l\u00e4hetyspainikkeen, jolla lomake l\u00e4hetet\u00e4\u00e4n.<\/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>J\u00e4rjest\u00e4m\u00e4tt\u00f6m\u00e4\u00e4n luetteloon lis\u00e4\u00e4mme sopivan sy\u00f6tteen jokaiselle mahdolliselle hakuparametrillemme. Muokkaa HTML-koodia ja hakuparametreja tarpeidesi mukaan:<\/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>Huomioi <code>name<\/code>ominaisuudet; ne n\u00e4kyv\u00e4t URL-osoitteessa, kun lomake l\u00e4hetet\u00e4\u00e4n. Niiden on vastattava <code>query_vars<\/code>ja <code>get_query_var()<\/code>olemme m\u00e4\u00e4ritelleet aiemmin!<\/p>\n<p>Yll\u00e4 oleva koodi alkaa hahmontamalla tekstisy\u00f6te yleist\u00e4 tekstihakua varten. Asetamme <code>value<\/code>aiemmin haettuun muuttujaan, jonka haimme k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>get_query_var()<\/code>. T\u00e4m\u00e4 varmistaa, ett\u00e4 sy\u00f6te ei poistu haun j\u00e4lkeen.<\/p>\n<p>Seuraava parametri on tyylilajin pudotusvalikko mukautetusta taksonomiasta. T\u00e4m\u00e4n tuottamiseksi k\u00e4yt\u00e4mme funktiota <code>[wp_dropdown_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_dropdown_categories\/)()<\/code>. Katso dokumentaatiosivulta, miksi lis\u00e4\u00e4mme kaikki n\u00e4m\u00e4 parametrit mukauttaaksemme pudotusvalikon tarpeisiimme. On t\u00e4rke\u00e4\u00e4, ett\u00e4 attribuutti on <code>taxonomy<\/code>asetettu mukautettuun taksonomiimme, <code>name<\/code>attribuutti on oikea ja <code>selected<\/code>se on asetettu aiemmin haetun muuttujan arvoon. M\u00e4\u00e4ritimme my\u00f6s termien arvot niiden sluksiksi termitunnusten sijaan. Se n\u00e4ytt\u00e4\u00e4 paremmalta sen <code>?book-category=fiction<\/code>sijaan <code>?book-category=42<\/code>. Aktivoimme my\u00f6s &quot;ei mit\u00e4\u00e4n&quot; -vaihtoehdon &quot;Kaikki genre&quot; -vaihtoehdon lis\u00e4\u00e4miseksi.<\/p>\n<p>T\u00e4m\u00e4n j\u00e4lkeen kirjoitamme toisen tekstisy\u00f6tteen tekij\u00e4n etsimist\u00e4 varten, numerosy\u00f6tteen julkaisuvuodelle, tekstisy\u00f6tteen ISBN-numerolle ja lopuksi valintaruudun, joka on oletusarvoisesti valitsematon sis\u00e4llytt\u00e4\u00e4ksesi loppuneet kirjat.<\/p>\n<h3>3 Nollaa wp_query<\/h3>\n<p>Seuraava askel on pieni hakkerointi varmistaaksemme, ett\u00e4 sivutus toimii mukautetussa kyselyss\u00e4mme. Tallennamme virran <code>$wp_query<\/code>johonkin muuttujaan ja asetamme sen arvoon <code>null<\/code>. My\u00f6hemmin vaiheessa 6 nollaamme sen <code>$tmp_wpquery<\/code>muuttujasta.<\/p>\n<pre><code>$tmp_wpquery = $wp_query;\n$wp_query = null;<\/code><\/pre>\n<h3>4 M\u00e4\u00e4rit\u00e4 argumentit ja suorita mukautettu kysely<\/h3>\n<p>T\u00e4m\u00e4 osa koskee uuden kyselyn suorittamista. Aloitamme asettamalla perusargumentit ja lis\u00e4\u00e4mme sitten ehdollisesti parametreja riippuen siit\u00e4, mit\u00e4 l\u00f6ydettiin aiemmin haetuista muuttujista (simme <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>Yll\u00e4 oleva koodi rakentaa periaatteessa <code>WP_Query<\/code>parametrien avulla. Sivuston <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentaatiosivu<\/a><code>WP_Query<\/code> on loistava resurssi kyselyn luomiseen .<\/p>\n<p>Aivan ensimm\u00e4iset argumentit varmistavat, ett\u00e4 teemme kyselyit\u00e4 vain kirjoista ja ett\u00e4 ilmoitamme oikein, mill\u00e4 sivulla olemme t\u00e4ll\u00e4 hetkell\u00e4 \u2013 <code>paged<\/code>aiemmin hakemastamme muuttujasta. Sivulla olevien viestien m\u00e4\u00e4r\u00e4 on sinun p\u00e4\u00e4tett\u00e4viss\u00e4si, olen vain asettanut sen 20:een.<\/p>\n<p>Huomaa, ett\u00e4 &quot; <code>compare<\/code>&quot; lis\u00e4\u00e4minen kohtaan &quot; <code>LIKE<\/code>&quot; saa WordPressin etsim\u00e4\u00e4n mit\u00e4 tahansa, joka sis\u00e4lt\u00e4\u00e4 annetun merkkijonon. En lis\u00e4nnyt t\u00e4t\u00e4 ISBN-hakuun, koska haluan t\u00e4m\u00e4n kent\u00e4n l\u00f6yt\u00e4v\u00e4n t\u00e4ydellisesti vastaavat tulokset.<\/p>\n<p>T\u00e4rkeint\u00e4 on aivan lopussa, kun suoritamme kyselyn ja m\u00e4\u00e4rit\u00e4mme sen <code>wp_query<\/code>muuttujalle.<\/p>\n<h3>5 Selaa kyselyn tuloksia ja piirr\u00e4 sivutus<\/h3>\n<p>T\u00e4m\u00e4 vaihe on todella helppo. Tarvitsemme vain tavallisen silmukan, ja jokaiselle teemme kirjajulkaisun haluamallamme tavalla. T\u00e4m\u00e4 osa on t\u00e4ysin sinun p\u00e4\u00e4tett\u00e4viss\u00e4si.<\/p>\n<p>Alla oleva koodi n\u00e4ytt\u00e4\u00e4 perusesimerkin tulosten selaamisesta ja kutsumisesta <code>get_template_part()<\/code>jokaiselle viestille. Silmukan j\u00e4lkeen <code>the_posts_pagination()<\/code>k\u00e4ytet\u00e4\u00e4n sivutuslinkkien hahmontamiseen. Jos kysely ei palauttanut yht\u00e4\u00e4n viesti\u00e4, n\u00e4kyviin tulee yksinkertainen kappale, jossa on teksti.<\/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>S\u00e4\u00e4d\u00e4 HTML ja l\u00e4ht\u00f6 tarpeidesi mukaan. Yll\u00e4 oleva koodi odottaa mallitiedostoa teemassa, joka on nimetty <code>content-book.php<\/code>yhden kirjan render\u00f6imiseksi silmukassa. En n\u00e4yt\u00e4 sinulle, kuinka jokainen viesti hahmonnetaan, koska t\u00e4m\u00e4 on asia, jota jo todenn\u00e4k\u00f6isesti hallitset.<\/p>\n<h3>6 Palauta wp_query siihen, mik\u00e4 se oli<\/h3>\n<p>Viimeinen vaihe on <code>wp_query<\/code>objektin palauttaminen siihen, mit\u00e4 olemme tallentaneet aiemmin vaiheessa 3. Asetamme sen <code>null<\/code>ensimm\u00e4iseksi varmistaaksemme, ett\u00e4 se on nollattu.<\/p>\n<pre><code>$wp_query = null;\n$wp_query = $tmp_wpquery;<\/code><\/pre>\n<h2>Johtop\u00e4\u00e4t\u00f6s ja lopputulos<\/h2>\n<p>Ja siin\u00e4 se oli! Sinulla pit\u00e4isi nyt olla t\u00e4ysin toimiva edistynyt mukautettu hakumalli. Toivottavasti t\u00e4st\u00e4 on ollut sinulle apua \u2013 koodi on kirjoitettu mahdollisimman yleiseksi, jotta sinun on helppo mukautua tarpeisiisi. Ehk\u00e4 haluat erityyppisi\u00e4 parametreja tai mukautettu viestityyppisi on elokuvia tai jotain muuta varten!<\/p>\n<p>Jollain perustyylill\u00e4 se voi helposti n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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=\"Kuinka luoda mukautettu tarkennettu hakumalli WordPressiss\u00e4\" ><\/a><\/p>\n<p>T\u00e4ss\u00e4 on lopullinen koodi; osa <code>functions.php<\/code>ja malli:<\/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\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4m\u00e4 opetusohjelma on sinulle, jolla on mukautettu viestityyppi ja haluat luoda mukautetun tarkennetun hakusivun mukautetuilla hakukentill\u00e4 ja -parametreilla.<\/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":[895,719,719,895,917,917,1110,834,843,834,843,864,864],"tags":[1166],"class_list":["post-234010","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koodi","category-kehittaejae","category-muut","category-n-a","category-opas-aloittelijoille","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/234010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=234010"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/234010\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/151389"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=234010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=234010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=234010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}