Верх страницы
Обложка к записи Правильная структура ссылок WooCommerce
Время для прочтения: 1 мин. 21 сек.

Правильная структура ссылок WooCommerce

Данные манипуляции негативно сказываются на скорости работы вашего сайта, зато сеошник будет спать спокойно.

Правильной структурой я называю такие пермалинки, когда всё логично вложено друг в друга и, стерев последнюю часть URL, вы всегда попадете на раздел выше.

Например:

  • Главная магазина: https://example.com/shop/
  • Категория товара:  https://example.com/shop/category/
  • Страница товара:  https://example.com/shop/category/product/

Идея здесь очень простая.

  1. Для главной страницы магазина устанавливаем любую страницу со слагом shop.
  2. В настройках постоянных ссылок для базы категорий товаров указываем shop, а для товаров выбираем произвольную базу и вписываем туда /shop/%product_cat%/.
  3. Далее, используя сниппет ниже (его можно добавить в 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 );

Теперь просто зайдите на страницу Настройки -> Постоянные ссылки для сброса правил перенаправлений.

Ссылки

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

31 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Михаил Дзен
3 лет назад

От души тебя благодарю. Искал долго данное решение.

Фахад Сулейманович
Фахад Сулейманович
3 лет назад

В принципе, https://example.com/shop/category/product/ — всё логично. Но, при такой структуре мы столкнулись с большими проблемами в плане СЕО.

К примеру, если товар перенести из категории1 в категорию2, то меняется URL — а это уже битая ссылка.

Разработчики WooCommerce советуют, чтобы ссылки у товаров были вида:
https://example.com/product/product-name — в таком случае при смене категории URL всегда остаётся правильным.

Аналогично с категориями. Если перенести подкатегорию в другую категорию — меняется ссылка, а это для СЕО очень плохо. Уже жалеем, что у себя на сайте сделали структуру по типу https://example.com/shop/category/subcategory/

Александр
Александр
3 лет назад
Ответить на  Кобзарёв Михаил

От себя добавлю, на счет subcategory да для сео плоховато, но на этот случай можно использовать редирект тех подкатегорий, которые были перенесены, тогда сео не пострадает. А вот есть проблема в другом, когда товар доступен по адресу /shop/product/ и /shop/category/product/ и /shop/category/subcategory/product, происходит дубли и их огромная куча, есть для этого какая-то реализация? Ваше решение достойное, но может быть вы уже нашли как это исправить?

Александр
Александр
3 лет назад
Ответить на  Александр

В основном эта проблема связана с товарами, которые находятся в подкатегории /shop/category/subcategory/product, стоит убрать категорию и товар доступен по адресу /shop/subcategory/product ((((

Александр
Александр
3 лет назад
Ответить на  Кобзарёв Михаил

Точно, прям расскрыли мне глаза)). Спасибо!

Сергей
Сергей
9 месяцев назад
Ответить на  Кобзарёв Михаил

Привет, спасибо за решение, правда оно на Рехабе несколько кривовато работает (не по своей функции). Но что поделать. )

В тему логики хотел именно написать. Проблема-то как раз в том, что условная страница shop подменяется в категории же условной страницей каталог.

Формирование ЧПУ это, конечно, отлично (но не сильно важно), так что можно было бы остановиться на главной странице магазина:
site/shop и на товаре site/shop/product, без указания категории. По крошкам поисковик и так сделает, как надо. Но в ВП такое не сделать, будет 404 ошибка на категории…

Конечно, есть и ещё куда более значимая проблема — динамические ссылки кривого типа в фильтрации и вот это, конечно, уже совсем печальная вещь. Т.е. надо как-то изголяться, чтобы на фильтр/атрибут формировалась ссылка с магазином, а это только если делать дополнительные категории.

Так-то ВП может и подходит для слабых ИМ, но и правда эта плотформа для блогов, всё таки. Если с тем же Битриксом сравнивать. Но для старта в НК нишах самое оно.

Владимир Афанасьев
Владимир Афанасьев
3 лет назад

— Возможно ли в WordPress сделать некоторые страницы фильтров ЧПУ и открыть их для индексации? И как это сделать?
Например, если у меня магазин товаров, и я бы хотел продвигать страницы по запросу товар+бренд.
А всего имеется 50 разных видов товаров и у каждого по несколько брендов.

Рамзес
Рамзес
1 год назад
Ответить на  Кобзарёв Михаил

Добрый день, как вы в фильтрах обрезаете начала в урлах?
Хочу тоже так сделать, а он выдает
product-category/dlya-zhenshhin/odezhda-dlya-zhenshhin/attribute-color-abrikosovyj/attribute-dlya-kogo-zhenshhinam/attribute-tip-tovara-bryuki/

Рамзес
Рамзес
1 год назад
Ответить на  Кобзарёв Михаил

Вот вы показали, что меняете урлы при фильтрации
/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 и тд)

Александр
Александр
2 лет назад

Спасибо, добрый человек! Наконец-то получилось! Это именно то, что я искал

Мария
Мария
1 год назад

У нас на сайте реализованы ссылки на товары вида https://example.com/product/product-name
Однако, сейчас я стала выяснять источники отказов по яндекс-метрике, и одним из таких источников стала ссылка https://example.com/product/.
Т.е. получается, что если я удаляю все справа до product — выплывает страница 404. Как с этим можно бороться? Менять ссылки? Или этот вопрос не в эту тему?
Я не великий спец в вродпресс, буду благодарна за любой совет:)

Мария
Мария
1 год назад
Ответить на  Кобзарёв Михаил

Спасибо, уже поставила сео плагин и сделала редирект. Все стало хорошо:) А вот robots.txt пока не умею редактировать:)

o_kroshka
o_kroshka
1 год назад

Спасибо! Отличное удобное решение. И сразу хлебные крошки в порядок пришли. Все гуд ^^

Юрий
Юрий
1 год назад

Добрый день! Как быть если есть товар:

/shop/peugeot-boxer/mehanicheskaya-chast/dvigatel-3/pitanie/aktuator-turbiny-pezho-boxer-evro-5-jrone-bez-kryshki/

И если я введу абсолютно любое значение вместо категории «peugeot-boxer» у меня откроется эта же страница? Создалось очень много дублей из за того, что товар был перенесен из категории1 в категорию2. Теперь он дублируется хотя в woocommerce товар один

twixi
twixi
1 год назад

Актуально ли на сегодня?,
у меня не работает:
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

Алекс
Алекс
1 год назад

Спасибо тебе большой человек)

Предыдущая запись
Следующая запись

Давайте дружить
в Telegram

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы