Woocommerce удалить /product/, /product-category/ или /shop/ из текста ссылки

Хорошая новость и решение извечной проблемы Woocommerce (или скорей не проблемы а функции которую никак не удавалось реализовать из самого начала создания данного планига магазина, да и сеошники не дадут спокойно жить, если нелегкая заставить дать на растерзание им свой сайт). Наконец то появилась возможность удалить /product/,  /product-category/ или /shop/ из текста ссылки магазина Woocommerce и сделать корокие url  Woocommerce  без промежуточных ссылок.

Удалить из url Woocommerce  /product/,  /product-category/ и /shop/  можно следующим способом:

В function.php добавляем следующий код:

После чего настраиваем постоянные ссылки (“Настройки – Постоянные ссылки”) Woocommerce, как дефолтные (при условии что вы их меняли). Или согласно данного скрина:

woocommerce постоянные ссылки

С такой реализацией я обычно использую еще одну хитрость – назначаю витрину магазина главной страницей, что помогает дополнительно избавиться от дубля ссылки на витрину, которая содержит “shop”.

Сылки будут иметь вид соответственно на категорию и товар: “название_магазина/категория” и “название_магазина/товар”. Ну а главную страницу теперь являющуюся витриной можно настроить по своему вкусу с помощью плагинов или отредактировать шаблон винтрины.

Таким способом получаем красивые короткие url адреса магаза Woocommerce без промежуточных секций типа product, product-category и shop.

На момент написания статьи (и соответственно метод применен на практике) на WordPress версии 4.8 и магазина Woocommerce 3.1.0. Магазин рабочий и постоянно обновляется, так что будем следить за тем, как поведет данный способ на последних актуальных версиях связки и не отвалиться ли чего при следующих обновлениях

 

8 Comments

    1. working-out

      Вариант рабочий и проверенный – clock4you.in.ua – магазин сейчас работает с этими настройками (пока в процессе разработки) – последние версии WooCommerce и Вордпресс – адреса короткие как Видно. Посмотрите внимательно настройки – “База категорий” должна быть пустая, а база товара по-умолчанию. Возможно еще есть какие нибуть сторонние модули, которые управляют адресами (была проблема Yoast SEO – раздел удалить category из ссылки). И еще момент – возможно – в примере настройка постоянных ссылок в самом ВП стоит произвольно – /%postname%

        1. working-out

          В такой реализации категория показывается как по короткой ссылке, так и с полным путем. Самое простое что сразу приходит в голову сделать 301 на короткую ссылку в .htaccess (если категорий не сильно много – вполне преемлимо). Только нужно смотреть где “canonical” прописывается – он идет сполным путем. Вобще такой задачи не стояло – отработаного варианта пока нет. Если решите и эту задачу – буду рад, если поделитесь

        2. Андрей

          Спасибо, работает.

          А есть ли возможность отразить категории в ЧПУ продукта?

          Пример: сайт.рф/категория/подкатегория/товар

          1. working-out

            Такую реализацию еще не нашел. Если поставить в настройках постоянных ссылок произвольную базу /product/%product_cat%/ (по-умолчанию ссылка на товар с цепочкой категорий), то ссылки генерируются правильно, но страница товара отдает 404. На следующем сайте еще поэксперементирую, может что появится.

      1. Дед митяй

        В моём случае фраза-“И еще момент — возможно — в примере настройка постоянных ссылок в самом ВП стоит произвольно — /%postname%”
        была ключевая!
        Автору огромное спасибо, очень помог!
        Я не программист и не понимаю код и данных исправлений, но хотелось бы узнать влияет ли как то этот код на СЕО продвижение или усложняет ли он работу для поисковых роботов?
        С ув.

  1. Здравствуйте.

    Может быть, сможете помочь?

    Взял за основу Ваш код, но, поскольку мне нужно сохранить /shop/ в ссылке, немного его модифицировал. Получилось так:

    add_filter( ‘request’, ‘change_request_vars_for_product_cat’ );
    add_filter( ‘term_link’, ‘term_link_filter’, 10, 3 );
    add_filter( ‘post_type_link’, ‘wpp_remove_slug’, 10, 3 );
    add_action( ‘pre_get_posts’, ‘wpp_change_request’ );
    function change_request_vars_for_product_cat($vars) {

    global $wpdb;
    if ( ! empty( $vars[ ‘pagename’ ] ) || ! empty( $vars[ ‘category_name’ ] ) || ! empty( $vars[ ‘name’ ] ) || ! empty( $vars[ ‘attachment’ ] ) ) {
    $slug = ! empty( $vars[ ‘pagename’ ] ) ? $vars[ ‘pagename’ ] : ( ! empty( $vars[ ‘name’ ] ) ? $vars[ ‘name’ ] : ( ! empty( $vars[ ‘category_name’ ] ) ? $vars[ ‘category_name’ ] : $vars[ ‘attachment’ ] ) );
    $exists = $wpdb->get_var( $wpdb->prepare( “SELECT t.term_id FROM $wpdb->terms t LEFT JOIN $wpdb->term_taxonomy tt ON tt.term_id = t.term_id WHERE tt.taxonomy = ‘product_cat’ AND t.slug = %s”, array( $slug ) ) );
    if ( $exists ) {
    $old_vars = $vars;
    $vars = array( ‘product_cat’ => $slug );
    if ( ! empty( $old_vars[ ‘paged’ ] ) || ! empty( $old_vars[ ‘page’ ] ) ) {
    $vars[ ‘paged’ ] = ! empty( $old_vars[ ‘paged’ ] ) ? $old_vars[ ‘paged’ ] : $old_vars[ ‘page’ ];
    }
    if ( ! empty( $old_vars[ ‘orderby’ ] ) ) {
    $vars[ ‘orderby’ ] = $old_vars[ ‘orderby’ ];
    }
    if ( ! empty( $old_vars[ ‘order’ ] ) ) {
    $vars[ ‘order’ ] = $old_vars[ ‘order’ ];
    }
    }
    }

    return $vars;

    }

    function term_link_filter( $url, $term, $taxonomy ) {

    $url = str_replace( “/product-category/”, “/shop/”, $url );
    return $url;

    }

    function wpp_remove_slug( $post_link, $post, $name ) {

    if ( ‘product’ != $post->post_type || ‘publish’ != $post->post_status ) {
    return $post_link;
    }
    $post_link = str_replace( ‘/’ . $post->post_type . ‘/’, ‘/shop/’, $post_link );

    return $post_link;

    }

    function wpp_change_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query[ ‘page’ ] ) ) {
    return;
    }
    if ( ! empty( $query->query[ ‘name’ ] ) ) {
    $query->set( ‘post_type’, array( ‘post’, ‘product’, ‘page’ ) );
    }

    }

    И в настройках постоянных ссылок товаров указано /shop/%product_cat%/ , а не “По умолчанию”, как рекомендуете Вы.

    В итоге всё замечательно работает, за исключением родительских категорий. В них ломается пагинация и при переходе на 2 страницу каталога вываливается 404-ая страница. При этом на главной странице магазина или в дочерних категориях пагинация работает корректно…

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *