Многие вебмастера, при создании интернет магазина на WooCommerce, сталкивался с задачей сделать нормальные – человечке ссылки. Другими словами, правильную вложенность. Но к сожалению движок устроен немного по другому. Не мало важно, что данный способ будет работать на мультиязычных сайтах. Например, которые используют плагин WPML
И так, даю инструкцию как сделать вот такие ссылки:
1 2 3 | Страница магазина: http://domain.com/shop/ Категория: http://domain.com/shop/your-category Страница продукта: http://domain.com/shop/your-category/your-sample-product |
1. Странице магазина задаем ссылку shop
2. Настройки – Настройки постоянных ссылок и указываем следующие настройки:
1 2 | База категорий товара - shop Произвольная база - /shop/%product_cat%/ |
3. В файл темы functions.php добавляем следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | add_filter( 'init', 'ywp_product_category_base_same_shop_base' ); function ywp_product_category_base_same_shop_base( $flash = false ){ global $sitepress; $languages = icl_get_languages( 'skip_missing=0&orderby=code' ); if( $languages && ! empty( $languages ) ){ $original_lang = ICL_LANGUAGE_CODE; foreach( $languages as $key=>$lang ) { $new_lang = $key; $sitepress->switch_lang( $new_lang ); $terms = get_terms( array( 'taxonomy' => 'product_cat', 'post_type' => 'product', 'hide_empty' => false, ) ); if ( $terms && ! is_wp_error($terms ) ) { $siteurl = apply_filters( 'wpml_home_url', get_home_url( '/' ) ); $siteurl = ( $sitepress->get_default_language() == $key ) ? $siteurl.'/' : $siteurl; 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' ); } } $sitepress->switch_lang( $original_lang ); } } if ( $flash == true ) flush_rewrite_rules( false ); } /* Fix error when creating new taxomony is 404 */ add_action( 'create_term', 'ywp_product_cat_same_shop_edit_success', 10, 2 ); function ywp_product_cat_same_shop_edit_success( $term_id, $taxonomy ) { ywp_product_category_base_same_shop_base( true ); } |
На всякий случай еще раз нажимаете сохранить изменения в настройках постоянных ссылках и радуемся результату.
Теперь вашу ссылку будут правильной вложенности и не будет ошибок 404 при переходе в подкатегории.
А если у человека не установлен WPML, то будет вываливаться ошибка при попытки вызова icl_get_languages…