Правильная структура ссылок 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
Точно, прям расскрыли мне глаза)). Спасибо!
Не за что
— Возможно ли в 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 пока не умею редактировать:)
Придёт время — научитесь!
Спасибо! Отличное удобное решение. И сразу хлебные крошки в порядок пришли. Все гуд ^^
Пользуйтесь!!!