{"id":234007,"date":"2023-02-27T14:30:00","date_gmt":"2023-02-27T11:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234007"},"modified":"2022-11-11T13:47:45","modified_gmt":"2022-11-11T10:47:45","slug":"como-criar-um-modelo-de-pesquisa-avancada-personalizado-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-criar-um-modelo-de-pesquisa-avancada-personalizado-no-wordpress\/","title":{"rendered":"Como criar um modelo de pesquisa avan\u00e7ada personalizado no WordPress"},"content":{"rendered":"\n<p>Este guia \u00e9 para voc\u00ea que tem um tipo de postagem personalizado (CPT) e deseja uma p\u00e1gina de pesquisa avan\u00e7ada que pesquise resultados nesse CPT. No formul\u00e1rio de pesquisa, voc\u00ea pode configurar diferentes entradas para pesquisar em diferentes campos; t\u00edtulo da postagem, conte\u00fado da postagem, qualquer tipo de meta personalizada ou por taxonomia personalizada.<\/p>\n<p>Nesta postagem, vamos supor que temos um tipo de postagem personalizado para livros, uma taxonomia personalizada anexada para g\u00eanero de livro e um monte de meta personalizada; autor, ano de publica\u00e7\u00e3o, n\u00famero ISBN e uma caixa de verifica\u00e7\u00e3o se o livro est\u00e1 ou n\u00e3o em estoque. O tipo de postagem e os par\u00e2metros personalizados s\u00e3o totalmente a seu crit\u00e9rio para atender \u00e0s suas necessidades, o c\u00f3digo abaixo simplesmente tentar\u00e1 cobrir a maioria das bases.<\/p>\n<h2>O que vamos fazer<\/h2>\n<p>Criaremos um tipo de postagem personalizado para livros e uma taxonomia hier\u00e1rquica personalizada anexada a ele para g\u00eanero. Al\u00e9m disso, cada livro tem campos personalizados para autor(es), ano de publica\u00e7\u00e3o, n\u00famero ISBN e uma caixa de sele\u00e7\u00e3o para incluir ou n\u00e3o livros que est\u00e3o esgotados. Quanto \u00e0 p\u00e1gina de pesquisa em si, faremos um modelo de p\u00e1gina onde residir\u00e1 a maior parte do nosso c\u00f3digo. A p\u00e1gina come\u00e7ar\u00e1 renderizando um formul\u00e1rio personalizado no in\u00edcio; mostrando todos os par\u00e2metros poss\u00edveis para filtrar os resultados. Abaixo dele, todos os resultados do livro aparecer\u00e3o em uma lista. Decidimos um n\u00famero de resultados por p\u00e1gina e adicionamos pagina\u00e7\u00e3o na parte inferior se o n\u00famero exceder isso.<\/p>\n<p>Estes s\u00e3o os poss\u00edveis par\u00e2metros de filtro que criaremos para nosso modelo de pesquisa avan\u00e7ada:<\/p>\n<ul>\n<li>Entrada de texto para pesquisar qualquer string no t\u00edtulo do post e no conte\u00fado do post.<\/li>\n<li>Lista suspensa para escolher um g\u00eanero. Permite escolher um termo ou deix\u00e1-lo em &#8220;Qualquer&quot;.<\/li>\n<li>Entrada para digitar o nome do autor que pesquisa no meta personalizado. A correspond\u00eancia livre, o que significa inserir &quot;Marca&quot;, retornar\u00e1 todos os autores cujo nome seja ou contenha &quot;Marca&quot;.<\/li>\n<li>N\u00famero de entrada para inserir o ano em que o livro foi publicado, que pesquisa no meta personalizado. A correspond\u00eancia vaga, o que significa inserir, por exemplo, &quot;20&quot;, corresponder\u00e1 a qualquer livro publicado em 1920 ou em qualquer ano come\u00e7ando com 20.<\/li>\n<li>Entrada para inserir ISBN (<a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Standard_Book_Number\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ID internacional do livro<\/a>) que pesquisa em meta personalizada. Retorna apenas correspond\u00eancias precisas.<\/li>\n<li>Marque a caixa de sele\u00e7\u00e3o para incluir ou n\u00e3o livros esgotados, mais uma meta personalizada. Por padr\u00e3o, isso est\u00e1 desmarcado, o que significa que os resultados mostram apenas os livros que est\u00e3o em estoque.<\/li>\n<\/ul>\n<p>O formul\u00e1rio est\u00e1 configurado para usar o m\u00e9todo GET, o que significa que quaisquer par\u00e2metros pesquisados \u200b\u200bser\u00e3o anexados \u00e0 p\u00e1gina na URL, na forma de &#8221; <code>?book-search=world&amp;year-published=2016&amp;book-author=mark<\/code>&#8220;. A outra op\u00e7\u00e3o se voc\u00ea quiser evitar ter &#8220;URLs feias&#8221; \u00e9 usar Javascript e AJAX. Mas h\u00e1 algumas desvantagens com isso. Em primeiro lugar, n\u00e3o ser\u00e1 poss\u00edvel marcar uma pesquisa com par\u00e2metros de pesquisa espec\u00edficos &quot;pr\u00e9-preenchidos&quot;. Imagine que voc\u00ea em outro lugar do seu site deseja vincular diretamente \u00e0 sua p\u00e1gina de pesquisa personalizada por um autor espec\u00edfico. Voc\u00ea pode ent\u00e3o fazer o link ir para sua p\u00e1gina de pesquisa, anexar &#8221; <code>?author=mark<\/code>&#8220;, e assim clicar no link levar\u00e1 diretamente aos resultados para esse autor. Isso n\u00e3o \u00e9 poss\u00edvel com AJAX.<\/p>\n<p>Os par\u00e2metros de pesquisa s\u00e3o mutuamente inclusivos. Isso significa que combinar, por exemplo, o ano &#8220;2011&#8221; e o autor &#8220;Some guy&#8221; retornar\u00e1 apenas livros que correspondam a AMBOS. Se tamb\u00e9m especificarmos &#8220;engra\u00e7ado&#8221; na entrada de texto de pesquisa geral, obteremos apenas retornos que correspondam a todos os tr\u00eas. Dito em palavras diferentes; usaremos a l\u00f3gica AND. Este \u00e9 o m\u00e9todo mais comum para filtrar os resultados da pesquisa.<\/p>\n<p>Este tutorial n\u00e3o incluir\u00e1 estilo, ent\u00e3o esta parte \u00e9 com voc\u00ea. Abaixo est\u00e1 um exemplo de como isso pode ficar com alguns estilos b\u00e1sicos.<\/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=\"Como criar um modelo de pesquisa avan\u00e7ada personalizado no WordPress\" ><\/a><\/p>\n<h2>Uma observa\u00e7\u00e3o sobre pagina\u00e7\u00e3o com uma consulta personalizada<\/h2>\n<p>Se voc\u00ea deseja pagina\u00e7\u00e3o em uma consulta personalizada em uma \u00fanica p\u00e1gina, h\u00e1 algumas coisas a serem observadas. A pagina\u00e7\u00e3o de uma consulta pode ser gerada com as fun\u00e7\u00f5es do 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 os dois <code>[next_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/next_post_link\/)()<\/code>e <code>[previous_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/previous_post_link\/)()<\/code>. No entanto, eles s\u00e3o codificados para funcionar com o <code>wp_query<\/code>objeto global (que para um modelo de p\u00e1gina \u00e9 a pr\u00f3pria p\u00e1gina) e n\u00e3o com uma consulta personalizada.<\/p>\n<p>Existem algumas solu\u00e7\u00f5es alternativas, como escrever voc\u00ea mesmo uma fun\u00e7\u00e3o de pagina\u00e7\u00e3o. Ou voc\u00ea pode usar a a\u00e7\u00e3o <code>pre_get_posts<\/code>e manipular o <code>wp_query<\/code>objeto. Infelizmente, este m\u00e9todo \u00e9 muito tarde para afetar as fun\u00e7\u00f5es de pagina\u00e7\u00e3o. Outra alternativa \u00e9 pular a pagina\u00e7\u00e3o e simplesmente mostrar todos os posts. Essa pode ser uma op\u00e7\u00e3o se voc\u00ea n\u00e3o tiver muitas postagens, mas se estiver criando um modelo de pesquisa personalizado avan\u00e7ado \u2013 suponho que voc\u00ea tenha algumas postagens.<\/p>\n<p>O que faremos neste guia \u00e9 uma esp\u00e9cie de m\u00e9todo &#8220;hackish&#8221;. Dentro do modelo de p\u00e1gina, substituiremos o <code>wp_query<\/code>objeto com nossa consulta personalizada para que as fun\u00e7\u00f5es de loop e pagina\u00e7\u00e3o funcionem conforme o esperado. Este m\u00e9todo \u00e9 o que eu tive mais sucesso.<\/p>\n<p>Sem mais delongas, vamos come\u00e7ar a codificar!<\/p>\n<h2>Configurando o tipo de postagem personalizado, taxonomia e meta campos<\/h2>\n<p>A primeira etapa \u00e9 definir o tipo de postagem personalizado para o qual queremos criar um modelo de pesquisa avan\u00e7ada. Se voc\u00ea j\u00e1 configurou um tipo de postagem personalizado ou deseja implement\u00e1-lo para postagens ou p\u00e1ginas, pode pular para a pr\u00f3xima parte.<\/p>\n<p>Estamos definindo um tipo de postagem personalizado <code>book<\/code>com uma taxonomia personalizada hier\u00e1rquica <code>book_category<\/code>. N\u00e3o entrarei em detalhes explicando como criar tipos de postagem personalizados e taxonomias aqui. Se voc\u00ea estiver interessado em saber mais, tenho um post que entra em detalhes sobre isso.<\/p>\n<p>Coloque este c\u00f3digo em qualquer lugar no c\u00f3digo do seu tema <code>functions.php<\/code>ou plugin:<\/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>Isso resultar\u00e1 em um tipo de postagem personalizado com uma taxonomia anexada a ele em admin.<\/p>\n<p>A configura\u00e7\u00e3o da meta de postagem personalizada depende um pouco de voc\u00ea &#8211; manuseie-a manualmente <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)()<\/code>ou use o plug-in <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF), que \u00e9 perfeito para esse tipo de trabalho. Vou usar o ACF para configurar os campos programaticamente, assim:<\/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>\u00c9 claro que voc\u00ea pode configurar os campos do ACF usando a GUI de administra\u00e7\u00e3o do ACF. Mas h\u00e1 v\u00e1rios benef\u00edcios de adicion\u00e1-los por c\u00f3digo. Por exemplo, garantindo que voc\u00ea mantenha os mesmos campos onde quer que voc\u00ea ative seu tema ou plugin. Se voc\u00ea configurar os campos no admin, lembre-se de export\u00e1-los e import\u00e1-los se mudar de site WordPress.<\/p>\n<p>Observe os meta-nomes; por exemplo <code>book_author<\/code>, <code>year_published<\/code>, e assim por diante. Voc\u00ea far\u00e1 refer\u00eancia a eles quando criarmos a consulta personalizada no modelo de pesquisa avan\u00e7ada.<\/p>\n<p>Com o plugin ACF e o c\u00f3digo acima, editar um \u00fanico livro ficaria assim:<\/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=\"Como criar um modelo de pesquisa avan\u00e7ada personalizado no WordPress\" ><\/a><\/p>\n<p>Com isso estamos todos bem para criar quantos posts de livros quisermos. A pr\u00f3xima etapa \u00e9 criar o modelo de p\u00e1gina para nossa pesquisa.<\/p>\n<h2>Criando o modelo de p\u00e1gina<\/h2>\n<p>Vamos criar o modelo de p\u00e1gina onde colocaremos nosso modelo de pesquisa avan\u00e7ada. Fa\u00e7a uma c\u00f3pia do seu tema <code>single.php<\/code>ou <code>page.php<\/code>e renomeie-o para, por exemplo, <code>template-booksearch.php<\/code>. O HTML \u00e9 com voc\u00ea, mas a raz\u00e3o pela qual fazemos uma c\u00f3pia de single ou page \u00e9 porque eles s\u00e3o provavelmente o modelo mais pr\u00f3ximo em termos de layout.<\/p>\n<p>No topo do modelo de p\u00e1gina, indicamos que este \u00e9 um modelo de p\u00e1gina escrevendo &quot;Nome do modelo&quot; e seu nome no bloco de coment\u00e1rios. Fazer isso garantir\u00e1 que possamos selecionar o modelo de p\u00e1gina quando editarmos uma p\u00e1gina.<\/p>\n<pre><code>&lt;?php \/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n...<\/code><\/pre>\n<p>As se\u00e7\u00f5es que precisamos codificar em nosso modelo s\u00e3o as seguintes, nesta ordem:<\/p>\n<ol>\n<li>Armazene todas as vari\u00e1veis \u200b\u200bpreviamente enviadas pelo formul\u00e1rio, usando <code>get_query_var()<\/code>. Tamb\u00e9m precisa armazenar a p\u00e1gina atual<\/li>\n<li>Renderize o formul\u00e1rio de pesquisa com um bot\u00e3o de envio para realizar uma pesquisa<\/li>\n<li>Redefinir o <code>wp_query<\/code>objeto<\/li>\n<li>Configure os argumentos para um novo <code>WP_Query()<\/code>dependendo dos par\u00e2metros pesquisados \u200b\u200be execute a consulta. Atribuir a consulta personalizada ao <code>wp_query<\/code>objeto<\/li>\n<li>Percorra os resultados e exiba-os. Tamb\u00e9m renderizar links de pagina\u00e7\u00e3o<\/li>\n<li>Redefinir o <code>wp_query<\/code>objeto de volta ao que era<\/li>\n<\/ol>\n<p>A raz\u00e3o pela qual precisamos armazenar todas as vari\u00e1veis \u200b\u200bpesquisadas e a p\u00e1gina atual antecipadamente \u00e9 porque essas vari\u00e1veis \u200b\u200bser\u00e3o perdidas assim que redefinirmos o <code>wp_query<\/code>objeto na etapa 3. Tamb\u00e9m precisamos das vari\u00e1veis \u200b\u200bpara nosso formul\u00e1rio de pesquisa, para preencher os campos.<\/p>\n<p>Em seu modelo, decida o local em que deseja gerar sua pesquisa personalizada e vamos come\u00e7ar do in\u00edcio:<\/p>\n<h3>1 Obtenha todas as vari\u00e1veis \u200b\u200bpesquisadas<\/h3>\n<p>Obtemos os par\u00e2metros GET (da URL) com <code>[get_query_var](https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/)()<\/code>. Por exemplo; se tivermos um par\u00e2metro <code>?book-author=benjamin<\/code>na URL, using <code>get_query_var('book-author')<\/code>retornaria a string &#8216; <code>benjamin<\/code>&#8216;. A busca de todas as vari\u00e1veis \u200b\u200bpode ser feita assim:<\/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>Mas esses s\u00e3o todos os par\u00e2metros personalizados que n\u00e3o fazem parte dos par\u00e2metros GET padr\u00e3o do WordPress. O WordPress ir\u00e1 ignorar quaisquer par\u00e2metros GET que ele n\u00e3o conhe\u00e7a, ent\u00e3o cham\u00e1-los sempre retornar\u00e1 uma string vazia. Precisamos dizer ao WordPress para permitir cada um desses par\u00e2metros GET. Fazemos isso filtrando <code>query_vars<\/code>. No seu <code>functions.php<\/code>, adicione isso tamb\u00e9m:<\/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>Agora nossos <code>get_query_var()<\/code>&#8216;s devem ser capazes de buscar os par\u00e2metros GET. Se eles n\u00e3o estiverem definidos, ele retornar\u00e1 uma string vazia.<\/p>\n<p>Tamb\u00e9m precisamos buscar a p\u00e1gina atual antes de estragar o <code>wp_query<\/code>objeto. A p\u00e1gina atual \u00e9 um par\u00e2metro GET oculto chamado <code>paged<\/code>. Vamos busc\u00e1-lo da mesma forma que nossos outros par\u00e2metros GET, mas vamos defini-lo como padr\u00e3o para 1 se estiver vazio.<\/p>\n<pre><code>$paged = (get_query_var('paged'))? get_query_var('paged'): 1;<\/code><\/pre>\n<p>Nota: Como <code>paged<\/code>\u00e9 um par\u00e2metro padr\u00e3o do WordPress, n\u00e3o precisamos adicionar <code>paged<\/code>ao <code>query_vars<\/code>filtro.<\/p>\n<h3>2 Renderize o formul\u00e1rio de pesquisa<\/h3>\n<p>O formul\u00e1rio de pesquisa ser\u00e1 simplesmente um <code>&lt;form&gt;<\/code>com as entradas necess\u00e1rias e um bot\u00e3o de envio de formul\u00e1rio. O HTML fica totalmente a seu crit\u00e9rio, no exemplo abaixo estou adicionando as entradas em uma lista simples. N\u00e3o incluirei nenhum estilo neste tutorial, isso \u00e9 com voc\u00ea. Voc\u00ea pode optar por estilizar o formul\u00e1rio de pesquisa para ficar na parte superior dos resultados ou na lateral &#8211; verticalmente para baixo junto com os resultados da pesquisa.<\/p>\n<p>Nota: Para encurtar e modularizar o modelo de pesquisa avan\u00e7ada, voc\u00ea pode separar a parte do formul\u00e1rio de pesquisa em um arquivo de modelo separado e inclu\u00ed-lo com <code>[get_template_part](https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/)()<\/code>. Mas para simplificar este tutorial, incluirei tudo dentro do pr\u00f3prio arquivo de modelo.<\/p>\n<p>O formul\u00e1rio em si precisa ser do m\u00e9todo GET, e a a\u00e7\u00e3o precisa apontar para a p\u00e1gina em que estamos. Para fazer isso, acessamos o <code>$post<\/code>objeto global e obtemos o permalink dele. No final, adicionamos um bot\u00e3o de envio que enviar\u00e1 o formul\u00e1rio.<\/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>Dentro da lista n\u00e3o ordenada, adicionaremos uma entrada adequada para cada um de nossos poss\u00edveis par\u00e2metros de pesquisa. Ajuste o HTML e os par\u00e2metros de pesquisa para atender \u00e0s suas necessidades:<\/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>Observe os <code>name<\/code>atributos; eles s\u00e3o o que aparecer\u00e1 na URL quando o formul\u00e1rio for enviado. Eles devem corresponder ao <code>query_vars<\/code>e <code>get_query_var()<\/code>definimos anteriormente!<\/p>\n<p>O c\u00f3digo acima come\u00e7a renderizando uma entrada de texto para a pesquisa de texto geral. Definimos o <code>value<\/code>para a vari\u00e1vel pesquisada anteriormente que buscamos usando <code>get_query_var()<\/code>. Isso garante que a entrada n\u00e3o seja limpa depois de fazermos uma pesquisa.<\/p>\n<p>O pr\u00f3ximo par\u00e2metro \u00e9 uma lista suspensa de g\u00eanero de nossa taxonomia personalizada. Para renderizar isso, utilizamos a fun\u00e7\u00e3o <code>[wp_dropdown_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_dropdown_categories\/)()<\/code>. D\u00ea uma olhada na p\u00e1gina de documenta\u00e7\u00e3o para ver por que adicionamos todos esses par\u00e2metros para ajustar a lista suspensa \u00e0s nossas necessidades. \u00c9 importante que <code>taxonomy<\/code>esteja definido para nossa taxonomia personalizada, <code>name<\/code>o atributo esteja correto e <code>selected<\/code>definido para o valor da vari\u00e1vel pesquisada anteriormente. Tamb\u00e9m definimos os valores de termo como seus slugs em vez de IDs de termo. Parece melhor com <code>?book-category=fiction<\/code>em vez de <code>?book-category=42<\/code>. Tamb\u00e9m ativamos uma op\u00e7\u00e3o &#8220;nenhum&#8221; para adicionar uma op\u00e7\u00e3o &#8220;Qualquer g\u00eanero&#8221;.<\/p>\n<p>Em seguida, renderizamos outra entrada de texto para pesquisar o autor, uma entrada de n\u00famero para o ano de publica\u00e7\u00e3o, uma entrada de texto para o n\u00famero ISBN e, finalmente, uma caixa de sele\u00e7\u00e3o que, por padr\u00e3o, est\u00e1 desmarcada para incluir livros esgotados.<\/p>\n<h3>3 Redefina o wp_query<\/h3>\n<p>O pr\u00f3ximo passo \u00e9 um pequeno hack para garantir que a pagina\u00e7\u00e3o funcione para nossa consulta personalizada. N\u00f3s simplesmente armazenamos a corrente <code>$wp_query<\/code>em alguma vari\u00e1vel e ent\u00e3o a configuramos para <code>null<\/code>. Mais tarde, na etapa 6, vamos redefini-lo a partir da <code>$tmp_wpquery<\/code>vari\u00e1vel.<\/p>\n<pre><code>$tmp_wpquery = $wp_query;\n$wp_query = null;<\/code><\/pre>\n<h3>4 Configure argumentos e execute a consulta personalizada<\/h3>\n<p>Esta parte trata da realiza\u00e7\u00e3o de uma nova consulta. Come\u00e7amos configurando os argumentos mais b\u00e1sicos e, em seguida, adicionamos par\u00e2metros condicionalmente dependendo do que foi encontrado nas vari\u00e1veis \u200b\u200bpesquisadas anteriormente (de nossos <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>O c\u00f3digo acima est\u00e1 basicamente construindo um <code>WP_Query<\/code>com par\u00e2metros. A <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina de documenta\u00e7\u00e3o<\/a> para <code>WP_Query<\/code>\u00e9 um \u00f3timo recurso para descobrir como construir uma consulta.<\/p>\n<p>Os primeiros argumentos garantem que consultamos apenas livros e que estamos informando corretamente em qual p\u00e1gina estamos atualmente \u2013 a partir da <code>paged<\/code>vari\u00e1vel que buscamos anteriormente. O n\u00famero de posts por p\u00e1gina fica a seu crit\u00e9rio, eu simplesmente configurei para 20.<\/p>\n<p>Observe que adicionar &#8216; <code>compare<\/code>&#8216; a &#8216; <code>LIKE<\/code>&#8216; far\u00e1 com que o WordPress procure qualquer coisa que contenha a string fornecida. N\u00e3o adicionei isso \u00e0 pesquisa do ISBN porque, para esse campo, quero encontrar resultados que correspondam perfeitamente.<\/p>\n<p>O importante \u00e9 logo no final, quando realmente realizamos a consulta, e atribu\u00edmos essa consulta \u00e0 <code>wp_query<\/code>vari\u00e1vel.<\/p>\n<h3>5 Percorra os resultados da consulta e renderize a pagina\u00e7\u00e3o<\/h3>\n<p>Este passo \u00e9 realmente f\u00e1cil. Tudo o que precisamos \u00e9 de um loop padr\u00e3o e, para cada um, renderizamos o post do livro como quisermos. Esta parte \u00e9 totalmente com voc\u00ea.<\/p>\n<p>O c\u00f3digo abaixo mostra um exemplo b\u00e1sico de loop pelos resultados, chamando <code>get_template_part()<\/code>cada post. Depois que o loop <code>the_posts_pagination()<\/code>\u00e9 usado para renderizar links de pagina\u00e7\u00e3o. Se a consulta n\u00e3o retornou nenhuma postagem, um par\u00e1grafo simples com um texto ser\u00e1 exibido.<\/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>Ajuste o HTML e a sa\u00edda para atender \u00e0s suas necessidades. O c\u00f3digo acima espera um arquivo de modelo no tema nomeado <code>content-book.php<\/code>para renderizar um \u00fanico livro no loop. N\u00e3o vou mostrar como renderizar cada postagem, pois isso \u00e9 algo sobre o qual voc\u00ea provavelmente j\u00e1 tem controle.<\/p>\n<h3>6 Redefina o wp_query de volta ao que era<\/h3>\n<p>A etapa final \u00e9 redefinir o <code>wp_query<\/code>objeto para o que armazenamos anteriormente na etapa 3. Definimos como <code>null<\/code>primeiro para garantir que seja redefinido.<\/p>\n<pre><code>$wp_query = null;\n$wp_query = $tmp_wpquery;<\/code><\/pre>\n<h2>Conclus\u00e3o e resultado final<\/h2>\n<p>E foi isso! Agora voc\u00ea deve ter um modelo de pesquisa personalizada avan\u00e7ada totalmente funcional. Espero que isso tenha ajudado voc\u00ea \u2013 o c\u00f3digo foi escrito o mais geral poss\u00edvel para facilitar o ajuste \u00e0s suas necessidades. Talvez voc\u00ea queira diferentes tipos de par\u00e2metros ou seu tipo de postagem personalizado seja para filmes ou outra coisa!<\/p>\n<p>Com algum estilo b\u00e1sico, pode facilmente se parecer com isso:<\/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=\"Como criar um modelo de pesquisa avan\u00e7ada personalizado no WordPress\" ><\/a><\/p>\n<p>Aqui est\u00e1 o c\u00f3digo final; a <code>functions.php<\/code>pe\u00e7a e o modelo:<\/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\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este tutorial \u00e9 para voc\u00ea que tem um tipo de postagem personalizado e deseja criar uma p\u00e1gina de pesquisa avan\u00e7ada personalizada com campos e par\u00e2metros de pesquisa personalizados.<\/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":[898,898,722,722,837,920,1110,920,837,846,846,867,867],"tags":[1170],"class_list":["post-234007","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-outro","category-n-a","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/234007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=234007"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/234007\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/151389"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=234007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=234007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=234007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}