Súvisiace produkty (related products) su zvyčajne zobrazované na stránke detailu produktu, prípadne v košíku. Ako základ na ich získanie slúžia produktové kategórie a produktové značky. To znamená, že pre konkrétny produkt sa zobrazia súvisiace produkty z rovnakej kategórie, alebo s rovnakou produktovou značkou. V niektorých prípadoch je toto kritérium nedostačujúce a potrebujeme doplniť alebo úplne nahradiť súvisiace produkty vlastnými produktami, napr. na základe niektorého z produktových atribútov. Pre tento účel som si vytvoril vlastnú PHP funkciu s troma argumentami:
- product_id – ID produktu, pre ktorý získame vlastné súvisiace produkty
- taxonomies – pole hodnôt predstavujúce slugy taxonómii, resp. produktových atribútov
- relation – nepovinný parameter určujúci vzťah medzi atribútami, prednastavený vzťah “AND”
Výsledkom tejto funkcie je zoznam ID produktov, ktoré majú rovnaké produktové vlastnosti.
function px_get_related_products_by_taxonomies($product_id, $taxonomies, $relation = 'AND')
{
$ids = [];
$tax_query = [];
if (!empty($taxonomies)) {
foreach ($taxonomies as $taxonomy) {
$terms = get_the_terms($product_id, $taxonomy);
if (!is_wp_error($terms) && $terms != false) {
$terms_ids = [];
foreach ($terms as $term) {
$terms_ids[] = $term->term_id;
}
$tax_query[$taxonomy] = [
'taxonomy' => $taxonomy,
'field' => 'term_id',
'terms' => $terms_ids
];
}
}
}
if (!empty($tax_query)) {
$tax_query['relation'] = $relation;
$args = array(
'fields' => 'ids',
'post__not_in' => array($product_id), //okrem aktualneho produktu
'post_type' => 'product',
'tax_query' => $tax_query,
);
$ids = get_posts($args);
}
return $ids;
}
Použitie našej funkcie je potom pomerne jednoduché a poslúži nám ako základ pre filter “woocommerce_related_products”. Získame teda pre konkrétny produkt tie súvisiace produkty, ktoré majú rovnaký atribút Látka (pa_latka) a Poťah (pa_potah). Vo výstupe môžeme zahrnúť aj prednastavené súvisiace produkty, a spôsobom, že použijeme funkciu array_merge, alebo ich úplne nahradíme.
add_filter('woocommerce_related_products', 'px_update_related_products', 10, 1);
function px_update_related_products($related_posts)
{
global $post;
$product_id = $post->ID;
$custom_related_products = px_get_related_products_by_taxonomies($product_id, ['pa_latka', 'pa_potah']);
if (empty($custom_related_products))
return $related_posts;
//return $custom_related_products;
return array_merge($related_posts, $custom_related_products);
}