Как удалить слово «категория» из URL в WordPress: лучшие практики

Как лучше удалить слово «категория» из постоянной ссылки (URL) в WordPress

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

Введение

Я не приверженец изменений в настройках «ЧПУ» (человеко-понятные URL), поэтому в большинстве случаев я нейтрально отношусь к ним. Главное, чтобы в URL присутствовал заголовок статьи. Я считаю, что заголовков вполне достаточно, чтобы понять, куда ведет ссылка. Также я против перевода слов на английский, поскольку не все знают этот язык, и такие (переведенные) ссылки будут непонятны многим пользователям.

Недавно мне понадобилось удалить слово «категория» из URL страниц категорий. URL для страниц категорий обычно выглядит так:

/category/parent-category-name/child-category-name

Плагины

Тема удаления категории из URL не нова, и, как оказалось, давно обсуждается на многих блогах и форумах. Существуют несколько хороших плагинов для этой цели:

  1. No Category Base (WPML) — удаляет базу категории из постоянных ссылок категорий.

  2. No Category Parents — удаляет базу категории, установленную в админ-панели (она может отличаться от «категория»). Плагин может не всегда работать (возможно, всё зависит от структуры URL). Преимущество этого плагина в том, что он устанавливает перенаправление 301 (нужно для поисковых систем, когда слово «категория» удаляется из уже существующего сайта/блога).

  3. Remove Parents — работает только если структура URL начинается с тега %category%. Мне не понравился подход автора плагина — они используют регулярные выражения, когда все, что нужно, это просто удалить слово «категория». Тем не менее, этот плагин не только удаляет слово «категория», но и родительские категории из URL постов (что может быть необходимо в определенных случаях).

Мое решение

Плагины мне не понравились, и для такой задачи они не нужны. Поэтому я написал свой код, чтобы удалить «категория» из постоянных ссылок страниц категорий в WordPress (это всего лишь одна строка):

// Удалить категорию из URL категории
add_filter( 'category_link', function($a){
return str_replace( 'category/', '', $a );
}, 99 );

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

Для тех, кто предпочитает старый стиль: в старых версиях WP я также вставлял «категория» в URL постов. Чтобы удалить это слово там, используйте следующую строку:

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

Удаление категории через .htaccess

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

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

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


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

BEGIN WordPress


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

END WordPress

Не вставляйте это правило между WP правилами BEGIN WordPress ... # END WordPress, так как оно будет удалено в какой-то момент при регенерации правил htaccess. Однако у этого метода есть свои недостатки. Он работает только если структура URL начинается с /%category%/, и WordPress все равно будет создавать ссылки категорий со словом «категория», просто перенаправляя пользователя на ссылку без «категория» при нажатии на такую ссылку. Но я думаю, что этот вариант все же очень жизнеспособен.

Плохой вариант

В версиях WordPress 3.0 и выше вы можете избежать использования любых хаков или плагинов и просто вставить точку в поле «База категории». Это можно сделать в админ-панели WordPress на странице Настройки > Постоянные ссылки. Однако эта точка будет присутствовать в URL в HTML-коде, что может быть не идеально, но, похоже, это работает корректно.

Хак для перенаправления 301

Дополнительно я создал хак для перенаправления старых страниц (с словом «категория») на новые. Перенаправление выполняется со статусом 301 — это указание, что страница была перемещена навсегда (нужно для поисковых систем). Это по сути то, что делает упомянутая строка для .htaccess.

add_action( 'init', 'base_category_redirect', -10 );

function base_category_redirect() {
$uri = $_SERVER['REQUEST_URI'];
$cat_prefix = 'category';

if( strpos( $uri, "/$cat_prefix/" ) !== false ){
    $new_url = home_url( str_replace( "/$cat_prefix/", '/', $uri ) );
    wp_redirect( $new_url, 301, 'category_redirect' );
    exit;
}

}

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

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

Подведение итогов

На мой взгляд, лучший вариант для удаления слова «категория» — это вставить следующий код в файл functions.php вашей темы (работает только если структура URL начинается с /%category%/):

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

Также, если ваш блог не новый и поисковые системы уже индексируют страницы с «категория», то помимо кода, нужно добавить строку перенаправления в .htaccess:

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

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

Если что-то остается непонятным, не стесняйтесь задавать вопросы, комментарии открыты!

Leave a Reply

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