Как удалить префикс «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://misha.blog/$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, а значит, устанавливается через админку сайта.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

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

  • B.G. 3 июля 2012 #

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

    • Миша 4 июля 2012 #

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

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

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

  • Alexey 15 октября 2014 #

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

    • Миша 15 октября 2014 #

      урлы с category будут редиректиться на урлы без category через 301

  • Alexey 15 октября 2014 #

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

    • Миша 15 октября 2014 #

      Нет не нужно 🙂

  • Игорь 19 ноября 2014 #

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

    • Миша 19 ноября 2014 #

      Рад помочь 🙂

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

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

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

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

    • Миша 16 апреля 2015 #

      Добрый день!

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

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

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

        Спасибо, Михаил. Поставил точку и думаю этого хватит - как считаете?

        • Миша 16 апреля 2015 #

          Если всё работает, то думаю не о чем беспокоиться 🙂

          • Александр Быкадоров 17 апреля 2015 #

            Спасибо, друг )))

  • pogruzovik.ru 23 апреля 2015 #

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

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

    • Миша 24 апреля 2015 #

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

      • pogruzovik.ru 24 апреля 2015 #

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

        • Миша 25 апреля 2015 #

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

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

  • Дмитрий 7 июня 2015 #

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

    • Миша 8 июня 2015 #

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

      • BUTAMUHbI4 17 августа 2015 #

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

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

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

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

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

          • Миша 26 сентября 2015 #

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

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

            • Светлана 26 сентября 2015 #

              Михаил, отправила на почту инфо.
              Заранее спасибо!

            • Vitalii 1 ноября 2019 #

              Привет! А решение нашли? У меня такая же проблема

              • Vitalii 1 ноября 2019 #

                нашел решение, я лично не посчитал нужным поставить в конец ссылки ".html", как реккомендует Михаил. После прописания /%category%/%postname%.html, всё заработало. Спасибо

                • Миша 2 ноября 2019 #

                  Привет!

                  Огнище! 🔥

  • Sergey 8 июня 2015 #

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

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

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

    • Миша 19 августа 2015 #

      Отлично, рад, что помог!

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

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

    • Миша 19 августа 2015 #

      Не совсем понял, какое решение ты предлагаешь)

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

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

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

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

  • Игорь 22 сентября 2015 #

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

    • Миша 23 сентября 2015 #

      Я не давал никаких советов с точкой.

  • Игорь 23 сентября 2015 #

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

    • Миша 23 сентября 2015 #

      Вы только код в htaccess вставили или сделали всё описанное в статье?

  • Юрий 27 сентября 2015 #

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

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

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

      • Юрий 28 сентября 2015 #

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

      • Юрий 28 сентября 2015 #

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

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

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

  • сергей 24 октября 2015 #

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

    • Миша 25 октября 2015 #

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

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

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

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

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

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

    • Миша 19 декабря 2015 #

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

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

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

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

        • Миша 19 декабря 2015 #

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

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

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

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

            Конкретно тут. Но к сожалению (возможно потому что, тему я не покупал, или там решения для более поздней версии) у меня нету указанной там папки с плагином и фаил этот я не нашел (/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 #

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

              /%postname%

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

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

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

  • St.eV 6 января 2016 #

    Всем привет!

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

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

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

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

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

  • Александр 15 декабря 2019 #

    Подскажите пожалуйста.
    У меня такой вид структуры хлебных крошек:

    Главная › Статьи › О психотерапии › Название статьи

    О психотерапии URL - /category/stati/o-psihoterapii/.

    С помощью вашей инструкции category убрал, а как еще убрать stati? (не спрашивайте зачем)

  • Тарас 25 февраля 2020 #

    Спасибо помог решить а то я уже костилы думал пилить)))!

  • Тимур 5 марта 2020 #

    Огромное спасибо автору, мне помог хук для functions.php . Вообще часто нахожу решения именно на данном сайте. Спасибо за труды!

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

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, в случае несоблюдения этого условия в 99% случаях ваш коммент будет удалён, а автор заблокирован. Печалька.