Related product – produkty podobne w woocommerce
Produkty powiązane w woocommerce to sekcja w większości szablonów, która pobiera produkty z naszego sklepu. Domyślnie mają one te same tagi lub kategorie co przeglądany produkt.
Przy dużej ilości produktów w sklepie, a co gorsza dużej ilości kategorii, bardzo losowy dobór produktów podobnych może być dość kłopotliwy. Tym bardziej, że nie możemy ich teoretycznie ustawić ręcznie na zapleczu.
Najprostszym rozwiązaniem, o którym często zapominamy, jest możliwość odpowiedniego połączenia produktów poprzez te same tagi. Wprawdzie zalecam tutaj ostrożność, gdyż nieumiejętne stosowanie tagów może doprowadzić do kanibalizacji strony. Czyli wygenerujemy sztucznie strony o identycznej zawartości a o różnych adresach url.
Na szczęście kod woocommerca daje nam wiele możliwości wpływania na to jak wyglądają PRODUKTY PODOBNE.
Jak zmienić liczbę wyświetlanych produktów podobnych?
Skorzystamy tutaj z filtra woocommerce_output_related_products_args:
add_filter( 'woocommerce_output_related_products_args', 'gc_related_products_args', 9999 );
function gc_related_products_args( $args ) {
$args['posts_per_page'] = 4; // liczba produktów podobnych
$args['columns'] = 2; // liczba kolumn na wiersz
return $args;
}
Jak wyłączyć produkty podobne?
Często jest tak, że nie chcemy by produkty podobne się wyświetlały. Bo np. niepotrzebnie zajmują uwagę klienta i odciągają go od finalizacji zakupu. Gdy bardzo dbamy o SEO na stronie to możemy również uznać je za niepożądane lub niekontrolowane linki wewnętrzne. Wystarczy wtedy jedna linijka kodu, oczywiście umieszczona w pliku functions.php:
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
Można również pobawić się w nadpisanie stylu w CSS ale ja nie jestem zwolennikiem ukrywania elementów w kodzie strony.
.related.products {
display: none;
}
Alternatywnie możemy wykorzystać filtr woocommerce_product_related_posts_query, który zwróci nam puste zapytanie z bazy. Za chwilę zresztą wrócimy do tego filtra gdy będziemy chcieli modyfikować podobne produkty według własnego uznania.
add_filter('woocommerce_product_related_posts_query', '__return_empty_array', 100);
Jak ukryć w podobnych produktach te, których brak na stanie?
Ponownie skorzystamy z filtra woocommerce_output_related_products_args:
add_filter( 'woocommerce_output_related_products_args', function( $args )
{
$args = wp_parse_args( array(
'posts_per_page' => 4,
'meta_query' => array (
'key' => '_stock_status',
'value' => 'instock'
)
), $args );
return $args;
});
Jak kontrolować kategorie w produktach podobnych?
Tutaj mamy do wykorzystania kolejny filtr woocommerce_get_related_product_cat_terms. Może być szczególnie przydatne gdy mamy dość rozbudowane drzewo kategorii i chcielibyśmy wyświetlić produkty podobne jedynie z konkretnej podkategorii.
function gc_related_products_subcats_only($terms, $product_id) {
// sprawdzamy czy produkt znajduje się w jednej czy większej ilości kategorii
$prodterms = get_the_terms($product_id, 'product_cat');
if (count($prodterms) === 1) {
return $terms; //jeśli w jednej no to kończymy działanie funkcji
}
// w przeciwnym przypadku przeszukujemy subkategorie
$subcategories = array();
foreach ($prodterms as $k => $prodterm) {
if ($prodterm->parent === 0) {
unset($prodterms[$k]); // i usuwamy kategorie nadrzędne
} else {
$subcategories[] = $prodterm->term_id;
}
}
return $subcategories; zwracamy jesdynie produkty z subkategorii co znacznie zawęża nam dopasowanie
}
add_filter( 'woocommerce_get_related_product_cat_terms', 'gc_related_products_subcats_only', 20, 2 );
Jak kontrolować tagi w related products?
Ponieważ już wiemy, że domyślnie produkty podobne są generowane na podstawie podobnych kategorii i tagów no to zobaczmy jak np. wykluczyć konkretne tagi z tego filtrowania. Służy do tego funkcja woocommerce_get_related_product_tag_terms
function gc_exclude_tags_from_related( $tags ) {
// ustalamy ID tagów które chcemy wykluczyć z filtrowania
$exclude_tags = array( 100, 101, 102 );
foreach( $tags as $index => $tag ){
if( in_array( $tag, $exclude_tags ) ){
unset( $tags[ $index ] );
}
}
return $tags;
}
add_filter( 'woocommerce_get_related_product_tag_terms', 'gc_exclude_tags_from_related' );
Gdy chcemy by produkty podobne wyświetlały się tylko na podstawie tagów
Biorąc na logikę musimy w praktyce wyłączyć z filtrowania atrybuty związane z kategoriami. Nowy filtr nam się przyda: woocommerce_product_related_posts_relate_by_category
add_filter( 'woocommerce_product_related_posts_relate_by_category', function() {
return false;
});
Niestandardowe produkty podobne
No to teraz takie trochę combo. Co jeśli zechcemy całkowicie po swojemu wyświetlić produkty podobne. Np. tylko te, które mają ten sam tytuł, albo taką samą cenę. Tak naprawdę za to wszystko odpowiada filtr woocommerce_related_products. Za pomocą argumentów możemy sobie sterować dowolnie zapytaniem jakie wykonujemy na bazie danych:
add_filter( 'woocommerce_related_products', 'gc_podobne_produkty_po_nazwie', 9999, 3 );
function gc_podobne_produkty_po_nazwie( $related_posts, $product_id, $args ) {
$product = wc_get_product( $product_id );
$title = $product->get_name();
$related_posts = get_posts( array(
'post_type' => 'product',
'post_status' => 'publish',
'title' => $title,
'fields' => 'ids',
'posts_per_page' => -1,
'exclude' => array( $product_id ) //wykluczamy z wyników wyszukiwania id produktu który aktualnie wyświetlamy
));
return $related_posts;
}
Produkty podobne z takimi samymi atrybutami
A tutaj kawałek kodu dla naszych koleżanek z zaprzyjaźnionej firmy. Trochę się z tym namęczyłem, przy okazji zgłębiając dokumentację nowego woocommerca i nowych tabel z atrybutami. Ale warto było wrócić do źródeł i trochę się poirytować. Poniższy kod przetestowany został na dwóch niezależnych sklepach z Woocommerce 6.3
add_filter( 'woocommerce_related_products', 'gc_related_products_by_taxonomy', 9999, 3 );
function gc_related_products_by_taxonomy( $related_posts, $product_id, $args ) {
$related_posts = get_posts( array(
'post_type' => 'product',
'ignore_sticky_posts' => 1,
'posts_per_page' => 4,
'post__not_in' => array( $product_id ),
'tax_query' => array( array(
'taxonomy' => 'pa_thc',
'field' => 'slug',
'terms' => 'srednie',
) ),
'fields' => 'ids',
'orderby' => 'rand',
) );
return $related_posts;
}