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.
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.
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.
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.