Дубли страниц категорий с category и без в WordPress
Сайт с установленным плагином All In One SEO 3.7.1 (пока не обновлялся до версии 4.0, какая-то она странная).
Заметил, что страница категории доступна по двум ссылкам:
//site/category/android/
//site/android/
В коде обеих страниц прописан canonical на //site/category/android/
Яндекс периодически индексирует страницы типа //site/android/ и затем выкидывает их из индекса как неканонические.
Поддержка Яндекса рекомендует настроить 301 редирект с //site/android/ на //site/category/android/.
Подскажите, пожалуйста, как это грамотно сделать? Или лучше на страницах //site/android/ отдавать 404 ошибку?
В настройках All In One SEO ничего такого не нашел. Может есть смысла обновиться до 4 версии или перейти на Yoast SEO и проблема будет решена?
Буквально недавно задавали похожий вопрос и в ответе был дан рабочий скрипт для ликвидации дублей
https://wp-kama.ru/question/rubriki-dostupny-po-raznym-url-adresam
Спасибо! Но там немного другая проблема. Думаете подойдет решение?
Как это другая проблема, именно то о чем ты написал - категория отдается по разным URL. Там я предложил 301 редирект на правильный URL.
Все работает. Большое спасибо!
Столкнулся с проблемой. После подключения кода в functions.php редирект происходит, но перестала работать навигация по страницам в категориях. При попытке открыть
//site/category/android/page/2/и т. д., страница просто обновляется и остается первая страница (//site/category/android/).Вам нужно добавить проверку is_paged() и если она true, то редиректить на соответствующую страницу архива.
И лучше, наверное, переписать условие с использованием функции strpos()
А как это интегрировать в код?
add_action( 'template_redirect', 'check_301redirect_tax_url', 9 ); function check_301redirect_tax_url(){ // not taxonomy if( ! ( is_category() || is_tag() || is_tax() ) ) return; $qo = get_queried_object(); $term_url = get_term_link( $qo ); $parsed_url = parse_url( $_SERVER['REQUEST_URI'] ); if( wp_make_link_relative( $term_url ) !== $parsed_url['path'] ){ $redirect_to = isset( $parsed_url['query'] ) ? "$term_url?{$parsed_url['query']}" : $term_url; wp_redirect( $redirect_to, 301 ); exit; } }Не думаю, что только у меня данный код вызывает эту проблему.
Проверил на другом сайте - такая же проблема.
Здесь проверяется - есть ли вхождение относительной части ссылки на архив рубрики в обрабатываемом адресе и если нет, то формируется адрес редиректа.
Этого должно хватить.
Проверил, все работает как нужно. Спасибо!
Добавил исправленный вариант в оригинальный код. Спасибо Andrew.
Не работает, что если первая половина url = term_url, strpos = 0, в итоге мы так и останемся на неверном адресе