Как удалить префикс «category» из URL рубрик

Думаю многие знают, как превратить ссылки в WordPress из /?p=1 в /категория/пост (это делается в админке в Настройки > Постоянные ссылки).

Однако первое, что бросается в глаза, это довольно странные URL у рубрик, вот такие /префикс-рубрики/рубрика (например /category/wordpress). Я не понимаю, для чего тут нужен префикс для рубрик, ведь:

  • для SEO это означает, что мы находимся в категории «префикс-рубрики» и подкатегории «рубрика», но это не так,
  • чем длиннее URL страницы сайта, тем хуже,
  • невозможно осуществлять навигацию по URL — то есть, если перейти по адресу http://ваш-сайт/category, то получим ошибку 404.

Короче говоря, нам нужно избавиться от префикса.

Возможно у вас возникнет вопрос — если у префикса категорий столько минусов, то зачем его вообще предусмотрели в WordPress? Ответ — чтобы отличать от меток. У меток, как и у категорий тоже есть префикс (по умолчанию — tag). И, если из URL рубрик мы ещё можем удалить category, то из URL меток это делать ни к чему.

В новых версиях WordPress это делается легко и просто — через файл .htaccess. Дело в том, что каждая наша рубрика доступна по двум URL — с префиксом и без. Тогда давайте поставим 301 редирект, этим мы сразу убьем двух зайцев:

  1. предотвратим возникновение дублей контента,
  2. избавимся от префикса category.

Прежде всего убедитесь, что настройки постоянных ссылок у вас выглядят примерно вот так:

Настройки постоянных ссылок в WordPress, префиксы для рубрик

Если в качестве префикса для рубрик у вас используется какое-либо другое слово, то есть не category, то обязательно верните префиксу значение по умолчанию (category), либо вообще оставьте поле пустым (как на скриншоте).

Затем вставьте этот код (предварительно заменив URL на URL своего сайта) в файл .htaccess, который находится непосредственно в папке с сайтом:

<IfModule mod_rewrite.c>
RedirectMatch 301 /category/(.*) https://truewp.ru/$1
</IfModule>

Относительно mod_rewrite не волнуйтесь, после обновления настроек постоянных ссылок он уже автоматически будет включён.

Избавляемся от «category» в старых версиях WordPress (до 3.4)

Тут стандартными средствами удалить префикс из URL не получится, можно изменить лишь слово, которое используется в качестве префикса, если оставить поле пустым то, заюзается слово category.

Ещё я натыкался на пару предназначенных для этого плагинов в интернете, но все они были косячные, после их установки стали пропадать страницы. Выкладываю решение, которое стояло на моем блоге (когда версия WordPress была ниже 3.4).

Итак, всего два шага и всё будет готово!

Первый шаг — хук для functions.php

Скопируйте этот код и вставьте его в файл functions.php вашей темы:

function true_remove_category_from_category($cat_url) {
	$cat_url = str_replace('/category', '', $cat_url);
	return $cat_url;
}
add_filter('category_link', 'true_remove_category_from_category', 1, 1);

Шаг второй — обновляем настройки постоянных ссылок в админке

Изменяем в настройках структуру постоянных ссылок на произвольную и вписываем туда что-то типа /%category%/%postname%.html или /%category%/%postname%.htm.

В общем после точки можно прописать любое расширение, главное не ошибиться в остальном, например если не дописать расширение вообще, то у вас пропадут страницы из рубрик, а точнее их содержимое.

Список плагинов

Для тех, кто не любит копаться в коде и для решения каждой задачи старается подобрать подходящий плагин, вот список плагинов, позволяющих удалить префикс рубрик из URL:

  • WP No Category Base — не требует дополнительной настройки. Прекрасно работает и с подкатегориями, перенаправление осуществляет через 301 редирект.
  • No category parents — этот плагин удаляет не только префикс рубрик, но и родительские категории из URL.
  • Remove Category URL — ещё один плагин, который по сути является копией WP No Category Base.

Каждый из этих плагинов доступен в официальном репозитории плагинов WordPress, а значит, устанавливается через админку сайта.

Смотрите также

