Súvisiace produkty podľa vlastných atribútov

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

}
				
			
Picture of Roman Kraiger

Roman Kraiger

Zakladateľ agentúry Pixeler, vášnivý cyklista, programátor a občasný bloger.

Páčil sa Vám tento článok?

Odmeňte ho páčikom.

alebo ho zdieľajte medzi priateľmi na:

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *