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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *