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);
}