Dlouhou dobu jsem si lámal hlavu s tím, jak zprovoznit vlastní typ příspěvků, které mají taxonomie a zároveň toto vše správně hierarchicky propisovat do drobečkové navigace díky RankMath SEO. Nyní konečně přicházím s přesným návodem, tak snad pomůže. 🙂
V čem je problém?
Hlavní problém je v tom, že na stránce příspěvku se propisuje jak archiv (vlastní typ příspěvků), tak i jeho taxonomie (kategorie). Jenže když se přejde na stránku jednotlivé kategorie, tak kořenový název archivu zmizí. K vyřešení tohoto problému by vám měl pomoci tento návod.
Postup
Berme v potaz, že máte nainstalovaný ACF spolu s RankMath SEO.
V ACF vytvořte nový typ obsahu, například „Projekty“ a nastavte na první straně hierarchické. Následně dejte pokročilá konfigurace a aktivujte archiv.
Následně vytvořte v ACF taxonomii, například „Kategorie projektů“. ZDE VŠAK POZOR! Později již nesmíte změnit slug, který se vám často vygeneruje sám. Pakliže změníte slug, tak se kategorie v této taxonomii přemažou a budete to muset u všech článků znovu vše napárovat.
Jinak opět nastavit na Hierarchické a u typu obsahu vyplňte, na jaký custom post typ (CPT) se to má aplikovat. Je dobré jít pak ještě zpět do „Typy obsahu“ a tam propárovat tuto taxonomii, je to na stejném místě.
Následně jděte do nastavení RankMath SEO a v obecném nastavení přejděte na drobečkovou navigaci, dole pak zaklikněte tyto dvě možnosti.
Následně v RankMath SEO klikněte na nastavení Tituly a metadata. V levém menu pod typem příspěvků najděte váš nově vytvořený CPT, v mém případě „projekty“ a úplně dole nastavte Primární taxonomii na tu, kterou jste si vytvořili.
Následně vložte do functions.php nebo do pluginu na snippety následující kod:
add_filter( 'rank_math/frontend/breadcrumb/items', function( $crumbs, $class ) {
$archiv = ['Projekty', '/projekty/'];
if (get_post_type() == 'projekty') { // Zde si přepište slug svého CTP
$already_exists = false;
foreach ($crumbs as $crumb) {
if ($crumb[0] === 'Projekty') { // Zde si přepiště název CTP
$already_exists = true;
break;
}
}
if (!$already_exists) {
array_splice($crumbs, 1, 0, array($archiv));
}
}
return $crumbs;
}, 10, 2);
Tento kód ověří, zda se na stránce již v drobečkové navigaci neobjevuje slovo „Projekty“. Pokud ano, tak se kód nespustí. Pokud slovo Projekty v drobečkové navigaci chybí, tak se přidá. Zde je nutné si v kódu dle poznámek upravit proměnné, jako je „(get_post_type() == ‚projekty‘)“ a pak if ($crumb[0] === ‚Projekty‘)
Nyní je hotovo a vše by mělo správně fungovat. Kdyby náhodou ne, neváhejte mě kontaktovat, rád vám s tím pomohu. 🙂
EDIT: Pokud používáte WooCommerce, tak pravděpodobně narazíte na totožný problém. Založíte stránku obchodu, tu napárujete ve Woo a jak poté dostat do drobečkové navigace před názvy kategorií například stránku obchodu „Produkty“? Stačí přidat tento kod. V kodu si pak musíte upravit slovo „produkty“ pokud se vaše stránka obchodu jmenuje jinak.
add_filter( 'rank_math/frontend/breadcrumb/items', function( $crumbs, $class ) {
$products_page = ['Produkty', '/produkty/']; // Odkaz na stránku s produkty
// Kontrola, zda se nacházíme na stránce produktu nebo kategorii produktů
if (is_product() || is_product_category()) {
$already_exists = false;
foreach ($crumbs as $crumb) {
if ($crumb[0] === 'Produkty') {
$already_exists = true;
break;
}
}
if (!$already_exists) {
// Přidáme "Produkty" na druhé místo v drobečkové navigaci
array_splice($crumbs, 1, 0, array($products_page));
}
}
return $crumbs;
}, 10, 2);
Zde je případně ještě kód pro situaci, kdy máte vytvořenou taxonomii (já tvořil web pro klienta, kde byly štítky k jednotlivým CPT) a potřebujete zprovoznit drobečkovou navigaci.
add_filter( 'rank_math/frontend/breadcrumb/items', function( $crumbs, $class ) {
if ( is_tax( 'people_tags' ) ) { // Kontrola, zda jsme na stránce taxonomie 'people_tags'
$custom_page = ['Vlastní stránka', '/vlastni-stranka/']; // Upravit podle potřeby
// Vložíme odkaz na druhou pozici v navigaci
array_splice( $crumbs, 1, 0, array( $custom_page ) );
}
return $crumbs;
}, 10, 2 );
Leave a Reply