WooCommerce

Как убрать последний элемент из хлебных крошек WooCommerce

M
Markabus
·
Фотореалистичный кадр с низкого ракурса: на потёртом дубовом столе дорожка настоящих хлебных крошек с обломком корочки ведёт к монитору и обрывается, не доходя до него, на экране в расфокусе страница товара с короткой полоской навигации вверху и крупной карточкой керамической кружки — иллюстрация к статье об удалении последнего элемента из хлебных крошек WooCommerce.

Стандартные хлебные крошки WooCommerce на странице товара выглядят так: Главная → Каталог → Категория → Название товара. Последний элемент — не ссылка, а просто текст, и он дублирует заголовок, который стоит строкой ниже. Многие темы и дизайнеры предпочитают обрывать цепочку на категории: так крошки короче, не ломаются на длинных названиях и не повторяют H1. Сделать это можно одним фильтром, не трогая шаблоны.

Как устроены крошки в WooCommerce

Крошки собирает класс WC_Breadcrumb: он проходит по текущей странице, накапливает массив элементов вида [ название, ссылка ] и перед выводом пропускает его через фильтр woocommerce_get_breadcrumb. Дальше массив отрисовывает шаблон global/breadcrumb.php. Фильтр получает уже готовый список, поэтому это самое удобное место, чтобы убрать, добавить или переименовать любой элемент — шаблон остаётся стандартным и не требует обновления при выходе новых версий WooCommerce.

Код: убираем последний элемент на странице товара

add_filter( 'woocommerce_get_breadcrumb', 'shop_remove_last_crumb', 20, 2 );
function shop_remove_last_crumb( $crumbs, $breadcrumb ) {
    // Только на странице товара и только если есть что убирать
    if ( is_product() && count( $crumbs ) > 1 ) {
        array_pop( $crumbs );
    }
    return $crumbs;
}

Код добавляется в functions.php дочерней темы. Условие is_product() ограничивает правку страницами товаров: на странице категории последний элемент — это сама категория, и её обычно оставляют. Проверка на количество элементов защищает от вырожденного случая, когда в массиве только «Главная»: убрать единственный элемент означало бы вывести пустую обёртку.

Если последний элемент нужно снимать везде — и на категориях, и на метках, и на страницах магазина, — уберите is_product() из условия. А если, наоборот, хочется оставить название товара, но оборвать его до разумной длины, замените array_pop на правку текста последнего элемента через wp_trim_words() или mb_strimwidth().

Что происходит с разметкой BreadcrumbList

WooCommerce выводит для крошек структурированные данные BreadcrumbList в JSON-LD, и берёт их из того же метода, через тот же фильтр. Значит, после установки кода из разметки тоже исчезнет последний элемент — визуальные крошки и данные для поисковиков останутся согласованными, что и требуется. Документация Google допускает, что последний элемент списка может не соответствовать текущей странице: обязательны только название и позиция каждого элемента, ссылка на текущую страницу не требуется. Проверить результат можно в инструменте проверки расширенных результатов.

Если крошки выводит SEO-плагин

Часто тема показывает не крошки WooCommerce, а крошки Yoast SEO или Rank Math — тогда фильтр выше ни на что не влияет, потому что эти плагины строят цепочку сами. У каждого есть свой фильтр с тем же смыслом:

// Yoast SEO
add_filter( 'wpseo_breadcrumb_links', 'shop_remove_last_crumb_yoast' );
function shop_remove_last_crumb_yoast( $links ) {
    if ( is_product() && count( $links ) > 1 ) {
        array_pop( $links );
    }
    return $links;
}

// Rank Math
add_filter( 'rank_math/frontend/breadcrumb/items', 'shop_remove_last_crumb_rankmath' );
function shop_remove_last_crumb_rankmath( $crumbs ) {
    if ( is_product() && count( $crumbs ) > 1 ) {
        array_pop( $crumbs );
    }
    return $crumbs;
}

Какой именно вариант используется на сайте, проще всего понять по HTML: у крошек WooCommerce обёртка с классом woocommerce-breadcrumb, у Yoast — #breadcrumbs со span внутри, у Rank Math — .rank-math-breadcrumb.

Классические и блочные темы

В блочных темах крошки магазина выводит блок «Хлебные крошки магазина» (Store Breadcrumbs). В актуальных версиях WooCommerce он отрисовывает ту же цепочку из WC_Breadcrumb, так что фильтр woocommerce_get_breadcrumb действует и на него. После установки проверьте страницу товара в обоих случаях — и в шаблоне темы, и в редакторе сайта, если он используется.

Когда всё же править шаблон

Переопределение woocommerce/global/breadcrumb.php в папке темы по-прежнему работает, и оно уместно, когда нужно поменять саму разметку: разделители, обёртки, иконку дома. Для удаления, добавления или переименования элементов шаблон трогать не стоит: копия шаблона в теме перестаёт получать обновления, и WooCommerce будет напоминать об устаревшей версии в разделе «Статус». Фильтр таких проблем не создаёт.

Коротко

Чтобы убрать название товара из хлебных крошек, достаточно фильтра woocommerce_get_breadcrumb с array_pop() и условием is_product(). Разметка BreadcrumbList поменяется вместе с видимыми крошками. Если крошки строит Yoast или Rank Math, используйте их собственные фильтры — логика та же.

Частые вопросы

Q.Не пострадает ли SEO, если убрать название товара из крошек?

Нет. Разметка BreadcrumbList изменится вместе с видимыми крошками и останется согласованной. Google не требует, чтобы последний элемент списка соответствовал текущей странице — обязательны только название и позиция элементов.

Q.Почему фильтр не сработал?

Скорее всего, крошки выводит не WooCommerce, а Yoast SEO или Rank Math. Проверьте класс обёртки в HTML и используйте фильтр соответствующего плагина: wpseo_breadcrumb_links или rank_math/frontend/breadcrumb/items.

Q.Как убрать последний элемент не только на товарах, но и на категориях?

Уберите проверку is_product() из условия — тогда последний элемент будет сниматься на всех страницах магазина. Проверку count( $crumbs ) > 1 оставьте.

Q.Можно ли вместо удаления укоротить название товара?

Да. Вместо array_pop() измените текст последнего элемента массива через wp_trim_words() или mb_strimwidth(), оставив ссылку пустой.

Источники

Поделиться:OKVK