Отключаем link-ссылки на категории и отдаём 404-ую

Прислал тут сеошник требования убрать неправильные ссылки на дубликаты страниц категорий товаров (не WooCommerce) и удалить сами страницы (возвращать 404).

Более 400-х ссылок в Excel-файле вот такого вида:

https://сайт/catalog/cat_name/page/10/

По условиям логики представления на сайте — на страницах родительских категорий с подкатегориями внутри не должны выводиться товары и соотв. не должно быть пагинации.

Для начала я нашёл их эти ссылки — они были в тегах:

<link rel="next" href="https://mysite.ru/catalog/cat_name/page/2/" />

Так как на сайте установлен Yoast SEO — именно он эти ссылки и создавал — потому отключаем в коде:

add_filter( 'wpseo_next_rel_link', '__return_false' );
add_filter( 'wpseo_prev_rel_link', '__return_false' );

Далее можно поработать с логикой шаблона категории, но в моём случае было проще написать выдачу 404-ой для страниц пагинации родительских категорий — не самое красивое решение — но оно временное, после переиндексации можно будет вырубить этот функционал:

add_action( 'template_redirect', function() {

    if ( is_tax('cats') and get_query_var('paged') ) {

        $_cat_id = get_queried_object();

        if ($_cat_id->term_id) {

            $_sub_categories = get_categories(array(
                'taxonomy' => 'cats',
                'hide_empty' => 0,
                'hierarchical' => false,
                'orderby' => 'ID',
                'parent' => $_cat_id->term_id,
            ));

            if ( count($_sub_categories) > 0 ) {
                global $wp_query;
                $wp_query->set_404();
                status_header( 404 );
                get_template_part( 404 );
                exit();
            }
        }
    }
});

Ну и наконец нужно было всё это проверить и сделать это как-то автоматизировано:

function __request($url)
{
	$ch = curl_init($url); 
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	$response = curl_exec($ch);
	$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	curl_close($ch);
	return array($httpCode, $response);
}

set_time_limit(0);

// 404.csv - файл с ссылками от SEO-шника, где во втором столбце ($data[1]) URL-адрес страницы которую нужно удалить (404), а в 5-ом столбце ($data[4]) URL-адрес страницы, где была найдена эта ссылка на ненужную страницу
$handle = fopen("404.csv", "r");
while (($data = fgetcsv($handle, 2000, ';')) !== FALSE) {  
	$_request = __request($data[1]);
	$i++;
	echo "$i. <a target=\"_blank\" href=\"{$data[1]}\">{$data[1]}</a> > " . $_request[0] . " ( target: <a target=\"_blank\" href=\"{$data[4]}\">{$data[4]}</a> > ";
	$_request = __request($data[4]);
	if ( preg_match("|{$data[1]}|is", $_request[1], $buff) ) {
		// если URL-адрес на нежную страницу найден!
		echo 'YES!';
	} else {
		echo 'none';
	}
	echo ' )<br>';
	flush();
}

 

ПОДЕЛИТЬСЯ

Программист, преподаватель, консультант.
Активный фрилансер и тех. директор студии AVGroup.
Фанат WordPress'а, а также всего - что даёт скорость в веб-разработке.