Правильная структура ссылок WooCommerce
Данные манипуляции негативно сказываются на скорости работы вашего сайта, зато сеошник будет спать спокойно.
Правильной структурой я называю такие пермалинки, когда всё логично вложено друг в друга и, стерев последнюю часть URL, вы всегда попадете на раздел выше.
Например:
- Главная магазина: https://example.com/shop/
- Категория товара: https://example.com/shop/category/
- Страница товара: https://example.com/shop/category/product/
Идея здесь очень простая.
- Для главной страницы магазина устанавливаем любую страницу со слагом
shop
. - В настройках постоянных ссылок для базы категорий товаров указываем
shop
, а для товаров выбираем произвольную базу и вписываем туда/shop/%product_cat%/
. - Далее, используя сниппет ниже (его можно добавить в
functions.php
или вmu-plugins
), создаём новые правила перенаправления для каждой категории товара, подменяя в ссылках на категорию/product-category/
на/shop/
.
<?php
/**
* Делаем простую и понятную структуру для урлов WooCommerce:
*
* Страница магазина: https://domain.com/shop
* Страница категории: https://domain.com/shop/category
* Страница товара: https://domain.com/shop/category
*
* @link https://rogodessa.ru/woocommerce/woocommerce-nastrojki-postoyannyx-ssylok-kak-ubrat-product-category
*/
/**
* Генерим свои реврайты для категорий товаров
* и сбрасываем их кэш при необходимости.
*
* @param bool $flash флаг, показывающий нужно ли сбрасывать пермалинки.
*/
function mihdan_woocommerce_permalinks( $flash = false ) {
$terms = get_terms(
array(
'taxonomy' => 'product_cat',
'post_type' => 'product',
'hide_empty' => false,
)
);
if ( $terms && ! is_wp_error( $terms ) ) {
$siteurl = esc_url( home_url( '/' ) );
foreach ( $terms as $term ) {
$term_slug = $term->slug;
$baseterm = str_replace( $siteurl, '', get_term_link( $term->term_id, 'product_cat' ) );
add_rewrite_rule( $baseterm . '?$', 'index.php?product_cat=' . $term_slug, 'top' );
add_rewrite_rule( $baseterm . 'page/([0-9]{1,})/?$', 'index.php?product_cat=' . $term_slug . '&paged=$matches[1]', 'top' );
add_rewrite_rule( $baseterm . '(?:feed/)?(feed|rdf|rss|rss2|atom)/?$', 'index.php?product_cat=' . $term_slug . '&feed=$matches[1]', 'top' );
}
}
if ( true === $flash ) {
flush_rewrite_rules( false );
}
}
add_filter( 'init', 'mihdan_woocommerce_permalinks' );
/**
* Перегенирить пермалинки и сбросить их кэш при создании новой категории.
*
* @param int $term_id идентификатор категории.
* @param string $taxonomy слаг таксономии.
*/
function mihdan_woocommerce_permalinks_flush( $term_id, $taxonomy ) {
if ( 'product_cat' === $taxonomy ) {
mihdan_woocommerce_permalinks( true );
}
}
add_action( 'create_term', 'mihdan_woocommerce_permalinks_flush', 10, 2 );
/**
* Подменить /product-category/ на /shop/ в ссылке категории.
*
* @param string $url URL по дефолту.
* @param object $term объект термина.
* @param string $taxonomy слаг таксономии.
*
* @return mixed
*/
function mihdan_woocommerce_fixed_category_permalink( $url, $term, $taxonomy ) {
if ( 'product_cat' === $taxonomy ) {
return str_replace( 'product-category/', 'shop/', $url );
}
return $url;
}
add_filter( 'term_link', 'mihdan_woocommerce_fixed_category_permalink', 10, 3 );
Теперь просто зайдите на страницу Настройки
-> Постоянные ссылки
для сброса правил перенаправлений.
Ссылки
- Removing /product/ , /product-category/ , or /shop/ from the URLs
- Woocommerce — настройки постоянных ссылок. Как убрать product-category и не только
- Не удаляйте product-category из URL в WooCommerce
От души тебя благодарю. Искал долго данное решение.
Не за что
В принципе,
https://example.com/shop/category/product/
— всё логично. Но, при такой структуре мы столкнулись с большими проблемами в плане СЕО.К примеру, если товар перенести из категории1 в категорию2, то меняется URL — а это уже битая ссылка.
Разработчики WooCommerce советуют, чтобы ссылки у товаров были вида:
https://example.com/product/product-name
— в таком случае при смене категории URL всегда остаётся правильным.Аналогично с категориями. Если перенести подкатегорию в другую категорию — меняется ссылка, а это для СЕО очень плохо. Уже жалеем, что у себя на сайте сделали структуру по типу
https://example.com/shop/category/subcategory/
Вот поэтому я всегда и советую перед изменением стандартной структуры 10 раз подумать логически и посчитать все за и против. Спасибо за кейс.
От себя добавлю, на счет subcategory да для сео плоховато, но на этот случай можно использовать редирект тех подкатегорий, которые были перенесены, тогда сео не пострадает. А вот есть проблема в другом, когда товар доступен по адресу /shop/product/ и /shop/category/product/ и /shop/category/subcategory/product, происходит дубли и их огромная куча, есть для этого какая-то реализация? Ваше решение достойное, но может быть вы уже нашли как это исправить?
В основном эта проблема связана с товарами, которые находятся в подкатегории /shop/category/subcategory/product, стоит убрать категорию и товар доступен по адресу /shop/subcategory/product ((((
Каноникал же, если вам не надо индексировать, то noindex
Точно, прям расскрыли мне глаза)). Спасибо!
Не за что
Привет, спасибо за решение, правда оно на Рехабе несколько кривовато работает (не по своей функции). Но что поделать. )
В тему логики хотел именно написать. Проблема-то как раз в том, что условная страница shop подменяется в категории же условной страницей каталог.
Формирование ЧПУ это, конечно, отлично (но не сильно важно), так что можно было бы остановиться на главной странице магазина:
site/shop и на товаре site/shop/product, без указания категории. По крошкам поисковик и так сделает, как надо. Но в ВП такое не сделать, будет 404 ошибка на категории…
Конечно, есть и ещё куда более значимая проблема — динамические ссылки кривого типа в фильтрации и вот это, конечно, уже совсем печальная вещь. Т.е. надо как-то изголяться, чтобы на фильтр/атрибут формировалась ссылка с магазином, а это только если делать дополнительные категории.
Так-то ВП может и подходит для слабых ИМ, но и правда эта плотформа для блогов, всё таки. Если с тем же Битриксом сравнивать. Но для старта в НК нишах самое оно.
На WordPress можно сделать проект любой сложности, если есть голова на плечах, в том числе с любым роутингом. В вашем примере достаточно при регистрации типа записи для товаров указать в rewrite/base нужную приставку.
— Возможно ли в WordPress сделать некоторые страницы фильтров ЧПУ и открыть их для индексации? И как это сделать?
Например, если у меня магазин товаров, и я бы хотел продвигать страницы по запросу товар+бренд.
А всего имеется 50 разных видов товаров и у каждого по несколько брендов.
Регистрируйте свой кастомный
endpoint
и на его основе делайте любые роутер, мы обычно делаем структуру:/cat/food/f/color/red/size/big
где
food — категория
f — признак, что дальше фильтр
color/red — Фильтр по цвету
size/big/ — фильтр по размеру
Гавное тут атрибуты сортировать по имени, чтобы не наплодить дубликатов url с одинаковыми параметрами, но разной их последовательность.
Добрый день, как вы в фильтрах обрезаете начала в урлах?
Хочу тоже так сделать, а он выдает
product-category/dlya-zhenshhin/odezhda-dlya-zhenshhin/attribute-color-abrikosovyj/attribute-dlya-kogo-zhenshhinam/attribute-tip-tovara-bryuki/
О каких фильтрах идет речь?
Вот вы показали, что меняете урлы при фильтрации
/cat/food/f/color/red/size/big
где
food — категория
f — признак, что дальше фильтр
color/red — Фильтр по цвету
size/big/ — фильтр по размеру
Хотел понять, как это сделать
product-category/dlya-zhenshhin/odezhda-dlya-zhenshhin/attribute-color-abrikosovyj/attribute-dlya-kogo-zhenshhinam/attribute-tip-tovara-bryuki/
просто у меня сейчас вот такое и хотел это в более нормальный вид привезти для SEO и также этим страницам задать отдельный метаданные для поисковиков (h1, title, desc и тд)
Тут много от плагинов зависит, которые вы используете для создания фильтров и фасетов. А так это обычное правило add_rewrite_rule()
Спасибо, добрый человек! Наконец-то получилось! Это именно то, что я искал
Не за что, пользуйтесь!!!
У нас на сайте реализованы ссылки на товары вида
https://example.com/product/product-name
Однако, сейчас я стала выяснять источники отказов по яндекс-метрике, и одним из таких источников стала ссылка
https://example.com/product/.
Т.е. получается, что если я удаляю все справа до product — выплывает страница 404. Как с этим можно бороться? Менять ссылки? Или этот вопрос не в эту тему?
Я не великий спец в вродпресс, буду благодарна за любой совет:)
Откуда вы взяли такую ссылку, откуда ее взяли пользователи и поисковики? Это решите для начала и всегда можно сделать 301 редирект с ненужной страницы на нужную, закрыть её от индексации в robots.txt
Спасибо, уже поставила сео плагин и сделала редирект. Все стало хорошо:) А вот robots.txt пока не умею редактировать:)
Придёт время — научитесь!
Спасибо! Отличное удобное решение. И сразу хлебные крошки в порядок пришли. Все гуд ^^
Пользуйтесь!!!
Добрый день! Как быть если есть товар:
/shop/peugeot-boxer/mehanicheskaya-chast/dvigatel-3/pitanie/aktuator-turbiny-pezho-boxer-evro-5-jrone-bez-kryshki/
И если я введу абсолютно любое значение вместо категории «peugeot-boxer» у меня откроется эта же страница? Создалось очень много дублей из за того, что товар был перенесен из категории1 в категорию2. Теперь он дублируется хотя в woocommerce товар один
Сделайте 301-й редирект со старых ссылок на новые
Актуально ли на сегодня?,
у меня не работает:
https://site.com/shop/ ok
https://site.com/shop/cat/ 404
https://site.com/shop/cat/sub-cat/product_1 ok
Product category base: shop
Custom base: /shop/%product_cat%/
функция в папке mu-plugins
Да всё работает, реврайты скинули?
Спасибо тебе большой человек)
Не за что!