Правильная структура ссылок 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 );

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

Ссылки

Источник: https://www.kobzarev.com/wordpress/woocommerce-valid-permalinks/

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

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: