Olá pessoal, esse dias atrás eu estava utilizando o sistema de ordenação de produtos do próprio WooCommerce, mas eu tinha á necessidade de adicionar a ordenação alfabética ASC e DESC (A-Z / Z-A) mas como não é padrão do WooCommerce então eu tive que aplicar alguns filtros, para que funcionasse corretamente.
Como vocês podem ver na imagem abaixo, não existe a opção de ordernação alfabética:
De inicio para esse tutorial, vamos criar esses dois novos filtros “title_asc e title_desc”
<?php | |
// Custom sorting options | |
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' ); | |
function custom_woocommerce_get_catalog_ordering_args( $args ) { | |
$orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) ); | |
if ('title_asc' == $orderby_value) { | |
$args['orderby'] = 'title'; | |
$args['order'] = 'ASC'; | |
$args['meta_key'] = ''; | |
}elseif ('title_desc' == $orderby_value) { | |
$args['orderby'] = 'title'; | |
$args['order'] = 'DESC'; | |
$args['meta_key'] = ''; | |
} | |
return $args; | |
} |
Vocês podem ver que eu declarei um valor chamado “title_asc”… Porque, eu apliquei esse nome no meu valor???
Como o próprio nome já diz, ele vai filtrar o nome dos produtos (orderby = title) e depois que ele vai aplicar a ordenação ascendente “A?Z” (order = ASC).
Agora que a ordernação ASC foi declarada é só replicar a mesma para descendente “Z?A” (order = DESC)… A única diferença além do nome do valor “title_desc” é que agora em order é DESC.
Após de criarmos a função o nosso select de ainda não vai recuperar esses novos filtros, para que os novos valores sejam aplicados, vamos ter que adicionar mais alguns filtros.
Agora vamos ter que aplicar uma function nos hooks do próprio WooCommerce que são “woocommerce_catalog_orderby e o woocommerce_default_catalog_orderby_options”:
<?php | |
// Adding a hook callback. | |
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' ); | |
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' ); | |
function custom_woocommerce_catalog_orderby( $sortby ) { | |
$sortby['title_asc'] = __('Alphabetical - (A - Z)', 'your-theme'); | |
$sortby['title_desc'] = __('Alphabetical - (Z - A)', 'your-theme'); | |
return $sortby; | |
} |
Como vocês viram acima eu adicionei um filter para os hooks falando que agora eles vão receber os meus valores personalizados “title_asc | title_desc”.
Eu aplique os nomes “Alphabetical – (A – Z) e Alphabetical – (Z – A)” e os mesmos estão em inglês… Mas isso fica do seu critério, se o seu tema tiver suporte multilingue “textdomain” é só traduzir os mesmo no seu arquivo de tradução do seu tema.
Agora já podemos ver que os nossos filtros já estão aplicados e funcioando perfeitamente:
Eu vou dar um bônus nesse tutorial, mostrando como excluir alguns filtros que vocês não queiram que sejam listados.
Primeiro vocês teram que clicar com o botão direito do mouse sobre um valor do select e inspecionar elemento:
Vocês vão ter que pegar os values dos filtros, que vocês desejam excluir da listagem.
Nesse exemplo abaixo eu vou aplicar essa function nos seguintes valores “popularity, rating, price e price-desc” deixando somente os valores “menu_order, title_asc e title_desc”.
<?php | |
// Remove Options | |
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_remove_filter' ); | |
function custom_woocommerce_remove_filter( $catalog_orderby ) { | |
unset( $catalog_orderby['popularity'] ); | |
unset( $catalog_orderby['rating'] ); | |
unset( $catalog_orderby['price'] ); | |
unset( $catalog_orderby['price-desc'] ); | |
return $catalog_orderby; | |
} |
E por fim nosso select ficará assim, no seu frontend:
Espero que vocês tenham gostado desse tutorial e até breve… Por favor, se você gostou deixe seu like e também compartilha.
Até Mais,