WordPress как на ладони
rgbcode is looking for WordPress developers.

Как лучше удалить слово category из постоянной ссылки (УРЛа) в WordPress

Вообще не рекомендую удалять слово category из УРЛов WordPress, потому что это может вызвать проблемы, а практической пользы от этого нет. Но если по каким-то причинам решите это сделать, то надеюсь эта статья вам поможет.

Я не сторонник "танцев с бубном" над настройками ЧПУ (человеко-понятных УРЛ), поэтому в большинстве случаев отношусь к ним нейтрально - главное чтобы присутствовало название самой статьи (в транслитерации для кириллических названий). Считаю, что названия статьи, в целом, достаточно, чтобы сориентироваться по УРЛу куда он ведет. Кстати, практику переводить слова на английский тоже не поддерживаю, потому что английский знают далеко не все и такой (переведенный) УРЛ для многих будет не понятен.

Недавно очень нужно было убрать слово «category» из УРЛов на страницы категорий. УРЛы на страницы категорий обычно выглядят так:
/category/название-родительской-рубрики/название-дочерней-рубрики

Плагины

Тема удаления category из УРЛ далеко не нова и, как оказалось, уже давно избита на многих блогах и форумах. Уже существует несколько хороших плагинов для этого:

  1. No Category Base (WPML) удаляет базу category из постоянной ссылки ЧПУ рубрик.

  2. No category parents – плагин удаляет именно базу категорий, которая ставится в админке (она может быть отличной от «category»). Для его работы структура ЧПУ может быть любой. Говорят, плагин работает не всегда (наверное зависит от структуры ЧПУ). Плюс этого плагина - это установка 301 редиректа (нужен для поисковиков, когда слово category удаляется из уже рабочего сайта/блога).

  3. Remove Parents – Плагин работает только если структура ЧПУ начинается с тега %category%. Подход автора плагина мне не понравился - зачем-то там используются проверки через регулярные выражения, когда нужно всего-то удалить слово category. Впрочем, этот плагин удаляет не только слово category, но и родительские рубрики у УРЛ'ов постов (когда и где это действительно может понадобится не понял).

Мой вариант

Работает не корректно с версии 4.0

В общем, плагины мне не понравились, и вообще для такого дела, плагин – дело лишнее, поэтому я написал свой хак, чтобы удалить category из постоянной ссылки на страницы категорий в WordPress (всего одна строчка):

//Удаляем category из УРЛа категорий
add_filter( 'category_link', function($a){
	return str_replace( 'category/', '', $a );
}, 99 );

Эту строчку (код) нужно вставить в файл темы functions.php. Также нужно, чтобы структура ЧПУ начиналась с /%category%/ и нужно чтобы НЕ был установлен префикс категории в настройках постоянных ссылок в админке (см.картинку). Если префикс категорий уже установлен, то просто удалите его, но запомните этот префикс для установки редиректа (см. хак ниже)

Для любителей ретро: в старых версиях WP вставлял «category» еще и в УРЛы постов, чтобы удалить от туда это слово, воспользуйтесь такой строчкой:

add_filter( 'post_link', function($a){
	return str_replace( 'category/', '', $a );
}, 99 );

Удаляем category через .htaccess

Так же, есть еще один вариант с редактированием файла .htaccess. В этом файле нужно прописать перенаправление с 301 статусом, выглядет так ©:

RewriteRule ^(.*?/)category/(.+)$ $1$2 [R=301,L]

Важно понимать, что эту строчку нужно вставлять после включения модуля mod_rewrite и до перенаправления самого WordPress, т.е. ставить нужно так:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(.*?/)category/(.+)$ $1$2 [R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Однако такой способ не лишен недостатков, работает только если ЧПУ начинается с /%category%/ и WordPress будет создавать ссылки на категории по-прежнему со словом category, просто по нажатию на такую ссылку пользователя будет перекидывать на ссылку без category. Но думаю, этот вариант очень даже имеет место быть.

Дурной вариант

Как вариант, в версиях WordPress 3.0+ можно не использовать никакие хаки или плагины, а для удаления слова category в Префикс для рубрик вписать точку. Делается это в админ панели WordPress на странице Параметры->Постоянные ссылки (см. картинку). Правда эта точка будет в УРЛах в HTML коде, что, возможно, не есть хорошо, но работает вроде все правильно.

Хак 301 редиректа

Вот еще, сделал свой хак, чтобы перенаправлять старые страницы (со словом category) на новые. Редирект происходит со статусом 301 – указание на то что страница перемещена навсегда (нужно для поисковиков). По сути это как раз то, что делает вышеописанная строчка для .htaccess

function base_category_redirect(){
	$link = $_SERVER['REQUEST_URI'];

	if( strpos($link, 'category/')!==false ){
		$new_link = get_bloginfo('siteurl').str_replace('category/', '', $link);
		Header( "HTTP/1.1 301 Moved Permanently" );
		Header( "Location: $new_link" );
		exit();
	}
}
add_action('init', 'base_category_redirect', -10);

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

Кстати для тех, кто не знает, зачем вообще нужен префикс рубрик: нужен он для четкого определения типа страницы. Представим ситуацию, что мы убрали этот префикс и у нас есть постоянная страница с названием "Разное" (слаг которой будет - raznoe) и есть категория с таким же названием, тогда УРЛы категории и страницы будут одинаковыми и будут равны http://example.com/raznoe, что приведет к невозможности попасть на страницу категории, потому что по этому УРЛу будет открываться постоянная страница. С одной стороны это не хорошо, но с другой (о, эврика) этой особенностью можно очень удобно воспользоваться, для того чтобы заменить страницу категории на постоянную страницу. Иногда бывает нужно на странице категории не выводить, как обычно, записи или анонсы записей этой категории, а показать какой-либо текст. Думаю, логика понятна...

Основное из вышесказанного

Лучшим, на мой взгляд, вариантом убрать "слово" category будет размещение в файле темы function.php кода (работает только если ЧПУ начинается с /%category%/):

add_filter('category_link', function($a){
	return str_replace( 'category/', '', $a );
}, 99 );

Так же, если блог не новый и в индексе поисковика уже есть страницы с category, то, в добавок к коду, в .htaccess нужно добавить строчку редиректа:

RewriteRule ^(.*?/)category/(.+)$ $1$2 [R=301,L]

Если структура ЧПУ не использует тег %category% (не начинается с /%category%/), то используйте плагин WP No Category Base.

Если не понятно что-то спрашивайте, не стесняйтесь, комментарии же открыты smile

99 комментариев
Полезные 11 Все
    Войти