Jak generovat podobné produkty v Oxygen repeater query

Počítejme, že máme template na detail produktu. Do tohoto template chceme vložit podobné produkty, kde jsou následující podmínky

  • Generují se produkty z dané kategorie, ve které se nachází zobrazovaný produkt.
  • Generují se produkty bez aktuálního zobrazovaného produktu.

Postup je jednoduchý, v posty_type dáme „product“. Vyloučíme aktuální produkt pomocí „post_not_in“ kde dáme v datech v Advanced „Post ID“. Následně v „tax_query“ v array dáme u taxonomy „product_cat“, u terms klikneme na data, hned nahoře u post klikneme na „Categories, Tags, Taxonomies“ a vybereme hodnotu „product_cat“ – je potřeba dodržet tento postup, nikoliv tam jen vepsat „product_cat“. A ve field dáme „slug“

Co je ještě dobré dodat, tak pakliže produkt je umístěný ve vícero kategoriích, tak toto query nebude fungovat. Je nutné přidat vlastní funkci, která vypíše všechny kategorie produktu a vybere tu první v pořadí. Ve Woocommerce totiž nelze nastavit, jaká je hlavní kategorie. Daná funkce je zobrazena níže.

function ap_get_main_category_id() {
    global $post;

    // Zkontrolujeme, zda je aktuální stránka stránka produktu
    if (is_product()) {
        $product_id = $post->ID;
        $terms = wp_get_post_terms($product_id, 'product_cat');

        if (!empty($terms) && !is_wp_error($terms)) {
            // Seřadíme termíny podle pořadí
            usort($terms, function($a, $b) {
                return $a->term_order - $b->term_order;
            });

            // Vrátíme ID první termínu jako hlavní kategorii
            return $terms[0]->term_id;
        }
    }

    return false; // Pokud není produkt nebo nemá kategorii, vrátí false
}

Po přidání této funkce stačí trochu poupravit query, kde ve fieldu bude „term_taxonomy_id“ a term bude PHP funkce „ap_get_main_category_id“.

Toto je celkem solidní řešení, ale propárované produkty poté neodpovídají realitě. V praxi je dobré nastavit hlavní kategorii, což lze díky pluginu Rank Math SEO. Tato funkce vybere ID hlavní kategorie a pokud neexistuje, tak se aplikují pravidla předchozí funkce.

function get_main_category_id() {
    global $post;

    // Zkontrolujeme, zda je aktuální stránka stránka produktu
    if (is_product()) {
        $product_id = $post->ID;

        // Nejprve zkusíme získat primární kategorii z Rank Math SEO
        $primary_category = get_post_meta($product_id, 'rank_math_primary_product_cat', true);

        if (!empty($primary_category)) {
            // Pokud je nastavena primární kategorie v Rank Math SEO, vrátíme její ID
            return $primary_category;
        } else {
            // Pokud není nastavena primární kategorie v Rank Math SEO, získáme hlavní kategorii produktu
            $terms = wp_get_post_terms($product_id, 'product_cat');

            if (!empty($terms) && !is_wp_error($terms)) {
                // Seřadíme termíny podle pořadí
                usort($terms, function($a, $b) {
                    return $a->term_order - $b->term_order;
                });

                // Vrátíme ID první termínu jako hlavní kategorii
                return $terms[0]->term_id;
            }
        }
    }

    return false; // Pokud není produkt nebo nemá kategorii, vrátí false
}
1500 1000 Adam Pražan

Adam Pražan

Tvořím weby, reklamy a dělám komplexní marketing. Specializuji se na menší lokální projekty, kterým pomáhám od A do Z. Podniká se semnou dobře. Jsem přátelský, zodpovědný, samostatný a držím dohodnutou cenu.

All stories by : Adam Pražan

Leave a Reply