Criando filtros de pesquisa costumizados com Woocommerce Dev_Alisson outubro 13, 2022

Criando filtros de pesquisa costumizados com Woocommerce

Neste artigo vou demonstrar em detalhes tudo sobre a criação de filtros costumizados de pesquisa para lojas Woocommerce atravéz de um shortcode costumizado, o código fonte do exemplo pode ser encontrado no Github, clicando aqui.

Existem basicamente dois ganchos para criar filtros personalizados de produtos dentro do Woocommerce usando campos de produtos e categorias/tags de produtos, são eles woocommerce_product_query e woocommerce_product_query_tax_query.

woocommerce_product_query

Seu uso pode ser aplicado a todos os campos que estão cadastrados no banco de dados na tabela “wp_usermeta” (o “wp_” na frente é o prefixo que foi registrado ao instalar o wordpress), como os campos padrão Woocommerce ou os personalizados criados a partir de woocommerce_wp_text_input por exemplo. Para chama-lo basta usar o add_action (veja o exemplo abaixo) passando o nome da função que será responsavel por criar os filtros de pesquisa, ela por sua vez, receberá um objeto com os a estrutura de pesquisa até o momento, este é um exemplo de como buscar (ou não) produtos em uma faixa de preço específica:

add_action( 'woocommerce_product_query', 'name_of_function_to_call' ); // Call your function with the filters

function name_of_function_to_call($q="") // $q receives an object with the lookup structure
{
    $min_price = isset($_GET['min-price']) ? str_replace(",", ".", str_replace(".", "", str_replace("R$ ", "", $_GET['min-price']))) : false;     // Setting a minimum price (BRL format, R$ 0.000,00)
    $max_price = isset($_GET['max-price']) ? str_replace(",", ".", str_replace(".", "", str_replace("R$ ", "", $_GET['max-price']))) : false;  // Setting a maximum price (BRL format, R$ 0.000,00)

    if($min_price && $max_price){   // I

        $price_filter = array(
            'key'       => '_price',
            'value'     => array( $min_price , $max_price ),
            'compare'   => 'BETWEEN',
            'type'      => 'numeric'  
          ); 
        array_push($args, $price_filter);

    } elseif($min_price){

        $price_filter = array(
            'key'       => '_price',
            'value'     => $min_price,
            'compare'   => '>=',
            'type'      => 'numeric'  
          ); 
        array_push($args, $price_filter);        

    } elseif($max_price){

        $price_filter = array(
            'key'       => '_price',
            'value'     => $max_price,
            'compare'   => '<=',
            'type'      => 'numeric'  
          ); 
        array_push($args, $price_filter);        

    }
    
    $q->set( 'meta_query', array_filter($args) );              // Added product filters by price to the search object
    echo "<textarea>".json_encode($q)."</textarea>";  // Here you can see the search data

    return array_filter($q);
}

Ao final desta etapa, o WordPress tratará os itens que você digitou em “meta_query” como um WHERE no banco de dados SQL de busca, não se preocupe se você não entender esta parte, você ainda pode consultar a documentação da classe WP_Meta_Query para se aprofundar.

woocommerce_product_query_tax_query

Seu uso é semelhante ao do woocommerce_product_query e pode ser aplicado a taxonomias (categorias) e tags, que são cadastradas no banco de dados na tabela “wp_terms” (o “wp_” na frente é o prefixo que foi registrado na instalação do wordpress). Para chamar uma função a partir de sua execução, siga o exemplo:

add_action( 'woocommerce_product_query_tax_query', 'name_of_function_to_call_for_taxonomy' ); // Call your function with the filters

function name_of_function_to_call_for_taxonomy($q='') // $q receives an object with the lookup structure
{
    $category= isset($_GET['category']) ? $_GET['category'] : false;
    $tag= isset($_GET['tag']) ? $_GET['tag'] : false;
    $tax_query = array();

    if($category){
        $taxonomy = 'product_cat';
        $terms = array( $category );

        $tax_query[] = array(
            'taxonomy' => $taxonomy,
            'field'    => 'term_id', // Or 'slug' or 'term_id'
            'terms'    => $terms,
        );
    }

    if($tag){
        $taxonomy = 'product_tag';
        $terms = array( $tag);

        $tax_query[] = array(
            'taxonomy' => $taxonomy,
            'field'    => 'term_id', // Or 'slug' or 'term_id'
            'terms'    => $terms,
        );
    }

    return array_filter($tax_query);
}