WordPress, хотим ли мы того или нет, поддерживает работу специальных лент, которые называются архивами.
Есть архивы по годам, месяцам и даже конкретным дням. Также поддерживаются ленты (архивы) по терминам таксономии (метки, теги, категории и т.п.). Есть специальные архивы по авторам.
В статье я покажу как можно отключить эти ленты программно, выдавая вместо них 404 ошибку.
Примеры авторского архива и его пейджера:
/author/admin/
/author/admin/page/10/
…
Примеры архивов по дате (и точно также с пейджером):
/2017/
/2017/02/
/2017/04/08/
Глазами поисковых машин
С точки зрения поисковых машин, архивы — это повторы лент одних и тех публикаций в разной компоновке. Они не очень полезны пользователям, т.к. не отвечают каким либо запросам. Яндекс, к примеру, явно не знает что делать с этой кучей страниц. Робот то берет их в выдачу, то уже через день выпихивает их от туда как малоинформативные, а ещё через день снова пускает их в выдачу.
У меня на главной странице есть длинная портянка ссылок на архивы по месяцам. Не думаю, что это нужный блок для пользователей, но я возлагаю на неё функционал как на html карту сайта.
Специальный фильтр pre_handle_404
Начиная с версии WP 4.5, был реализован специальный фильтр pre_handle_404. Он позволяет перенаправить программу даже при успешном выполнении внутреннего запроса wp-query в русло 404-й ошибки, если того требует логика сайта.
Прерывая в данном фильтре выполнение основной программы, нам придется самим настроить статус 404-й страницы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//отключение архивов по автору add_filter('pre_handle_404', 'myhook_disable_author_archive', 10, 2 ); //фильтр получает два параметра - флаг состояния и ссылку //на глобальный объект wp_query, к которому мы можем в //общем то получить доступ и сами function myhook_disable_author_archive( $flag, $wp_query ) { // если это авторский архив: if (is_author()) { //вернем 404ю страницу $wp_query->set_404(); status_header( 404 ); nocache_headers(); //сигнализируем об обработке статуса страницы вручную return true; } return $flag; } |
Некоторые проекты действительно могут нуждаться в авторских архивах, но не блог вроде моего, где все материалы создаёт один автор.
Архивы по датам отфильтровываются условиями:
1 |
if (is_day()) { ... // по дням |
1 |
if (is_month()) { ... // по месяцам |
1 |
if (is_year()) { ... // по годам |
Можно вообще отключить любые архивы (в том числе и создаваемые для таксономии):
1 |
if (is_archive()) { ... // любые архивы WP |