WordPress как на ладони
rgbcode is looking for WordPress developers.

Дубли страниц категорий с 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 и проблема будет решена?

0
Сергей
3.4 года назад
  • 2

    Буквально недавно задавали похожий вопрос и в ответе был дан рабочий скрипт для ликвидации дублей
    https://wp-kama.ru/question/rubriki-dostupny-po-raznym-url-adresam

    Сергей 3.4 года назад

    Спасибо! Но там немного другая проблема. Думаете подойдет решение?

    Kama 3.4 года назад

    Как это другая проблема, именно то о чем ты написал - категория отдается по разным URL. Там я предложил 301 редирект на правильный URL.

    Сергей 3.4 года назад

    Все работает. Большое спасибо!

    Сергей 3.4 года назад

    Столкнулся с проблемой. После подключения кода в functions.php редирект происходит, но перестала работать навигация по страницам в категориях. При попытке открыть //site/category/android/page/2/ и т. д., страница просто обновляется и остается первая страница (//site/category/android/).

    Andrew 3.4 года назад

    Вам нужно добавить проверку is_paged() и если она true, то редиректить на соответствующую страницу архива.

    И лучше, наверное, переписать условие с использованием функции strpos()

    Сергей 3.4 года назад

    А как это интегрировать в код?

    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;
    	}
    
    }

    Не думаю, что только у меня данный код вызывает эту проблему.

    Сергей 3.4 года назад

    Проверил на другом сайте - такая же проблема.

    Andrew 3.4 года назад
    if( wp_make_link_relative( $term_url ) !== $parsed_url['path'] )
    //заменить на 
    if( strpos( $parsed_url['path'], wp_make_link_relative( $term_url ) ) === false )

    Здесь проверяется - есть ли вхождение относительной части ссылки на архив рубрики в обрабатываемом адресе и если нет, то формируется адрес редиректа.

    Этого должно хватить.

    Сергей 3.4 года назад

    Проверил, все работает как нужно. Спасибо!

    Kama 3.4 года назад

    Добавил исправленный вариант в оригинальный код. Спасибо Andrew.

    Виталий 1.6 года назад

    Не работает, что если первая половина url = term_url, strpos = 0, в итоге мы так и останемся на неверном адресе

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация