Меняем приоритет имен страниц в WordPress

11 апреля 2016 135

Меня уже неоднократно спрашивали, как победить конфликт URL между страницами и архивами типов данных (post type) в WordPress. Решение есть, о нем сегодня и поговорим.

Reg.ru: Регистрируем домены в любой зоне мира
Reg.ru: Регистрируем домены в любой зоне мира

Чтобы было проще понять о чем речь, возьмем конкретный случай.

Допустим, имеется сайт на WordPress, размещенный по адресу domain.local. На сайте имеется некая страница Книги, URL которой выглядит таким образом:

  • http://domain.local/books/

Теперь представим, что в какой-то момент времени на сайте появляется тип данных Книги, зарегистрированный как books. Неважно, последовательность появления может быть и другой. Смысл в том, что URL архива записей этого типа данных будет выглядеть так же как и ссылка на страницу о которой говорилось выше:

  • http://domain.local/books/

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

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

  • http://domain.local/books/book1.htm
  • http://domain.local/books/book2.htm

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

add_filter('page_rewrite_rules', 'wpse16902_collect_page_rewrite_rules');
function wpse16902_collect_page_rewrite_rules($page_rewrite_rules)
{
	$GLOBALS['wpse16902_page_rewrite_rules'] = $page_rewrite_rules;
	return array();
}

add_filter('rewrite_rules_array', 'wspe16902_prepend_page_rewrite_rules');
function wspe16902_prepend_page_rewrite_rules($rewrite_rules)
{
	return $GLOBALS['wpse16902_page_rewrite_rules'] + $rewrite_rules;
}

В заключении

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

Автор: Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе WordPress.

Комментарии

Разгоните свой WordPress

Хостинг-провайдер номер один в России — REG.RU

Подробнее