Верх страницы
Обложка к записи Правильная структура ссылок 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 );

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

Ссылки

ВКонтакте
Одноклассники
Telegram

Комментарии
Подписаться
Уведомить о
guest
11 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Михаил Дзен
11 месяцев назад

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

Фахад Сулейманович
Фахад Сулейманович
7 месяцев назад

В принципе, 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 месяц назад
Ответить на  Кобзарёв Михаил

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

Владимир Афанасьев
Владимир Афанасьев
6 месяцев назад

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