Комментарии 53

  • B.G.3 июля 2012 в 16:07 #

    Похоже что версия вордпресса 3.4 сама начала справляться с этой проблемой. Раньше у меня стоял плагин для удаления слово категория их адреса, но в версии 3.4 он наоборот стал вредить.. Выкинул его и все стало хорошо.

    • Миша4 июля 2012 в 05:07 #

      да,да,это ты верно сказал, в 3.4 уже не катит этот способ) я тоже убрал этот хук, правда слово category появилось теперь

  • Миша24 августа 2014 в 22:08 #

    Пост обновлён, информация теперь актуальна для новых версий WordPress.

  • Alexey15 октября 2014 в 11:10 #

    Если поставить это редирект, то из урлов автоматически уберется /category/?

  • Alexey15 октября 2014 в 12:10 #

    И еще наверное в robots.txt надо закрывать /category/, да?

  • Игорь19 ноября 2014 в 16:11 #

    Спасибо за решение. Выручил, дружище :)

  • Александр Быкадоров16 апреля 2015 в 11:04 #

    Доброго дня.
    Такой вопрос. Сайт только создал, и сразу решил избавиться от этой проблемы. Можно ли сделать так, чтобы не перебрасывало через 301 редирект, а изначально убрать "category" из урла... Что имею ввиду?
    При наведении мышкой на категории, внизу в браузере выводится старый адрес по типу: название сайта/category/категория/пост.html при нажатии перекидывает по 301 редиректу сразу в адрес сайта: название сайта/категория/пост.html - что как бы правильно, но хотет бы изначально убрать это слово.
    Думаю понятно объяснил )))

  • Александр Быкадоров16 апреля 2015 в 11:04 #

    Поставил в Префикс для рубрик символ "." (точки) и все ушло - как это может влиять на структуру?

    • Миша16 апреля 2015 в 17:04 #

      Добрый день!

      Могу только сказать, что такой метод используется на многих блогах.

      В новых версиях WP по поводу редиректа можно не беспокоиться, ведь рубрики доступны по обоим URL.

  • pogruzovik.ru23 апреля 2015 в 13:04 #

    Добрый день!
    У меня задача немного другая стоит.
    Есть большой каталог с двумя уровнями категорий. Были ссылки на конечную подкатегорию такого вида:
    site.com/category/podcategory
    Сейчас я убрал промежуточную родительскую категорию из ссылки и стало так:
    site.com/podcategory
    * слово category - это для примера, на самом деле там название транслитом.

    Как сделать массовый редирект, чтобы из поисковиков попадали на нужную подкатегорию, а не на страницу ошибки 404?

    • Миша24 апреля 2015 в 08:04 #

      Добрый день!
      Ответ на ваш вопрос в этом посту :)

      • pogruzovik.ru24 апреля 2015 в 11:04 #

        Это не совсем то.
        У меня ссылки такого вида были:
        site.com/категория_экскаваторы/подкатегория_гусеничные_экскаваторы
        А тепреь так:
        site.com/подкатегория_гусеничные_экскаваторы
        Без родительской категории в ссылке. и Таких категорий больше сотни, каждая со своим назанием. Это не просто /category/
        Так вот нужно чтобы с первых ссылок работал редирект на вторы, т.к. с поисковиков много приходит на 404 ошибку...

        • Миша25 апреля 2015 в 10:04 #

          А каким образом вы убрали промежуточную категорию?

          Если вы хотите сделать всё минимальным количеством кода, то лучше через WP_Rewrite.

  • Дмитрий7 июня 2015 в 17:06 #

    Не совсем работает в 4.2 версии. Когда site.ru/category/главная категория - то работате номрально, удаляет category, а вот если site.ru/category/главная категория/под категория - тот site.ru/главная категория/под категория 404 ошибка

    • Миша8 июня 2015 в 08:06 #

      Да, вижу, согласен. Доработаю код.

      • BUTAMUHbI417 августа 2015 в 15:08 #

        Миша, есть доработки?

      • Максим15 сентября 2015 в 13:09 #

        Здравствуйте Миша.
        Столкнулся с выше описанной ситуацией sire.ru/категория/подкатегория выдает 404.
        Возможно у вас есть уже решение?
        Спасибо.

        • Светлана25 сентября 2015 в 21:09 #

          Доброй ночи. Подскажите, не нашлось ли случайно решение этой проблемы
          > sire.ru/категория/подкатегория выдает 404.
          Копаю уже вторые сутки - не могу найти решение!
          Заранее спасибо!

          • Миша26 сентября 2015 в 08:09 #

            Здравствуйте!
            Вот только что протестировал на версии 4.3.1 вплоть до дочерних категорий третьего уровня — всё работает на ура.

            И самое интересное, что вы не первая, у кого не получается. Мне будет интересно взглянуть на ваш сайт и со всем разобраться — напишите мне пожалуйста по email.

  • Sergey8 июня 2015 в 15:06 #

    было бы еще круто посмотреть вариант для nginx

  • Михаил Чугунов18 августа 2015 в 18:08 #

    Спасибо мужик! Помогло, красавец! От души!
    Причем на других блогах, на серче писали какую то херню. У тебя все по полочкам. Молодцом, добавил в закладки!

  • Михаил Чугунов18 августа 2015 в 18:08 #

    Мишаня, ты мне помог, и я спешу тебе помочь советов. В блоке комментариев, когда я отправляю тебе сообщение, нажав кнопку ответ, то автоматически создается дублю replytocom. Чтобы это избежать, необходимо поменять в funcions.php часть кода, отвечающую за вывод этих комментов. Чтобы комменты стали скриптом, а не ссылокой. Как принял?

  • Николай30 августа 2015 в 22:08 #

    На какие то рубрики заходит , а на какие то нет ! С чем это связано?

    • Миша31 августа 2015 в 14:08 #

      Мне нужно больше информации, чтобы дать вам ответ. Обновляли настройки постоянных ссылок?

  • Игорь22 сентября 2015 в 23:09 #

    Поставил "." из ссылок слово category пропало, но теперь ведет на страницу 404. Как исправить?

  • Игорь23 сентября 2015 в 07:09 #

    Понятно, метод с файлом htaccess тоже не работает

  • Юрий27 сентября 2015 в 19:09 #

    С помощью модификации .htaccess все работает отлично, но есть одна проблема. Карта сайта, создаваемая модулем Yoast SEO по-прежнему содержит в /category/ в URL, хотя и редиректит на целевой. Подскажите, как модифицировать и в карте сайта? Спасибо.

    • Миша28 сентября 2015 в 09:09 #

      После ребилда карты ничего не меняется?
      В настройках постоянных ссылок category удалено?

      • Юрий28 сентября 2015 в 10:09 #

        В настройках постоянных ссылок стоит опция "произвольно" (/%category%/%postname%.html). Внизу заметил появилось уведомление, о том, что нужно изменить .htaccess на тот, который был изначально. Это просто игнорировать?
        Что касается карты сайта от Yoast - она формируется по критерию /%category%/%postname%.html. Если из структуры URL в настройках постоянных ссылок убрать /%category%/, то страницы категорий выдают ошибки 404.

      • Юрий28 сентября 2015 в 12:09 #

        Проблема отлично решилась установкой модуля Remove Category URL. /category/ исчезло и карта сайта выводится нормально. Хотелось решить без плагина, ну хотя-бы так.

        • Миша30 сентября 2015 в 09:09 #

          Можно в принципе полазить по файлам плагина, разобраться, как он это делает и просто вытащить из него несколько функций.

  • сергей24 октября 2015 в 21:10 #

    подскажите как сделать урл без ad-category, получается так /ad-category/kvartiry/kvartiry-na-dlitelnyj-srok/, а нужно вот так /kvartiry/kvartiry-na-dlitelnyj-srok/

    • Миша25 октября 2015 в 11:10 #

      вы оставили комментарий к статье, в которой по сути решение этой задачи и описано :)

  • Дмитрий18 декабря 2015 в 13:12 #

    Михаил, добрый день.

    Имеется сайт на wordpress установлена тема DIRECTORY PORTAL V4.3 ,
    Особенностью темы является то, что категории справочника и сами карточки организаций, создаются как "свой тип записи" и базовые настройки формирования URL на них не действуют.
    В итоге имеем
    категория:
    Сейчас – site/cat/категория/
    Надо – site/категория/

    Карточка организации:
    Сейчас: site/item/организация/
    Надо: site/КАТЕГОРИЯ/организация/

    Перепробовал все какие нашел плагины, но так и не решил проблему.
    Сможете помочь разобраться? Готов оплатить вашу работу

    • Миша19 декабря 2015 в 10:12 #

      Добрый день, Дмитрий,

      я точно не помню, имеется ли в WP возможность перезаписать таким образом URL произвольных типов постов и таксономий, но могу попробовать, пожалуйста, напишите мне по email.

      • Дмитрий19 декабря 2015 в 10:12 #

        Спасибо Михаил за отклик, но этой ночью я нашел решение))

        • Миша19 декабря 2015 в 10:12 #

          Отлично :)
          Будет здорово, если вы поделитесь кодом в комментариях — возможно он кому-нибудь пригодится.

          • Дитрий19 декабря 2015 в 12:12 #

            Проблему решил но частично.

            Облазил кучу сайтов и нашел подсказку на сайте разработчика.

            Конкретно тут. Но к сожалению (возможно потому что, тему я не покупал, или там решения для более поздней версии) у меня нету указанной там папки с плагином и фаил этот я не нашел (/wp-content/plugins/ait-toolkit/cpts/item/@item.cpt.neon). Но меня это не остановило и прошарил содержимое всех фаилов в своей теме через Notepad++. Итогом поисков стал фаил dir-item.php, который лежит в папке /wp-content/themes/directory/AIT/Framework/CustomTypes/dir-item.

            Вот те части когда, которые отвечают за категории справочника карточку организации:

            Категория:

            'show_ui' => true,
            'rewrite' => array( 'slug' => 'cat' ),
            'capabilities' => array(
            'assign_terms' => 'assign_dir_category'

            Организация:

            'rewrite' => array('slug' => 'item'),

            'capability_type' => 'ait-dir-item',
            'map_meta_cap' => true

            Я как бы вообще, не программист и очень плохо рзабираюсь в верстке, но в этом коде я увидел как раз то что я искал.

            Путем замены ( 'slug' => 'cat' ) на ( 'slug' => '/' ) я избавился изменил URL категорий на сайте с site/cat/категория/ на site/категория/.

            Но вот с URL организаций я не справился пока, как я понимаю значение item в строке ('slug' => 'item'), надо заменить на какую то функцию, что бы сюда подставлялась родительская категория. Но опять же, я не программист и тут мне тяжело.

            P.s.: cейчас я пытаюсь понять как формируются хлебные крошки, .т.к в них отображается именно родительская категория карточки организации и как я понимаю это ключ к тому, что бы настроить вложенность URL. (возьму ту же функцию и поставлю вместо item). Ну или как то так.. Если кто решил эту задаяу буду рад помощи.

            • Дитрий19 декабря 2015 в 17:12 #

              В поисках решения набрел на плагин, WP Permastructure. После его активации, в разделе "Настройки постоянных" добавляется раздел Custom post type permalink settings, где можно задать параметры url произвольных записей.
              Попробовал вот так:

              /%postname%

              В этом случае карточка организации открывается по адресу
              сайт/название организации

              Потом, попробовал вот так:
              /%ait-dir-item-category%/%postname%
              В этом случае карточка организации открывается по адресу
              сайт/категория/название организации .

              Казалось бы все классно, но теперь все страницы-карточки отдают 404-ую ошибку )) Михаил, нужна ваша помощь )

  • St.eV6 января 2016 в 14:01 #

    Всем привет!

    Вариант с 301-редиректом неплох, но не решает основную задачу - избавиться от префикса в категориях.
    ПС анализируют код страниц, в коде везде числятся /category/slug/ - а далее уже идет 301 редирект через .htaccess
    Google, например, не любит когда много редиректов. Поэтому, рекомендую смотреть в сторону плагинов или собственных функций, убирающих префикс сразу из кода страниц.

  • Александр10 января 2016 в 03:01 #

    Не знаю как этот код, а я себе фот этот поставил

    RewriteRule ^category/(.+)$ httр://ваш сайт.ру/$1 [R=301,L]

    И он прекрасно у меня работает с категориями и подкатегориями

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.