Прислал тут сеошник требования убрать неправильные ссылки на дубликаты страниц категорий товаров (не 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();
}

