Канонический URL через Yoast SEO на первую страницу со страниц пагинации

17.11.2021

Если вам требуется всегда указывать тег rel="canonical" на первую страницу пагинации в категориях и архивах, то есть:
<link rel="canonical" href="https://website.ytcolor.ru/articles/" />

вместо
<link rel="canonical" href="https://website.ytcolor.ru/articles/page/2" />
с установленным плагином yoast seo, то просто вставьте в файл functions.php вашей темы данный фильтр:

//canonical url first page

add_filter('wpseo_canonical', 'my_wpseo_canonical');
function my_wpseo_canonical($canonical) {
    if (is_paged()) {
        if (is_home()) {
            return home_url();
        }

        if (is_archive()) {
            $url = get_term_link(get_queried_object_id());
            return $url;
        }        
    }
    return $canonical;
}

Произвольный тип записи и его Архив

На случай, если нужно также применить canonical и для страниц архивов произвольного типа записи (custom post type):

//canonical url first page with custom post type

add_filter('wpseo_canonical', 'my_wpseo_canonical');
function my_wpseo_canonical($canonical) {
    if (is_paged()) {
        if (is_home()) {
            return home_url();
        }

        if (is_category()) {
            $url = get_term_link(get_queried_object_id());
            return $url;
        }
        elseif (is_post_type_archive('portfolio')) {
            $url = home_url() . '/portfolio/';
            return $url;
        }

    }

    return $canonical;
}

Тут немного нужно разъяснений.

Допустим, ваш произвольный тип записи имеет slug portfolio, а страница архива включена с помощью 'has_archive' => true, то она не будет иметь фактической привязки к чему либо и не будет иметь id идентификатора в базе данных, записи в архивах выводятся благодаря стандартному файлу archive.php, следовательно get_queried_object_id возвращает 0. В этом случае, вручную указываем URL /portfolio/ (или же иное, если изменяли слаг через rewrite)

is_archive() заменяем на is_category(), а для определения custom post type используем is_post_type_archive($post_types)

Данный код актуален и для мультиязычности polylang.