Добавляем подкатегории в постоянные ссылки в Woocommerce

Для SEO вам может понадобиться выстроить иерархическую структуру ссылок для страниц woocommerce-product. По-умолчанию woocommerce генерирует такие ссылки:

/product/product_category/product_name

вместо:

/product/catgory/sub_category/product_category/product_name

Для того, чтобы получить нужную нам структуру просто добавляем следующий код в файл functions.php вашей темы. Он уберет стандартный фильтр woocommerce “post_type_link” и заменит его новым.

remove_filter( 'post_type_link', 'woocommerce_product_cat_filter_post_link', 10, 2 ); // для версии woocommerce ниже 2.0 
remove_filter( 'post_type_link', 'woocommerce_product_post_type_link', 10, 2 ); // для версии woocommerce >= 2
add_filter( 'post_type_link', 'woocommerce_subcategory_permalink', 10, 2 );
function woocommerce_subcategory_permalink( $permalink, $post ) {

    // Прекращаем работу, если запись не является товаром
    if ( $post->post_type !== 'product' )
    	return $permalink;

    // Прекращаем работу, если тег перезаписи местоположения не находится в генерируемой ссылке
    if ( false === strpos( $permalink, '%product_cat%' ) )
    	return $permalink;

    // Получаем пользовательскую таксономию, используемую этой записью
    $terms = get_the_terms( $post->ID, 'product_cat' );

    if ( empty( $terms ) ) {
        $permalink = str_replace( '%product_cat%', _x('product', 'slug', 'woocommerce'), $permalink );
    } else {
        $first_term = array_shift( $terms );
        
        // Получаем иерархическую product_category
        $parents = woo_get_term_parents( $first_term->term_id, 'product_cat' );

        $permalink = str_replace( '%product_cat%/', $parents, $permalink );
    }

    return $permalink;
}

if ( ! function_exists( 'woo_get_term_parents' ) ) {
	function woo_get_term_parents( $id, $taxonomy ) {
		$chain = '';
		$parent = &get_term( $id, $taxonomy );
		if ( is_wp_error( $parent ) )
	    	return $parent;
	
	    $name = $parent->slug;
	
		if ( $parent->parent && ( $parent->parent != $parent->term_id )  ) {
		    $chain .= woo_get_term_parents( $parent->parent, $taxonomy);
		}
	
	    $chain .= $name."/";
	    return $chain;
	} // End woo_get_term_parents()
}
VN:F [1.9.22_1171]
Rating: 3.4/5 (5 votes cast)

Об авторе ADv

Занимаюсь разработкой сайтов и магазинов на WordPress. Оказываю платные помощь и консультации. Skype: advokat_b
  • Guest

    Я использую тему для woocommerce «wooshop lite». Вставляю код в functions.php — получаю белый экран. Сайт не грузится. В чем может быть проблема?

  • Кирилл

    Для того, чтобы код работал на версии WC 2.2.8 необходимо вместо

    remove_filter( ‘post_type_link’, ‘woocommerce_product_post_type_link’, 10, 2 ); // для версии woocommerce >= 2

    Вставить следующие

    remove_filter( ‘post_type_link’, ‘wc_product_post_type_link’, 10, 2 ); // для версии woocommerce >= 2

    У меня сразу код начал работать Спасибо большое!

  • Павел

    Не работает

    • ADv

      Комментарий ниже пробовали? Какую версию WC используете?

  • Evgeniy Milakin

    Спасибо, все работает (использовал также код из комментария ниже).

    Но остался вопрос, можно ли, чтобы ссылки на категории были такими же как и все остальные? т.е. у меня сейчас получается ссылка на товар: сайт.ру/shop/кат1/кат2/товар, а ссылки на сами категории: сайт.ру/категории/кат1, сайт.ру/категории/кат1/кат2

  • Максим Чайка

    Доброго времени суток! Добавил код в functions.php — никакого результата не получил. Все осталось по прежнему. Использую версию Woo 2.2.11
    Подскажите, что я мог упустить? Что еще нужно для работы данного кода? Какие настройки в постоянных ссылках?

    • Максим Чайка

      Хоть бы ответили…

      • Guest

        Хоть бы… посмотрели на дату публикации статьи с кодом и дату выхода вашей версии Woo. Настройки — только ЧПУ в любом его виде. Проверьте ссылки различным способом: перейдите в категорию, подкатегорию из товара, из админки. Также, вероятно, что изменилась какая-нибудь функция или ее параметры, и код перестал быть рабочим. У меня нет возможности тестировать все сниппеты на этом сайте с каждой новой версией WP или плагинов.

      • ADv

        Хоть бы… посмотрели на дату публикации статьи с кодом и дату выхода вашей версии Woo. Настройки — только ЧПУ в любом его виде. Проверьте ссылки различным способом: перейдите в категорию, подкатегорию из товара, из админки. Также, вероятно, что изменилась какая-нибудь функция или ее параметры, и код перестал быть рабочим. У меня нет возможности тестировать все сниппеты на этом сайте с каждой новой версией WP или плагинов.

  • http://rob3rt.tk Robert Vardanyan

    Спасибо, очень помогли)

Scroll To Top