{"id":233948,"date":"2023-02-27T14:39:00","date_gmt":"2023-02-27T11:39:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233948"},"modified":"2022-11-11T13:20:52","modified_gmt":"2022-11-11T10:20:52","slug":"hur-man-skapar-en-anpassad-avancerad-soekningsmall-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-skapar-en-anpassad-avancerad-soekningsmall-i-wordpress\/","title":{"rendered":"Hur man skapar en anpassad avancerad s\u00f6kningsmall i WordPress"},"content":{"rendered":"\n<p>Den h\u00e4r guiden \u00e4r f\u00f6r dig som har en anpassad posttyp (CPT) och vill ha en avancerad s\u00f6ksida som s\u00f6ker efter resultat inom denna CPT. I s\u00f6kformul\u00e4ret kan du st\u00e4lla in olika ing\u00e5ngar f\u00f6r s\u00f6kning inom olika f\u00e4lt; inl\u00e4ggstitel, inl\u00e4ggsinneh\u00e5ll, valfri typ av anpassad meta eller anpassad taxonomi.<\/p>\n<p>I det h\u00e4r inl\u00e4gget antar vi att vi har en anpassad inl\u00e4ggstyp f\u00f6r b\u00f6cker, en bifogad anpassad taxonomi f\u00f6r bokgenre och ett g\u00e4ng anpassade meta; f\u00f6rfattare, publicerings\u00e5r, ISBN-nummer och en kryssruta om boken finns i lager eller inte. Den anpassade posttypen och parametrarna \u00e4r helt upp till dig f\u00f6r att passa dina behov, koden nedan kommer helt enkelt att f\u00f6rs\u00f6ka t\u00e4cka de flesta av baserna.<\/p>\n<h2>Vad vi ska g\u00f6ra<\/h2>\n<p>Vi kommer att skapa en anpassad inl\u00e4ggstyp f\u00f6r b\u00f6cker och en anpassad hierarkisk taxonomi kopplad till den f\u00f6r genre. Dessutom har varje bok anpassade f\u00e4lt f\u00f6r f\u00f6rfattare(r), publicerings\u00e5r, ISBN-nummer och en kryssruta om b\u00f6cker som \u00e4r slut i lager ska inkluderas eller inte. N\u00e4r det g\u00e4ller sj\u00e4lva s\u00f6ksidan kommer vi att g\u00f6ra en sidmall d\u00e4r det mesta av v\u00e5r kod kommer att finnas. Sidan b\u00f6rjar med att rendera ett anpassat formul\u00e4r i b\u00f6rjan; visar alla m\u00f6jliga parametrar f\u00f6r att filtrera resultaten. Under den kommer alla bokresultat att visas i en lista. Vi best\u00e4mmer ett antal resultat per sida och l\u00e4gger till paginering l\u00e4ngst ner om antalet \u00f6verstiger detta.<\/p>\n<p>Det h\u00e4r \u00e4r de m\u00f6jliga filterparametrarna vi kommer att skapa f\u00f6r v\u00e5r avancerade s\u00f6kmall:<\/p>\n<ul>\n<li>Textinmatning f\u00f6r att s\u00f6ka efter valfri str\u00e4ng inom inl\u00e4ggets titel och inneh\u00e5ll.<\/li>\n<li>Dropdown f\u00f6r att v\u00e4lja en genre. Till\u00e5ter att v\u00e4lja en term eller l\u00e4mna den p\u00e5 &quot;Val som helst&quot;.<\/li>\n<li>Indata f\u00f6r att skriva f\u00f6rfattarens namn som s\u00f6ker i anpassad meta. L\u00f6st matchning vilket betyder att du anger &quot;Mark&quot; kommer att returnera alla f\u00f6rfattare vars namn \u00e4r eller inneh\u00e5ller &quot;Mark&quot;.<\/li>\n<li>Nummerinmatning f\u00f6r att ange \u00e5r boken publicerades som s\u00f6ker i anpassad meta. L\u00f6st matchning, vilket inneb\u00e4r att t.ex. &quot;20&quot; st\u00e4mmer \u00f6verens med vilken bok som helst som publicerades 1920 eller vilket \u00e5r som helst som b\u00f6rjar med 20.<\/li>\n<li>Inmatning f\u00f6r att ange ISBN (international <a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Standard_Book_Number\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">book ID<\/a>) som s\u00f6ker i anpassad meta. Returnerar endast exakta matchningar.<\/li>\n<li>Kryssa i huruvida b\u00f6cker som inte \u00e4r i lager ska inkluderas eller inte, \u00e4nnu en anpassad meta. Som standard \u00e4r detta avmarkerat, vilket inneb\u00e4r att resultaten endast visar b\u00f6cker som finns i lager.<\/li>\n<\/ul>\n<p>Formul\u00e4ret \u00e4r inst\u00e4llt f\u00f6r att anv\u00e4nda GET-metoden, vilket inneb\u00e4r att alla s\u00f6kta parametrar kommer att l\u00e4ggas till sidan i URL:en, i form av &quot; <code>?book-search=world&amp;year-published=2016&amp;book-author=mark<\/code>&quot;. Det andra alternativet om du vill undvika att ha &quot;fula webbadresser&quot; \u00e4r att anv\u00e4nda Javascript och AJAX. Men det finns n\u00e5gra nackdelar med detta. F\u00f6rst och fr\u00e4mst kommer det inte att vara m\u00f6jligt att bokm\u00e4rka en s\u00f6kning med specifika s\u00f6kparametrar &quot;f\u00f6rifyllda&quot;. F\u00f6rest\u00e4ll dig att du n\u00e5gon annanstans p\u00e5 din webbplats vill l\u00e4nka direkt till din anpassade s\u00f6ksida av en specifik f\u00f6rfattare. Du kan sedan f\u00e5 l\u00e4nken att g\u00e5 till din s\u00f6ksida, l\u00e4gga till &quot; <code>?author=mark<\/code>&quot;, och p\u00e5 s\u00e5 s\u00e4tt kommer ett klick p\u00e5 l\u00e4nken att leda direkt till resultaten f\u00f6r den f\u00f6rfattaren. Detta \u00e4r inte m\u00f6jligt att uppn\u00e5 med AJAX.<\/p>\n<p>S\u00f6kparametrarna \u00e4r \u00f6msesidigt inkluderande. Det betyder att en kombination av till exempel \u00e5r &#8221;2011&quot; och f\u00f6rfattaren &#8221;N\u00e5gon kille&#8221; kommer bara att returnera b\u00f6cker som matchar B\u00c5DA dessa. Om vi \u200b\u200bocks\u00e5 anger &quot;roligt&quot; i den allm\u00e4nna s\u00f6ktextinmatningen f\u00e5r vi bara returer som matchar alla tre av dessa. Sagt med olika ord; vi kommer att anv\u00e4nda OCH-logik. Detta \u00e4r den vanligaste metoden f\u00f6r att filtrera s\u00f6kresultat.<\/p>\n<p>Den h\u00e4r handledningen inkluderar inte styling s\u00e5 den h\u00e4r delen \u00e4r upp till dig. Nedan \u00e4r ett exempel p\u00e5 hur detta kan se ut med lite grundl\u00e4ggande styling.<\/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=\"Hur man skapar en anpassad avancerad s\u00f6kningsmall i WordPress\" ><\/a><\/p>\n<h2>En anteckning om paginering med en anpassad fr\u00e5ga<\/h2>\n<p>Om du vill ha sidnumrering p\u00e5 en anpassad fr\u00e5ga p\u00e5 en enda sida finns det n\u00e5gra saker att vara medveten om. En fr\u00e5gas paginering kan genereras med WordPress-funktionerna <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>eller de tv\u00e5 <code>[next_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/next_post_link\/)()<\/code>och <code>[previous_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/previous_post_link\/)()<\/code>. Dessa \u00e4r dock kodade f\u00f6r att fungera med det globala <code>wp_query<\/code>objektet (som f\u00f6r en sidmall \u00e4r sj\u00e4lva sidan), och inte en anpassad fr\u00e5ga.<\/p>\n<p>Det finns n\u00e5gra l\u00f6sningar, som att skriva en sidnumreringsfunktion sj\u00e4lv. Eller s\u00e5 kan du anv\u00e4nda \u00e5tg\u00e4rden <code>pre_get_posts<\/code>och manipulera <code>wp_query<\/code>objektet. Tyv\u00e4rr \u00e4r denna metod f\u00f6r sen f\u00f6r att p\u00e5verka sidnumreringsfunktioner. Ett annat alternativ \u00e4r att hoppa \u00f6ver paginering helt och h\u00e5llet och helt enkelt visa alla inl\u00e4gg. Detta kan vara ett alternativ om du inte har m\u00e5nga inl\u00e4gg, men om du g\u00f6r en avancerad anpassad s\u00f6kmall \u2013 jag antar att du har en hel del inl\u00e4gg.<\/p>\n<p>Vad vi kommer att g\u00f6ra i den h\u00e4r guiden \u00e4r en sorts &quot;hackisk&quot; metod. Vi kommer inom sidmallen att \u00e5sidos\u00e4tta <code>wp_query<\/code>objektet med v\u00e5r anpassade fr\u00e5ga s\u00e5 att loop- och pagineringsfunktionerna fungerar som f\u00f6rv\u00e4ntat. Denna metod \u00e4r den jag har haft mest framg\u00e5ng med.<\/p>\n<p>Utan vidare, l\u00e5t oss b\u00f6rja koda!<\/p>\n<h2>St\u00e4lla in anpassade inl\u00e4ggstyp, taxonomi och metaf\u00e4lt<\/h2>\n<p>Det f\u00f6rsta steget \u00e4r att definiera den anpassade posttyp vi vill skapa en avancerad s\u00f6kmall f\u00f6r. Om du redan har st\u00e4llt in en anpassad inl\u00e4ggstyp, eller vill implementera den f\u00f6r inl\u00e4gg eller sidor, kan du hoppa direkt till n\u00e4sta del.<\/p>\n<p>Vi definierar en anpassad posttyp <code>book<\/code>med en hierarkisk anpassad taxonomi <code>book_category<\/code>. Jag kommer inte att g\u00e5 in i detalj och f\u00f6rklara hur man skapar anpassade inl\u00e4ggstyper och taxonomier h\u00e4r. Om du \u00e4r intresserad av att l\u00e4ra dig mer har jag ett inl\u00e4gg som g\u00e5r in i detalj om detta.<\/p>\n<p>Placera den h\u00e4r koden var som helst i ditt tema <code>functions.php<\/code>eller plugin-kod:<\/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>Detta kommer att resultera i en anpassad inl\u00e4ggstyp med en taxonomi kopplad till den i admin.<\/p>\n<p>Att st\u00e4lla in den anpassade postmeta \u00e4r lite upp till dig &#8211; antingen hantera det manuellt med <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)()<\/code>eller anv\u00e4nd plugin <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) som \u00e4r perfekt f\u00f6r denna typ av arbete. Jag anv\u00e4nder ACF f\u00f6r att st\u00e4lla in f\u00e4lten programm\u00e4ssigt, s\u00e5 h\u00e4r:<\/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>Du \u00e4r sj\u00e4lvklart v\u00e4lkommen att st\u00e4lla in ACF-f\u00e4lten med hj\u00e4lp av ACF:s admin GUI. Men det finns flera f\u00f6rdelar med att l\u00e4gga till dem med kod. Till exempel att se till att du beh\u00e5ller samma f\u00e4lt var du \u00e4n aktiverar ditt tema eller plugin. Om du st\u00e4ller in f\u00e4lten i admin m\u00e5ste du komma ih\u00e5g att exportera och importera dem om du byter WordPress-webbplats.<\/p>\n<p>V\u00e4nligen notera metanamnen; t.ex. <code>book_author<\/code>, <code>year_published<\/code>och s\u00e5 vidare. Du h\u00e4nvisar till dessa n\u00e4r vi skapar den anpassade fr\u00e5gan p\u00e5 mallen f\u00f6r avancerad s\u00f6kning.<\/p>\n<p>Med ACF-plugin och koden ovan skulle redigering av en enda bok se ut s\u00e5 h\u00e4r:<\/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=\"Hur man skapar en anpassad avancerad s\u00f6kningsmall i WordPress\" ><\/a><\/p>\n<p>Med detta \u00e4r vi alla bra p\u00e5 att skapa s\u00e5 m\u00e5nga bokinl\u00e4gg vi vill. N\u00e4sta steg \u00e4r att skapa sidmallen f\u00f6r v\u00e5r s\u00f6kning.<\/p>\n<h2>Skapar sidmallen<\/h2>\n<p>L\u00e5t oss skapa sidmallen d\u00e4r vi l\u00e4gger in v\u00e5r mall f\u00f6r avancerad s\u00f6kning. G\u00f6r en kopia av ditt tema <code>single.php<\/code>eller <code>page.php<\/code>och byt namn p\u00e5 det till till exempel <code>template-booksearch.php<\/code>. HTML-koden \u00e4r upp till dig, men anledningen till att vi g\u00f6r en kopia av singel eller sida \u00e4r f\u00f6r att de f\u00f6rmodligen \u00e4r den n\u00e4rmaste mallen n\u00e4r det g\u00e4ller layout.<\/p>\n<p>H\u00f6gst upp i sidmallen markerar vi att detta \u00e4r en sidmall genom att skriva &quot;Mallnamn&quot; och dess namn i kommentarsblocket. Om du g\u00f6r detta kommer vi att se till att vi kan v\u00e4lja sidmallen n\u00e4r vi redigerar en sida.<\/p>\n<pre><code>&lt;?php \/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n...<\/code><\/pre>\n<p>De avsnitt vi beh\u00f6ver koda i v\u00e5r mall \u00e4r f\u00f6ljande, i denna ordning:<\/p>\n<ol>\n<li>Lagra alla variabler som tidigare skickats in av formul\u00e4ret med <code>get_query_var()<\/code>. Beh\u00f6ver ocks\u00e5 lagra aktuell sida<\/li>\n<li>\u00c5terge s\u00f6kformul\u00e4ret med en skicka-knapp f\u00f6r att utf\u00f6ra en s\u00f6kning<\/li>\n<li>\u00c5terst\u00e4ll <code>wp_query<\/code>objektet<\/li>\n<li>St\u00e4ll in argumenten f\u00f6r en ny <code>WP_Query()<\/code>beroende p\u00e5 s\u00f6kta parametrar och k\u00f6r fr\u00e5gan. Tilldela den anpassade fr\u00e5gan till <code>wp_query<\/code>objektet<\/li>\n<li>G\u00e5 igenom resultaten och visa dem. \u00c5terge ocks\u00e5 pagineringsl\u00e4nkar<\/li>\n<li>\u00c5terst\u00e4ll <code>wp_query<\/code>objektet till vad det var<\/li>\n<\/ol>\n<p>Anledningen till att vi m\u00e5ste lagra alla s\u00f6kta variabler och aktuell sida tidigt \u00e4r att dessa variabler kommer att g\u00e5 f\u00f6rlorade n\u00e4r vi \u00e5terst\u00e4ller <code>wp_query<\/code>objektet i steg 3. Vi beh\u00f6ver ocks\u00e5 variablerna f\u00f6r v\u00e5rt s\u00f6kformul\u00e4r f\u00f6r att fylla i f\u00e4lten.<\/p>\n<p>Best\u00e4m i mallen var du vill visa din anpassade s\u00f6kning, och l\u00e5t oss b\u00f6rja l\u00e4ngst upp:<\/p>\n<h3>1 H\u00e4mta alla s\u00f6kta variabler<\/h3>\n<p>Vi f\u00e5r tag p\u00e5 GET-parametrar (fr\u00e5n URL) med <code>[get_query_var](https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/)()<\/code>. Till exempel; om vi har en parameter <code>?book-author=benjamin<\/code>i URL:en skulle anv\u00e4ndning <code>get_query_var('book-author')<\/code>returnera str\u00e4ngen &#8217; <code>benjamin<\/code>&#8217;. Att h\u00e4mta alla variabler kan g\u00f6ras s\u00e5 h\u00e4r:<\/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>Men dessa \u00e4r alla anpassade parametrar som inte ing\u00e5r i WordPress standard GET-parametrar. WordPress kommer att ignorera alla GET-parametrar som det inte k\u00e4nner till, s\u00e5 att anropa dessa kommer alltid att returnera en tom str\u00e4ng. Vi m\u00e5ste ber\u00e4tta f\u00f6r WordPress att till\u00e5ta var och en av dessa GET-parametrar. Vi g\u00f6r detta genom att filtrera <code>query_vars<\/code>. I din <code>functions.php<\/code>, l\u00e4gg till detta ocks\u00e5:<\/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>Nu borde v\u00e5ra <code>get_query_var()<\/code>s kunna h\u00e4mta GET-parametrarna. Om de inte \u00e4r inst\u00e4llda returnerar den en tom str\u00e4ng.<\/p>\n<p>Vi m\u00e5ste ocks\u00e5 h\u00e4mta aktuell sida innan vi f\u00f6rst\u00f6r <code>wp_query<\/code>objektet. Den aktuella sidan \u00e4r en dold GET-parameter som kallas <code>paged<\/code>. Vi h\u00e4mtar det p\u00e5 samma s\u00e4tt som v\u00e5ra andra GET-parametrar, men vi kommer att st\u00e4lla in det till standard till 1 om det \u00e4r tomt.<\/p>\n<pre><code>$paged = (get_query_var('paged'))? get_query_var('paged'): 1;<\/code><\/pre>\n<p>Obs: Eftersom <code>paged<\/code>det \u00e4r en standard WordPress-parameter beh\u00f6ver vi inte l\u00e4gga <code>paged<\/code>till i <code>query_vars<\/code>filtret.<\/p>\n<h3>2 G\u00f6r s\u00f6kformul\u00e4ret<\/h3>\n<p>S\u00f6kformul\u00e4ret kommer helt enkelt att vara ett <code>&lt;form&gt;<\/code>med n\u00f6dv\u00e4ndiga inmatningar och en knapp f\u00f6r att skicka formul\u00e4r. HTML \u00e4r helt upp till dig, i exemplet nedan l\u00e4gger jag till indata i en enkel lista. Jag kommer inte att inkludera n\u00e5gon styling i denna handledning, det h\u00e4r \u00e4r upp till dig. Du kan v\u00e4lja att stila s\u00f6kformul\u00e4ret s\u00e5 att det ligger \u00f6verst i resultaten, eller vid sidan \u2013 vertikalt ned\u00e5t tillsammans med s\u00f6kresultaten.<\/p>\n<p>Obs: F\u00f6r att f\u00f6rkorta och modularisera den avancerade s\u00f6kmallen kan du separera s\u00f6kformul\u00e4rdelen i en separat mallfil och inkludera den med <code>[get_template_part](https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/)()<\/code>. Men f\u00f6r den h\u00e4r handledningens enkelhets skull kommer jag att inkludera allt i sj\u00e4lva mallfilen.<\/p>\n<p>Sj\u00e4lva formul\u00e4ret m\u00e5ste vara av metoden GET, och \u00e5tg\u00e4rden m\u00e5ste peka p\u00e5 sidan vi \u00e4r p\u00e5. F\u00f6r att g\u00f6ra detta kommer vi \u00e5t det globala <code>$post<\/code>objektet och f\u00e5r permal\u00e4nken fr\u00e5n det. I slutet l\u00e4gger vi till en skicka-knapp som skickar formul\u00e4ret.<\/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>Inom den oordnade listan l\u00e4gger vi till en passande ing\u00e5ng f\u00f6r var och en av v\u00e5ra m\u00f6jliga s\u00f6kparametrar. Justera HTML och s\u00f6kparametrarna s\u00e5 att de passar dina behov:<\/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>V\u00e4nligen notera <code>name<\/code>attributen; de \u00e4r vad som kommer att visas i URL:en n\u00e4r formul\u00e4ret skickas. De m\u00e5ste motsvara <code>query_vars<\/code>och <code>get_query_var()<\/code>vi har definierat tidigare!<\/p>\n<p>Ovanst\u00e5ende kod b\u00f6rjar med att \u00e5terge en textinmatning f\u00f6r den allm\u00e4nna texts\u00f6kningen. Vi st\u00e4ller in <code>value<\/code>till den tidigare s\u00f6kta variabeln som vi h\u00e4mtade med <code>get_query_var()<\/code>. Detta s\u00e4kerst\u00e4ller att inmatningen inte rensas efter att vi har gjort en s\u00f6kning.<\/p>\n<p>N\u00e4sta parameter \u00e4r en rullgardinsmeny med genre fr\u00e5n v\u00e5r anpassade taxonomi. F\u00f6r att g\u00f6ra detta anv\u00e4nder vi funktionen <code>[wp_dropdown_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_dropdown_categories\/)()<\/code>. Ta en titt p\u00e5 dokumentationssidan f\u00f6r att se varf\u00f6r vi l\u00e4gger till alla dessa parametrar f\u00f6r att anpassa rullgardinsmenyn efter v\u00e5ra behov. Det \u00e4r viktigt att attributet \u00e4r <code>taxonomy<\/code>inst\u00e4llt p\u00e5 v\u00e5r anpassade taxonomi, <code>name<\/code>attributet \u00e4r korrekt och <code>selected<\/code>\u00e4r inst\u00e4llt p\u00e5 v\u00e4rdet f\u00f6r den tidigare s\u00f6kta variabeln. Vi st\u00e4ller ocks\u00e5 in termv\u00e4rdena till att vara deras slugs ist\u00e4llet f\u00f6r term-ID:n. Det ser b\u00e4ttre ut med <code>?book-category=fiction<\/code>ist\u00e4llet f\u00f6r <code>?book-category=42<\/code>. Vi aktiverar ocks\u00e5 ett &quot;ingen&quot;-alternativ f\u00f6r att l\u00e4gga till ett &quot;Val som helst genre&quot;.<\/p>\n<p>D\u00e4refter g\u00f6r vi ytterligare en textinmatning f\u00f6r att s\u00f6ka efter f\u00f6rfattare, en nummerinmatning f\u00f6r publicerat \u00e5r, en textinmatning f\u00f6r ISBN-nummer och slutligen en kryssruta som \u00e4r avmarkerad som standard f\u00f6r att inkludera slutf\u00f6rs\u00e4ljningsb\u00f6cker.<\/p>\n<h3>3 \u00c5terst\u00e4ll wp_query<\/h3>\n<p>N\u00e4sta steg \u00e4r ett litet hack f\u00f6r att s\u00e4kerst\u00e4lla att paginering fungerar f\u00f6r v\u00e5r anpassade fr\u00e5ga. Vi lagrar helt enkelt str\u00f6mmen <code>$wp_query<\/code>i n\u00e5gon variabel och st\u00e4ller sedan in den p\u00e5 <code>null<\/code>. Senare, i steg 6 kommer vi att \u00e5terst\u00e4lla den fr\u00e5n <code>$tmp_wpquery<\/code>variabeln.<\/p>\n<pre><code>$tmp_wpquery = $wp_query;\n$wp_query = null;<\/code><\/pre>\n<h3>4 St\u00e4ll in argument och k\u00f6r anpassad fr\u00e5ga<\/h3>\n<p>Den h\u00e4r delen handlar om att utf\u00f6ra en ny fr\u00e5ga. Vi b\u00f6rjar med att s\u00e4tta upp de mest grundl\u00e4ggande argumenten, och sedan l\u00e4gger vi villkorligt till parametrar beroende p\u00e5 vad som hittades i tidigare s\u00f6kta variabler (fr\u00e5n v\u00e5ra <code>get_query_var()<\/code>s).<\/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>Ovanst\u00e5ende kod bygger i princip en <code>WP_Query<\/code>med parametrar. Dokumentationssidan <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r<\/a> \u00e4r en utm\u00e4rkt resurs f\u00f6r <code>WP_Query<\/code>att ta reda p\u00e5 hur man bygger en fr\u00e5ga.<\/p>\n<p>De allra f\u00f6rsta argumenten ser till att vi bara fr\u00e5gar efter b\u00f6cker och att vi informerar korrekt om vilken sida vi befinner oss p\u00e5 just nu \u2013 fr\u00e5n <code>paged<\/code>variabeln vi h\u00e4mtade tidigare. Antalet inl\u00e4gg per sida \u00e4r upp till dig, jag har helt enkelt st\u00e4llt in det till 20.<\/p>\n<p>Observera att om du l\u00e4gger till &#8217; <code>compare<\/code>&#8217; till &#8217; <code>LIKE<\/code>&#8217; kommer WordPress att s\u00f6ka efter allt som inneh\u00e5ller den givna str\u00e4ngen. Jag lade inte till detta i ISBN-s\u00f6kningen eftersom jag f\u00f6r det h\u00e4r f\u00e4ltet vill att det ska hitta resultat som matchar perfekt.<\/p>\n<p>Det viktiga \u00e4r precis i slutet, n\u00e4r vi faktiskt utf\u00f6r fr\u00e5gan, och tilldelar den fr\u00e5gan till <code>wp_query<\/code>variabeln.<\/p>\n<h3>5 G\u00e5 igenom fr\u00e5geresultaten och \u00e5terge sidnumrering<\/h3>\n<p>Det h\u00e4r steget \u00e4r verkligen enkelt. Allt vi beh\u00f6ver \u00e4r en standardslinga och f\u00f6r varje g\u00f6r vi bokinl\u00e4gget som vi vill. Denna del \u00e4r helt upp till dig.<\/p>\n<p>Koden nedan visar ett grundl\u00e4ggande exempel p\u00e5 att g\u00e5 igenom resultaten, kallar <code>get_template_part()<\/code>f\u00f6r varje inl\u00e4gg. Efter slingan <code>the_posts_pagination()<\/code>anv\u00e4nds f\u00f6r att rendera pagineringsl\u00e4nkar. Om fr\u00e5gan inte gav n\u00e5gra inl\u00e4gg visas ett enkelt stycke med en text.<\/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>Justera HTML och utdata f\u00f6r att passa dina behov. Ovanst\u00e5ende kod f\u00f6rv\u00e4ntar sig en mallfil i temat namngiven <code>content-book.php<\/code>f\u00f6r att rendera en enda bok i slingan. Jag kommer inte att visa dig hur du renderar varje inl\u00e4gg eftersom detta \u00e4r n\u00e5got du med st\u00f6rsta sannolikhet redan har kontroll \u00f6ver.<\/p>\n<h3>6 \u00c5terst\u00e4ll wp_query till vad det var<\/h3>\n<p>Det sista steget \u00e4r att \u00e5terst\u00e4lla <code>wp_query<\/code>objektet till det vi lagrade tidigare i steg 3. Vi st\u00e4ller in det p\u00e5 <code>null<\/code>f\u00f6rst f\u00f6r att s\u00e4kerst\u00e4lla att det \u00e4r \u00e5terst\u00e4llt.<\/p>\n<pre><code>$wp_query = null;\n$wp_query = $tmp_wpquery;<\/code><\/pre>\n<h2>Slutsats och slutresultat<\/h2>\n<p>Och det var det! Du b\u00f6r nu ha en fullt fungerande avancerad anpassad s\u00f6kmall. Jag hoppas att detta har varit lite hj\u00e4lp f\u00f6r dig \u2013 koden har skrivits s\u00e5 generellt som m\u00f6jligt f\u00f6r att g\u00f6ra det enkelt f\u00f6r dig att anpassa dig efter dina behov. Kanske vill du ha olika typer av parametrar, eller s\u00e5 \u00e4r din anpassade inl\u00e4ggstyp f\u00f6r filmer eller n\u00e5got annat!<\/p>\n<p>Med lite grundl\u00e4ggande styling kan det enkelt se ut s\u00e5 h\u00e4r:<\/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=\"Hur man skapar en anpassad avancerad s\u00f6kningsmall i WordPress\" ><\/a><\/p>\n<p>H\u00e4r \u00e4r den sista koden; <code>functions.php<\/code>delen och mallen :<\/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\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Den h\u00e4r handledningen \u00e4r f\u00f6r dig som har en anpassad inl\u00e4ggstyp och vill skapa en anpassad avancerad s\u00f6ksida med anpassade s\u00f6kf\u00e4lt och parametrar.<\/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":[901,724,838,848,901,922,1110,922,838,848,724,868,868],"tags":[1173],"class_list":["post-233948","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-guide-foer-nyboerjare","category-handledningar","category-oevrig","category-n-a","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233948","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233948"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233948\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/151389"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233948"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233948"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}