Як краще видалити слово категорії з постійного посилання (УРЛу) в WordPress

Взагалі не рекомендую видаляти слово категорії з УРЛів WordPress, тому що це може викликати проблеми, а практичної користі від цього немає. Але якщо з якихось причин вирішите це зробити, то я сподіваюся ця стаття вам допоможе.

Сторінка адмінки WordPress - постійні посилання

Я не прихильник “танців з бубном” над налаштуваннями ЧПУ (людино-зрозумілих УРЛ), тому здебільшого ставлюся до них нейтрально – головне щоб була назва самої статті (у транслітерації для кириличних назв). Вважаю, що назви статті загалом достатньо, щоб зорієнтуватися по УРЛу куди він веде. До речі, практику перекладати слова англійською теж не підтримую, тому що англійську знають далеко не всі і така (перекладена) УРЛ для багатьох буде не зрозуміла.

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

Плагіни

Тема видалення категорії з УРЛ далеко не нова і, як виявилося, вже давно побита на багатьох блогах та форумах. Вже існує кілька хороших плагінів для цього:

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

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

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

Мій варіант

Працює неправильно з версії 4.0

Загалом, плагіни мені не сподобалися, і взагалі для такої справи, плагін – справа зайва, тому я написав свій хак, щоб видалити категорію з постійного посилання на сторінки категорій у WordPress (всього один рядок):

//Видаляємо категорії з УРЛу категорій
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);

Видаляємо категорії через .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+ можна не використовувати жодні хакі або плагіни, а для видалення слова категорії в Префікс для рубрик вписати крапку. Робиться це в адмін панелі 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);

Якщо ви встановлювали префікс для категорій адмінки, то в коді потрібно вказати цей префікс.

До речі, для тих, хто не знає, навіщо взагалі потрібен префікс рубрик: потрібен він для чіткого визначення типу сторінки. Уявимо ситуацію, що ми прибрали цей префікс і у нас є постійна сторінка з назвою “Різне” (склад якої буде – разное) і є категорія з такою ж назвою, тоді УРЛи категорії та сторінки будуть однаковими і дорівнюють http://example. com/разное, що призведе до неможливості потрапити на сторінку категорії, тому що по цьому УРЛ відкриватиметься постійна сторінка. З одного боку це не добре, але з іншого (о, еврика) цією особливістю можна дуже зручно скористатися, щоб замінити сторінку категорії на постійну сторінку. Іноді буває потрібно на сторінці категорії не виводити, як завжди, записи чи анонси записів цієї категорії, а показати якийсь текст. Думаю, логіка зрозуміла…

Основне з вищесказаного

Кращим, на мій погляд, варіантом прибрати “слово” 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

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *