{"id":428,"date":"2022-06-02T08:46:55","date_gmt":"2022-06-02T11:46:55","guid":{"rendered":"https:\/\/hackerzone.com.br\/blog\/?p=428"},"modified":"2022-08-13T00:11:48","modified_gmt":"2022-08-13T03:11:48","slug":"woocommerce-como-adicionar-as-tags-na-pesquisa-de-produtos","status":"publish","type":"post","link":"http:\/\/hackerzone.com.br\/blog\/woocommerce-como-adicionar-as-tags-na-pesquisa-de-produtos\/","title":{"rendered":"Woocommerce &#8211; Como adicionar as Tags na pesquisa de produtos"},"content":{"rendered":"<p>Surgiu a necessidade de adicionar as tags tamb\u00e9m na pesquisa de produtos da loja, pois muitas vezes os clientes digitam palavras incorretas e as tags ajudam muito nesse sentido, at\u00e9 existem alguns plugins hoje que se prop\u00f5em a fazer esse trabalho, por\u00e9m n\u00e3o obtive sucesso, alguns desses plugins at\u00e9 substituem o formul\u00e1rio padr\u00e3o do site e ainda sim n\u00e3o funcionam, vou mostrar a seguir como resolver este problema.<\/p>\n<p>Eu desenvolvi um plugin aparte para n\u00e3o alterar o tema e acabar perdendo minhas modifica\u00e7\u00f5es em alguma atualiza\u00e7\u00e3o, portanto \u00e9 necess\u00e1rio voc\u00ea j\u00e1 ter o conhecimento de como se faz um plugin em wordpress.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nadd_action( 'pre_get_posts', array($this,'include_tags_in_search' ) );\r\nadd_filter( 'the_posts', array($this, 'add_posts_by_tags'), 10, 2 );\r\n<\/pre>\n<p>Ser\u00e1 necess\u00e1rio passar alguns par\u00e2metros para a query, voc\u00ea pode inclusive fazer o filtro somente quando a pesquisa for de produtos, aqui voc\u00ea faz total intera\u00e7\u00e3o adicionando, removendo ou aplicando regras de neg\u00f3cio.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\npublic function include_tags_in_search( WP_Query $query ): void{\r\n            $itens_per_page = get_option('posts_per_page');                                                         \r\n            $search_terms = $query-&gt;get( 's' );\r\n\r\n            if ( $query-&gt;is_search() ) {\r\n                global $the_original_paged;\r\n                $the_original_paged = $query-&gt;get( 'paged' ) ? $query-&gt;get( 'paged' ) : 1;\r\n                if ( ! $search_terms ) {\r\n                     add_action( 'wp', function () use ( $query ) {\r\n                     $query-&gt;set_404();\r\n                     status_header( 404 );\r\n                     nocache_headers();\r\n                    } );\r\n                }\r\n                $query-&gt;set( 'paged', null );\r\n                $query-&gt;set( 'post_type', array( 'product', 'post' )  );\r\n                \/\/$query-&gt;set( 'posts_per_page', $itens_per_page );\r\n            }\r\n }\r\n<\/pre>\n<p>Agora vamos passar para o filtro propriamente dito, vamos adicionar tamb\u00e9m a pesquisa das tags e combinar com o array de posts.<\/p>\n<p>Lembrando que a pagina\u00e7\u00e3o fica bagun\u00e7ada e os posts s\u00e3o exibidos todos de uma vez, por isso a necessidade de interceder na query e configurar novamente a pagina\u00e7\u00e3o.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nfunction add_posts_by_tags( $posts, WP_Query $query ): array {\r\n            $itens_per_page = $query-&gt;get(&quot;posts_per_page&quot;);\r\n                                   \r\n            if ( $query-&gt;is_search() ) {\r\n                global $the_original_paged;\r\n                remove_filter( 'the_posts', 'add_posts_by_tags' );\r\n                $posts_product_cat = new WP_Query( array(\r\n                 'posts_per_page' =&gt; -1,\r\n                 'tax_query' =&gt; array(\r\n                      array(\r\n                        'taxonomy' =&gt; 'product_tag',\r\n                        'field'    =&gt; 'name',\r\n                        'terms'    =&gt; explode( ' ', esc_attr( $query-&gt;get( 's' ) ) )\r\n                      )\r\n                  )\r\n                ) );\r\n                $merged = array_unique( array_merge( $posts, $posts_product_cat-&gt;get_posts() ), SORT_REGULAR );\r\n                $posts = array_slice( $merged, ( $itens_per_page * ( $the_original_paged - 1 ) ), $itens_per_page );\r\n                $query-&gt;found_posts = count($posts);\r\n                $query-&gt;set( 'paged', $the_original_paged );\r\n                $query-&gt;post_count = count( $posts );\r\n                $query-&gt;max_num_pages = ceil( count( $merged ) \/ $itens_per_page );\r\n                unset( $the_original_paged );\r\n                return $posts;\r\n            }\r\n\r\n            return $posts;\r\n        }\r\n<\/pre>\n<p>Existe um pequeno problema, que \u00e9 a quantidade de produtos por p\u00e1gina, pois voc\u00ea pode ter um tema que configura essa quantidade e altera a quantidade padr\u00e3o do site, sendo assim <strong>get_option(&#8216;posts_per_page&#8217;)<\/strong> pode n\u00e3o funcionar, por isso no m\u00e9todo add_posts_by_tags eu peguei o padr\u00e3o da pr\u00f3pria query: <strong>$query->get(&#8220;posts_per_page&#8221;)<\/strong>.<\/p>\n<p>Tudo pronto, voc\u00ea j\u00e1 deve estar visualizando a pesquisa de produtos filtrando tamb\u00e9m pelas tags.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Surgiu a necessidade de adicionar as tags tamb\u00e9m na pesquisa de produtos da loja, pois muitas vezes os clientes digitam palavras incorretas e as tags ajudam muito nesse sentido, at\u00e9 existem alguns plugins hoje que se prop\u00f5em a fazer esse trabalho, por\u00e9m n\u00e3o obtive sucesso, alguns desses plugins at\u00e9 substituem o formul\u00e1rio padr\u00e3o do site [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":457,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,38,35],"tags":[195,198,196,197,37,36],"class_list":["post-428","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php","category-woocommerce","category-wordpress","tag-filtro-de-produtos","tag-filtro-por-tags","tag-pesquisa-de-produtos","tag-pesquisa-por-tags","tag-woocommerce","tag-wordpress","cat-12-id","cat-38-id","cat-35-id","has_thumb"],"_links":{"self":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts\/428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/comments?post=428"}],"version-history":[{"count":4,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts\/428\/revisions"}],"predecessor-version":[{"id":433,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts\/428\/revisions\/433"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/media\/457"}],"wp:attachment":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/media?parent=428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/categories?post=428"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/tags?post=428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}