{"id":234279,"date":"2023-02-27T14:46:00","date_gmt":"2023-02-27T11:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234279"},"modified":"2022-11-12T03:28:09","modified_gmt":"2022-11-12T00:28:09","slug":"comment-creer-un-modele-de-recherche-avancee-personnalise-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-creer-un-modele-de-recherche-avancee-personnalise-dans-wordpress\/","title":{"rendered":"Comment cr\u00e9er un mod\u00e8le de recherche avanc\u00e9e personnalis\u00e9 dans WordPress"},"content":{"rendered":"\n<p>Ce guide est destin\u00e9 \u00e0 vous qui avez un type de publication personnalis\u00e9 (CPT) et souhaitez une page de recherche avanc\u00e9e qui recherche des r\u00e9sultats dans ce CPT. Dans le formulaire de recherche, vous pouvez configurer diff\u00e9rentes entr\u00e9es pour effectuer une recherche dans diff\u00e9rents champs\u00a0; titre de publication, contenu de publication, tout type de m\u00e9ta personnalis\u00e9 ou par taxonomie personnalis\u00e9e.<\/p>\n<p>Dans cet article, nous supposerons que nous avons un type de publication personnalis\u00e9 pour les livres, une taxonomie personnalis\u00e9e jointe pour le genre de livre et un tas de m\u00e9ta personnalis\u00e9es\u00a0; auteur, ann\u00e9e de publication, num\u00e9ro ISBN et une case indiquant si le livre est en stock ou non. Le type et les param\u00e8tres de publication personnalis\u00e9s d\u00e9pendent enti\u00e8rement de vous pour r\u00e9pondre \u00e0 vos besoins, le code ci-dessous essaiera simplement de couvrir la plupart des bases.<\/p>\n<h2>Ce que nous ferons<\/h2>\n<p>Nous allons cr\u00e9er un type de publication personnalis\u00e9 pour les livres et une taxonomie hi\u00e9rarchique personnalis\u00e9e qui lui sera associ\u00e9e pour le genre. De plus, chaque livre a des champs personnalis\u00e9s pour les auteurs, l&rsquo;ann\u00e9e de publication, le num\u00e9ro ISBN et une case \u00e0 cocher pour inclure ou non les livres en rupture de stock. En ce qui concerne la page de recherche elle-m\u00eame, nous cr\u00e9erons un mod\u00e8le de page o\u00f9 r\u00e9sidera la majeure partie de notre code. La page commencera par afficher un formulaire personnalis\u00e9 au d\u00e9but\u00a0; montrant tous les param\u00e8tres possibles pour filtrer les r\u00e9sultats. En dessous, tous les r\u00e9sultats de livres appara\u00eetront dans une liste. Nous d\u00e9cidons d&rsquo;un nombre de r\u00e9sultats par page et ajoutons une pagination en bas si le nombre d\u00e9passe ce nombre.<\/p>\n<p>Voici les param\u00e8tres de filtre possibles que nous allons cr\u00e9er pour notre mod\u00e8le de recherche avanc\u00e9e\u00a0:<\/p>\n<ul>\n<li>Saisie de texte pour rechercher n&rsquo;importe quelle cha\u00eene dans le titre et le contenu de l&rsquo;article.<\/li>\n<li>Liste d\u00e9roulante pour choisir un genre. Permet de choisir un terme ou de le laisser \u00e0 &quot;Tout&quot;.<\/li>\n<li>Entr\u00e9e pour taper le nom de l&rsquo;auteur qui recherche dans la m\u00e9ta personnalis\u00e9e. Une correspondance l\u00e2che, ce qui signifie que la saisie de &quot;Mark&quot; renverra tous les auteurs dont le nom est ou contient &quot;Mark&quot;.<\/li>\n<li>Entr\u00e9e num\u00e9rique pour entrer l&rsquo;ann\u00e9e de publication du livre qui recherche dans la m\u00e9ta personnalis\u00e9e. Correspondance l\u00e2che, ce qui signifie entrer par exemple &quot;20&quot; correspondra \u00e0 n&rsquo;importe quel livre publi\u00e9 en 1920 ou \u00e0 n&rsquo;importe quelle ann\u00e9e commen\u00e7ant par 20.<\/li>\n<li>Entr\u00e9e pour entrer l&rsquo;ISBN (<a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Standard_Book_Number\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ID international du livre<\/a>) qui recherche dans la m\u00e9ta personnalis\u00e9e. Renvoie uniquement les correspondances pr\u00e9cises.<\/li>\n<li>Case \u00e0 cocher pour inclure ou non les livres en rupture de stock, encore une autre m\u00e9ta personnalis\u00e9e. Par d\u00e9faut, cette option n&rsquo;est pas coch\u00e9e, ce qui signifie que les r\u00e9sultats n&rsquo;affichent que les livres en stock.<\/li>\n<\/ul>\n<p>Le formulaire est configur\u00e9 pour utiliser la m\u00e9thode GET, ce qui signifie que tous les param\u00e8tres recherch\u00e9s seront ajout\u00e9s \u00e0 la page dans l&rsquo;URL, sous la forme de &quot; <code>?book-search=world&amp;year-published=2016&amp;book-author=mark<\/code>&quot;. L&rsquo;autre option si vous voulez \u00e9viter d&rsquo;avoir des &quot;URL laides&quot; est d&rsquo;utiliser Javascript et AJAX. Mais il y a quelques inconv\u00e9nients \u00e0 cela. Tout d&rsquo;abord, il ne sera pas possible de marquer une recherche avec des param\u00e8tres de recherche sp\u00e9cifiques &quot;pr\u00e9-remplis&quot;. Imaginez que vous, ailleurs sur votre site, vouliez cr\u00e9er un lien direct vers votre page de recherche personnalis\u00e9e par un auteur sp\u00e9cifique. Vous pouvez ensuite faire en sorte que le lien aille vers votre page de recherche, ajouter &quot; <code>?author=mark<\/code>&quot;, et ainsi cliquer sur le lien m\u00e8nera directement aux r\u00e9sultats pour cet auteur. Ce n&rsquo;est pas possible avec AJAX.<\/p>\n<p>Les param\u00e8tres de recherche sont mutuellement inclus. Cela signifie que la combinaison, par exemple, de l&rsquo;ann\u00e9e &quot;2011&quot; et de l&rsquo;auteur &quot;Some guy&quot; ne renverra que les livres qui correspondent aux DEUX. Si nous sp\u00e9cifions \u00e9galement &quot;dr\u00f4le&quot; dans la saisie de texte de recherche g\u00e9n\u00e9rale, nous n&rsquo;obtiendrons que des retours correspondant aux trois \u00e9l\u00e9ments. Dit en des mots diff\u00e9rents; nous utiliserons la logique ET. Il s&rsquo;agit de la m\u00e9thode la plus courante pour filtrer les r\u00e9sultats de recherche.<\/p>\n<p>Ce didacticiel n&rsquo;inclura pas le style, cette partie d\u00e9pend donc de vous. Vous trouverez ci-dessous un exemple de ce \u00e0 quoi cela pourrait ressembler avec un style de base.<\/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=\"Comment cr\u00e9er un mod\u00e8le de recherche avanc\u00e9e personnalis\u00e9 dans WordPress\" ><\/a><\/p>\n<h2>Une note sur la pagination avec une requ\u00eate personnalis\u00e9e<\/h2>\n<p>Si vous voulez une pagination sur une requ\u00eate personnalis\u00e9e dans une seule page, il y a quelques points \u00e0 prendre en compte. La pagination d&rsquo;une requ\u00eate peut \u00eatre g\u00e9n\u00e9r\u00e9e avec les fonctions WordPress <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>, ou les deux <code>[next_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/next_post_link\/)()<\/code>et <code>[previous_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/previous_post_link\/)()<\/code>. Cependant, ceux-ci sont cod\u00e9s pour fonctionner avec l&rsquo; <code>wp_query<\/code>objet global (qui, pour un mod\u00e8le de page, est la page elle-m\u00eame), et non une requ\u00eate personnalis\u00e9e.<\/p>\n<p>Il existe quelques solutions de contournement, telles que l&rsquo;\u00e9criture d&rsquo;une fonction de pagination vous-m\u00eame. Ou vous pouvez utiliser l&rsquo;action <code>pre_get_posts<\/code>et manipuler l&rsquo; <code>wp_query<\/code>objet. Malheureusement, cette m\u00e9thode est trop tardive pour affecter les fonctions de pagination. Une autre alternative consiste \u00e0 ignorer compl\u00e8tement la pagination et \u00e0 afficher simplement tous les messages. Cela pourrait \u00eatre une option si vous n&rsquo;avez pas beaucoup de publications, mais si vous cr\u00e9ez un mod\u00e8le de recherche personnalis\u00e9 avanc\u00e9, je suppose que vous avez pas mal de publications.<\/p>\n<p>Ce que nous allons faire dans ce guide est une sorte de m\u00e9thode &quot;hackish&quot;. Dans le mod\u00e8le de page, nous remplacerons l&rsquo; <code>wp_query<\/code>objet par notre requ\u00eate personnalis\u00e9e afin que les fonctions de boucle et de pagination fonctionnent comme pr\u00e9vu. Cette m\u00e9thode est celle avec laquelle j&rsquo;ai eu le plus de succ\u00e8s.<\/p>\n<p>Sans plus tarder, commen\u00e7ons \u00e0 coder\u00a0!<\/p>\n<h2>Configuration du type de publication personnalis\u00e9, de la taxonomie et des champs m\u00e9ta<\/h2>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 d\u00e9finir le type de publication personnalis\u00e9 pour lequel nous voulons cr\u00e9er un mod\u00e8le de recherche avanc\u00e9e. Si vous avez d\u00e9j\u00e0 configur\u00e9 un type de publication personnalis\u00e9 ou souhaitez l&rsquo;impl\u00e9menter pour des publications ou des pages, vous pouvez passer directement \u00e0 la partie suivante.<\/p>\n<p>Nous d\u00e9finissons un type de publication personnalis\u00e9 <code>book<\/code>avec une taxonomie personnalis\u00e9e hi\u00e9rarchique <code>book_category<\/code>. Je n&rsquo;entrerai pas dans les d\u00e9tails pour expliquer comment cr\u00e9er des types de publication personnalis\u00e9s et des taxonomies ici. Si vous souhaitez en savoir plus, j&rsquo;ai un article qui d\u00e9taille ce sujet.<\/p>\n<p>Mettez ce code n&rsquo;importe o\u00f9 dans le code de votre th\u00e8me <code>functions.php<\/code>ou plugin\u00a0:<\/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>Cela se traduira par un type de publication personnalis\u00e9 avec une taxonomie qui lui est attach\u00e9e dans l&rsquo;administration.<\/p>\n<p>La configuration de la m\u00e9ta de publication personnalis\u00e9e d\u00e9pend un peu de vous &#8211; g\u00e9rez-la manuellement avec <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)()<\/code>ou utilisez le plugin <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) qui est parfait pour ce type de travail. Je vais utiliser ACF pour configurer les champs par programmation, comme ceci\u00a0:<\/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>Vous \u00eates bien s\u00fbr invit\u00e9s \u00e0 configurer les champs ACF \u00e0 l&rsquo;aide de l&rsquo;interface graphique d&rsquo;administration d&rsquo;ACF. Mais il y a plusieurs avantages \u00e0 les ajouter par code. Par exemple, assurez-vous de conserver les m\u00eames champs partout o\u00f9 vous activez votre th\u00e8me ou votre plugin. Si vous configurez les champs dans l&rsquo;administration, vous devez vous rappeler de les exporter et de les importer si vous changez de site WordPress.<\/p>\n<p>Veuillez noter les m\u00e9ta-noms\u00a0; par exemple <code>book_author<\/code>, <code>year_published<\/code>, et ainsi de suite. Vous vous y r\u00e9f\u00e9rerez lorsque nous cr\u00e9erons la requ\u00eate personnalis\u00e9e sur le mod\u00e8le de recherche avanc\u00e9e.<\/p>\n<p>Avec le plugin ACF et le code ci-dessus, l&rsquo;\u00e9dition d&rsquo;un seul livre ressemblerait \u00e0 ceci\u00a0:<\/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=\"Comment cr\u00e9er un mod\u00e8le de recherche avanc\u00e9e personnalis\u00e9 dans WordPress\" ><\/a><\/p>\n<p>Avec cela, nous sommes tous bons pour cr\u00e9er autant de publications que nous voulons. L&rsquo;\u00e9tape suivante consiste \u00e0 cr\u00e9er le mod\u00e8le de page pour notre recherche.<\/p>\n<h2>Cr\u00e9ation du mod\u00e8le de page<\/h2>\n<p>Cr\u00e9ons le mod\u00e8le de page dans lequel nous placerons notre mod\u00e8le de recherche avanc\u00e9e. Faites une copie du <code>single.php<\/code>ou de votre th\u00e8me <code>page.php<\/code>et renommez-le par exemple <code>template-booksearch.php<\/code>. Le code HTML d\u00e9pend de vous, mais la raison pour laquelle nous faisons une copie d&rsquo;une page ou d&rsquo;une page est qu&rsquo;il s&rsquo;agit probablement du mod\u00e8le le plus proche en termes de mise en page.<\/p>\n<p>Tout en haut du mod\u00e8le de page, nous signifions qu&rsquo;il s&rsquo;agit d&rsquo;un mod\u00e8le de page en \u00e9crivant &quot;Nom du mod\u00e8le&quot; et son nom dans le bloc de commentaires. Cela garantira que nous pouvons s\u00e9lectionner le mod\u00e8le de page lorsque nous modifions une page.<\/p>\n<pre><code>&lt;?php \/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n...<\/code><\/pre>\n<p>Les sections que nous devons coder dans notre mod\u00e8le sont les suivantes, dans cet ordre\u00a0:<\/p>\n<ol>\n<li>Stockez toutes les variables pr\u00e9c\u00e9demment soumises par le formulaire, en utilisant <code>get_query_var()<\/code>. Besoin \u00e9galement de stocker la page actuelle<\/li>\n<li>Rendre le formulaire de recherche avec un bouton Soumettre pour effectuer une recherche<\/li>\n<li>R\u00e9initialiser l&rsquo; <code>wp_query<\/code>objet<\/li>\n<li>Configurez les arguments d&rsquo;un nouveau <code>WP_Query()<\/code>en fonction des param\u00e8tres recherch\u00e9s et ex\u00e9cutez la requ\u00eate. Affecter la requ\u00eate personnalis\u00e9e \u00e0 l&rsquo; <code>wp_query<\/code>objet<\/li>\n<li>Parcourez les r\u00e9sultats et affichez-les. Rendre \u00e9galement les liens de pagination<\/li>\n<li>R\u00e9initialiser l&rsquo; <code>wp_query<\/code>objet \u00e0 ce qu&rsquo;il \u00e9tait<\/li>\n<\/ol>\n<p>La raison pour laquelle nous devons stocker t\u00f4t toutes les variables recherch\u00e9es et la page actuelle est que ces variables seront perdues une fois que nous aurons r\u00e9initialis\u00e9 l&rsquo; <code>wp_query<\/code>objet \u00e0 l&rsquo;\u00e9tape 3. Nous avons \u00e9galement besoin des variables de notre formulaire de recherche pour remplir les champs.<\/p>\n<p>Dans votre mod\u00e8le, d\u00e9cidez de l&rsquo;endroit o\u00f9 vous souhaitez afficher votre recherche personnalis\u00e9e, et commen\u00e7ons par le haut\u00a0:<\/p>\n<h3>1 Obtenir toutes les variables recherch\u00e9es<\/h3>\n<p>Nous r\u00e9cup\u00e9rons les param\u00e8tres GET (\u00e0 partir de l&rsquo;URL) avec <code>[get_query_var](https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/)()<\/code>. Par exemple; si nous avons un param\u00e8tre <code>?book-author=benjamin<\/code>dans l&rsquo;URL, l&rsquo;utilisation <code>get_query_var('book-author')<\/code>renverrait la cha\u00eene &lsquo; <code>benjamin<\/code>&lsquo;. La r\u00e9cup\u00e9ration de toutes les variables peut \u00eatre effectu\u00e9e comme suit\u00a0:<\/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>Mais ce sont tous des param\u00e8tres personnalis\u00e9s qui ne font pas partie des param\u00e8tres GET standard de WordPress. WordPress ignorera tous les param\u00e8tres GET qu&rsquo;il ne conna\u00eet pas, donc les appeler renverra toujours une cha\u00eene vide. Nous devons dire \u00e0 WordPress d&rsquo;autoriser chacun de ces param\u00e8tres GET. Nous le faisons en filtrant <code>query_vars<\/code>. Dans votre <code>functions.php<\/code>, ajoutez \u00e9galement ceci\u00a0:<\/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>Maintenant, nos <code>get_query_var()<\/code>devraient pouvoir r\u00e9cup\u00e9rer les param\u00e8tres GET. S&rsquo;ils ne sont pas d\u00e9finis, il renvoie une cha\u00eene vide.<\/p>\n<p>Nous devons \u00e9galement r\u00e9cup\u00e9rer la page actuelle avant de g\u00e2cher l&rsquo; <code>wp_query<\/code>objet. La page en cours est un param\u00e8tre GET cach\u00e9 appel\u00e9 <code>paged<\/code>. Nous allons le r\u00e9cup\u00e9rer de la m\u00eame mani\u00e8re que nos autres param\u00e8tres GET, mais nous le d\u00e9finirons par d\u00e9faut sur 1 s&rsquo;il est vide.<\/p>\n<pre><code>$paged = (get_query_var('paged'))? get_query_var('paged'): 1;<\/code><\/pre>\n<p>Remarque\u00a0: Comme <code>paged<\/code>il s&rsquo;agit d&rsquo;un param\u00e8tre WordPress standard, nous n&rsquo;avons pas besoin d&rsquo;ajouter <code>paged<\/code>au <code>query_vars<\/code>filtre.<\/p>\n<h3>2 Afficher le formulaire de recherche<\/h3>\n<p>Le formulaire de recherche sera simplement un <code>&lt;form&gt;<\/code>avec les entr\u00e9es n\u00e9cessaires et un bouton de soumission de formulaire. Le HTML d\u00e9pend enti\u00e8rement de vous, dans l&rsquo;exemple ci-dessous, j&rsquo;ajoute les entr\u00e9es dans une simple liste. Je n&rsquo;inclurai aucun style dans ce tutoriel, c&rsquo;est \u00e0 vous de d\u00e9cider. Vous pouvez choisir de styliser le formulaire de recherche pour qu&rsquo;il r\u00e9side en haut des r\u00e9sultats ou sur le c\u00f4t\u00e9 &#8211; verticalement vers le bas avec les r\u00e9sultats de la recherche.<\/p>\n<p>Remarque: Pour raccourcir et modulariser le mod\u00e8le de recherche avanc\u00e9e, vous pouvez s\u00e9parer la partie du formulaire de recherche dans un fichier de mod\u00e8le s\u00e9par\u00e9 et l&rsquo;inclure avec <code>[get_template_part](https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/)()<\/code>. Mais pour la simplicit\u00e9 de ce tutoriel, j&rsquo;inclurai tout dans le fichier de mod\u00e8le lui-m\u00eame.<\/p>\n<p>Le formulaire lui-m\u00eame doit \u00eatre de la m\u00e9thode GET, et l&rsquo;action doit pointer vers la page sur laquelle nous nous trouvons. Pour ce faire, nous acc\u00e9dons \u00e0 l&rsquo; <code>$post<\/code>objet global et obtenons le lien permanent \u00e0 partir de celui-ci. \u00c0 la fin, nous ajoutons un bouton de soumission qui soumettra le formulaire.<\/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>Dans la liste non ordonn\u00e9e, nous ajouterons une entr\u00e9e appropri\u00e9e pour chacun de nos param\u00e8tres de recherche possibles. Ajustez le code HTML et les param\u00e8tres de recherche en fonction de vos besoins\u00a0:<\/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>Veuillez prendre note des <code>name<\/code>attributs\u00a0; ils sont ce qui appara\u00eetra dans l&rsquo;URL lorsque le formulaire est soumis. Ils doivent correspondre aux <code>query_vars<\/code>et <code>get_query_var()<\/code>que nous avons d\u00e9finis pr\u00e9c\u00e9demment !<\/p>\n<p>Le code ci-dessus commence par rendre une entr\u00e9e de texte pour la recherche de texte g\u00e9n\u00e9rale. Nous d\u00e9finissons la <code>value<\/code>variable pr\u00e9c\u00e9demment recherch\u00e9e que nous avons r\u00e9cup\u00e9r\u00e9e \u00e0 l&rsquo;aide de <code>get_query_var()<\/code>. Cela garantit que l&rsquo;entr\u00e9e ne s&rsquo;efface pas apr\u00e8s que nous ayons effectu\u00e9 une recherche.<\/p>\n<p>Le param\u00e8tre suivant est une liste d\u00e9roulante de genre de notre taxonomie personnalis\u00e9e. Pour le rendre, nous utilisons la fonction <code>[wp_dropdown_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_dropdown_categories\/)()<\/code>. Jetez un \u0153il \u00e0 la page de documentation pour voir pourquoi nous ajoutons tous ces param\u00e8tres pour ajuster la liste d\u00e9roulante \u00e0 nos besoins. Il est important que l&rsquo; attribut soit <code>taxonomy<\/code>d\u00e9fini sur notre taxonomie personnalis\u00e9e, <code>name<\/code>soit correct et <code>selected<\/code>soit d\u00e9fini sur la valeur de la variable pr\u00e9c\u00e9demment recherch\u00e9e. Nous d\u00e9finissons \u00e9galement les valeurs des termes comme \u00e9tant leurs slugs au lieu des ID de termes. C&rsquo;est mieux avec <code>?book-category=fiction<\/code>au lieu de <code>?book-category=42<\/code>. Nous activons \u00e9galement une option &quot;aucun&quot; pour ajouter une option &quot;Tout genre&quot;.<\/p>\n<p>Ensuite, nous rendons une autre entr\u00e9e de texte pour la recherche d&rsquo;auteur, une entr\u00e9e de nombre pour l&rsquo;ann\u00e9e de publication, une entr\u00e9e de texte pour le num\u00e9ro ISBN, et enfin une case \u00e0 cocher qui est d\u00e9coch\u00e9e par d\u00e9faut pour inclure les livres en rupture de stock.<\/p>\n<h3>3 R\u00e9initialisez le wp_query<\/h3>\n<p>La prochaine \u00e9tape est un petit hack afin de s&rsquo;assurer que la pagination fonctionne pour notre requ\u00eate personnalis\u00e9e. Nous stockons simplement le courant <code>$wp_query<\/code>dans une variable, puis le d\u00e9finissons sur <code>null<\/code>. Plus tard, \u00e0 l&rsquo;\u00e9tape 6, nous le r\u00e9initialiserons \u00e0 partir de la <code>$tmp_wpquery<\/code>variable.<\/p>\n<pre><code>$tmp_wpquery = $wp_query;\n$wp_query = null;<\/code><\/pre>\n<h3>4 Configurer des arguments et ex\u00e9cuter une requ\u00eate personnalis\u00e9e<\/h3>\n<p>Cette partie consiste \u00e0 effectuer une nouvelle requ\u00eate. Nous commen\u00e7ons par configurer les arguments les plus \u00e9l\u00e9mentaires, puis nous ajoutons conditionnellement des param\u00e8tres en fonction de ce qui a \u00e9t\u00e9 trouv\u00e9 dans les variables pr\u00e9c\u00e9demment recherch\u00e9es (de notre <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>Le code ci-dessus construit essentiellement un <code>WP_Query<\/code>avec des param\u00e8tres. La <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">page de documentation<\/a> de <code>WP_Query<\/code>est une excellente ressource pour comprendre comment cr\u00e9er une requ\u00eate.<\/p>\n<p>Les tout premiers arguments garantissent que nous n&rsquo;interrogeons que les livres et que nous informons correctement la page sur laquelle nous nous trouvons actuellement &#8211; \u00e0 partir de la <code>paged<\/code>variable que nous avons r\u00e9cup\u00e9r\u00e9e plus t\u00f4t. Le nombre de messages par page d\u00e9pend de vous, je l&rsquo;ai simplement d\u00e9fini sur 20.<\/p>\n<p>Notez que l&rsquo;ajout de &lsquo; <code>compare<\/code>&lsquo; \u00e0 &lsquo; <code>LIKE<\/code>&lsquo; obligera WordPress \u00e0 rechercher tout ce qui contient la cha\u00eene donn\u00e9e. Je ne l&rsquo;ai pas ajout\u00e9 \u00e0 la recherche ISBN car pour ce champ, je veux qu&rsquo;il trouve des r\u00e9sultats qui correspondent parfaitement.<\/p>\n<p>L&rsquo;important est juste \u00e0 la fin, lorsque nous ex\u00e9cutons r\u00e9ellement la requ\u00eate, et affectons cette requ\u00eate \u00e0 la <code>wp_query<\/code>variable.<\/p>\n<h3>5 Parcourez les r\u00e9sultats de la requ\u00eate et rendez la pagination<\/h3>\n<p>Cette \u00e9tape est vraiment facile. Tout ce dont nous avons besoin est une boucle standard et pour chacune, nous rendons la publication du livre comme nous le souhaitons. Cette partie d\u00e9pend enti\u00e8rement de vous.<\/p>\n<p>Le code ci-dessous montre un exemple de base de boucle \u00e0 travers les r\u00e9sultats, appelant <code>get_template_part()<\/code>pour chaque message. Apr\u00e8s la boucle <code>the_posts_pagination()<\/code>est utilis\u00e9e pour rendre les liens de pagination. Si la requ\u00eate n&rsquo;a renvoy\u00e9 aucune publication, un simple paragraphe avec un texte s&rsquo;affiche.<\/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>Ajustez le code HTML et la sortie en fonction de vos besoins. Le code ci-dessus attend un fichier de mod\u00e8le dans le th\u00e8me nomm\u00e9 <code>content-book.php<\/code>pour afficher un seul livre dans la boucle. Je ne vous montrerai pas comment rendre chaque message car c&rsquo;est quelque chose sur lequel vous avez probablement d\u00e9j\u00e0 le contr\u00f4le.<\/p>\n<h3>6 R\u00e9initialisez le wp_query \u00e0 ce qu&rsquo;il \u00e9tait<\/h3>\n<p>La derni\u00e8re \u00e9tape consiste \u00e0 r\u00e9initialiser l&rsquo; <code>wp_query<\/code>objet sur ce que nous avons stock\u00e9 pr\u00e9c\u00e9demment \u00e0 l&rsquo;\u00e9tape 3. Nous le d\u00e9finissons en <code>null<\/code>premier pour nous assurer qu&rsquo;il est r\u00e9initialis\u00e9.<\/p>\n<pre><code>$wp_query = null;\n$wp_query = $tmp_wpquery;<\/code><\/pre>\n<h2>Conclusion et r\u00e9sultat final<\/h2>\n<p>Et c&rsquo;\u00e9tait tout! Vous devriez maintenant avoir un mod\u00e8le de recherche personnalis\u00e9 avanc\u00e9 enti\u00e8rement fonctionnel. J&rsquo;esp\u00e8re que cela vous a \u00e9t\u00e9 utile &#8211; le code a \u00e9t\u00e9 \u00e9crit de mani\u00e8re aussi g\u00e9n\u00e9rale que possible pour vous permettre de vous adapter facilement \u00e0 vos besoins. Peut-\u00eatre souhaitez-vous diff\u00e9rents types de param\u00e8tres, ou votre type de publication personnalis\u00e9 est-il destin\u00e9 aux films ou \u00e0 autre chose\u00a0!<\/p>\n<p>Avec un style de base, cela peut facilement ressembler \u00e0 ceci\u00a0:<\/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=\"Comment cr\u00e9er un mod\u00e8le de recherche avanc\u00e9e personnalis\u00e9 dans WordPress\" ><\/a><\/p>\n<p>Voici le code final\u00a0; la <code>functions.php<\/code>pi\u00e8ce et le mod\u00e8le\u00a0:<\/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\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce didacticiel s&rsquo;adresse \u00e0 vous qui avez un type de publication personnalis\u00e9 et souhaitez cr\u00e9er une page de recherche avanc\u00e9e personnalis\u00e9e avec des champs et des param\u00e8tres de recherche personnalis\u00e9s.<\/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":[915,893,893,717,717,832,915,1110,832,841,841,862,862],"tags":[1167],"class_list":["post-234279","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-n-a","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234279"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234279\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/151389"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}