WooCommerce – dowolne sortowanie produktów w wybranej kategorii
Taka zagadka od klienta na dzisiaj. Chciałbym, żeby w jednej konkretnej kategorii produkty wyświetlały się inaczej. Inaczej czyli posortowane według daty dodania od najnowszych. Bo to kategoria „nowości” i wypada by najnowsze były najwyżej.
Co ciekawe Atrybuty produktów mają swoją opcję wyboru domyślnego sortowania. A tak prosty temat jak sortowanie produktów w kategorii nie przewiduje ustawień dla klienta.
Korzystamy w tym wypadku z filtra woocommerce_default_catalog_orderby. Czyli functions.php i do dzieła:
function custom_default_catalog_orderby() {
return 'meta_value'; // Ustaw domyślne sortowanie na podstawie wartości atrybutu
}
add_filter( 'woocommerce_default_catalog_orderby', 'custom_default_catalog_orderby' );
W bardziej wymyślnej wersji gdybyśmy chcieli mieć różne sortowanie, dla różnych kategorii:
add_filter ('woocommerce_default_catalog_orderby', 'custom_default_catalog_orderby' );
function custom_default_catalog_orderby() {
if (is_product_category( array( 'kategoria1', 'kategoria2' ))) {
return 'date'; }
else {
return 'popularity';
}
}
I po kłopocie. W powyższym przykładzie dla kategoria1 i kategoria2 produkty będą posortowane po dacie, a dla innych kategorii po popularności.
Natomiast jeśli mamy ochotę posortować stronę kategorii według dowolnego atrybutu należy skorzystać z kodu:
function custom_orderby( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_product_category() ) {
$query->set( 'meta_key', 'nazwa_atrybutu' ); // Zastąp 'nazwa_atrybutu' nazwą twojego atrybutu
$query->set( 'orderby', 'meta_value' ); // Możesz zmienić na 'meta_value_num' dla wartości numerycznych
$query->set( 'order', 'ASC' ); // Możesz zmienić na 'DESC' dla sortowania malejącego
}
}
add_action( 'pre_get_posts', 'custom_orderby' );
Poniższy kod spowoduje, że produkty na stronach kategorii będą sortowane według daty dodania, zaczynając od najnowszych.
function custom_orderby( $query ) {
if ( $query->is_main_query() && !is_admin() && is_product_category() ) {
$query->set( 'orderby', 'date' );
$query->set( 'order', 'DESC' ); // Zmienić na 'ASC' dla sortowania rosnąco
}
}
add_action( 'pre_get_posts', 'custom_orderby' );
Jeśli chcesz sortować produkty od najstarszych, zmień 'DESC’ na 'ASC’ w linii z $query->set( 'order’, 'DESC’ ).
Jeśli chcemy sortować produkty według konkretnego atrybutu, możemy również dodać odpowiednie meta_key do zapytania. To można zrobić za pomocą filtru woocommerce_product_query_meta_query, jak pokazano poniżej:
function custom_product_query_meta_query( $meta_query, $query ) {
$meta_query[] = array(
'key' => 'nazwa_atrybutu', // Zastąp 'nazwa_atrybutu' nazwą twojego atrybutu
'value' => array(''), // Tutaj możesz dodać dodatkowe warunki, jeśli są potrzebne
'compare' => 'NOT IN' // To jest tylko przykład, możesz dostosować do swoich potrzeb
);
return $meta_query;
}
add_filter( 'woocommerce_product_query_meta_query', 'custom_product_query_meta_query', 10, 2 );