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