Верх страницы
Логотип Telegram
@Злой_Полицейский — авторский канал вашего покорного слуги в Telegram, где я пишу заметки о веб-разработке, программировании, PHP, инструментах и WordPress.
Обложка к записи Правильная структура ссылок 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 );

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

Ссылки

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

Суровый русский разработчик. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все.

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

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

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

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

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

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

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

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

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

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

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

Александр
Александр
1 год назад
Ответить на  Александр

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

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

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

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

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

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

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

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

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

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

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

Мария
Мария
4 месяцев назад

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

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

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

o_kroshka
o_kroshka
2 месяцев назад

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

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

Михаил Кобзарёв (mihdan)

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