Woocommerce – Como adicionar as Tags na pesquisa de produtos
Surgiu a necessidade de adicionar as tags também na pesquisa de produtos da loja, pois muitas vezes os clientes digitam palavras incorretas e as tags ajudam muito nesse sentido, até existem alguns plugins hoje que se propõem a fazer esse trabalho, porém não obtive sucesso, alguns desses plugins até substituem o formulário padrão do site e ainda sim não funcionam, vou mostrar a seguir como resolver este problema.
Eu desenvolvi um plugin aparte para não alterar o tema e acabar perdendo minhas modificações em alguma atualização, portanto é necessário você já ter o conhecimento de como se faz um plugin em wordpress.
1 2 | add_action( 'pre_get_posts' , array ( $this , 'include_tags_in_search' ) ); add_filter( 'the_posts' , array ( $this , 'add_posts_by_tags' ), 10, 2 ); |
Será necessário passar alguns parâmetros para a query, você pode inclusive fazer o filtro somente quando a pesquisa for de produtos, aqui você faz total interação adicionando, removendo ou aplicando regras de negócio.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public function include_tags_in_search( WP_Query $query ): void{ $itens_per_page = get_option( 'posts_per_page' ); $search_terms = $query ->get( 's' ); if ( $query ->is_search() ) { global $the_original_paged ; $the_original_paged = $query ->get( 'paged' ) ? $query ->get( 'paged' ) : 1; if ( ! $search_terms ) { add_action( 'wp' , function () use ( $query ) { $query ->set_404(); status_header( 404 ); nocache_headers(); } ); } $query ->set( 'paged' , null ); $query ->set( 'post_type' , array ( 'product' , 'post' ) ); //$query->set( 'posts_per_page', $itens_per_page ); } } |
Agora vamos passar para o filtro propriamente dito, vamos adicionar também a pesquisa das tags e combinar com o array de posts.
Lembrando que a paginação fica bagunçada e os posts são exibidos todos de uma vez, por isso a necessidade de interceder na query e configurar novamente a paginação.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | function add_posts_by_tags( $posts , WP_Query $query ): array { $itens_per_page = $query ->get( "posts_per_page" ); if ( $query ->is_search() ) { global $the_original_paged ; remove_filter( 'the_posts' , 'add_posts_by_tags' ); $posts_product_cat = new WP_Query( array ( 'posts_per_page' => -1, 'tax_query' => array ( array ( 'taxonomy' => 'product_tag' , 'field' => 'name' , 'terms' => explode ( ' ' , esc_attr( $query ->get( 's' ) ) ) ) ) ) ); $merged = array_unique ( array_merge ( $posts , $posts_product_cat ->get_posts() ), SORT_REGULAR ); $posts = array_slice ( $merged , ( $itens_per_page * ( $the_original_paged - 1 ) ), $itens_per_page ); $query ->found_posts = count ( $posts ); $query ->set( 'paged' , $the_original_paged ); $query ->post_count = count ( $posts ); $query ->max_num_pages = ceil ( count ( $merged ) / $itens_per_page ); unset( $the_original_paged ); return $posts ; } return $posts ; } |
Existe um pequeno problema, que é a quantidade de produtos por página, pois você pode ter um tema que configura essa quantidade e altera a quantidade padrão do site, sendo assim get_option(‘posts_per_page’) pode não funcionar, por isso no método add_posts_by_tags eu peguei o padrão da própria query: $query->get(“posts_per_page”).
Tudo pronto, você já deve estar visualizando a pesquisa de produtos filtrando também pelas tags.