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
}
Leave a Reply