Буквально сегодня требовалось решить проблему некорректного canonical, при наличии на странице пагинации, используя произвольный запрос WP_Query. И вот что получилось.
Короткая суть (предыстория):
- в качестве главной страницы установлена статическая страница;
- в контент главной страницы вставлен шорткод, который выводит записи с заданной меткой/метками;
- для вывода таких записей используется произвольный запрос WP_Query();
- внизу списка записей выводится пагинация, с помощью функции paginate_links()
Проблема:
при переходе по ссылке в пагинации, например, на страницу 2 — «site.com/page/2/», в canonical было «site.com/2/», т.е. отсутствовало «page/». Ну а site.com/2/ ведет на 404 ошибку.
Решение:
Для решения проблемы был использован фильтр «get_canonical_url» и небольшая функция
add_filter('get_canonical_url', 'wpd_set_canonical', 9, 2); public function set_canonical($canonical_url, $post){ global $wp_query; if($wp_query->is_paged){ $canonical_url = get_permalink( $post ); if ( $post->ID === get_queried_object_id() ) { $page = get_query_var( 'page', 0 ); if ( $page >= 2 ) { if ( '' == get_option( 'permalink_structure' ) ) { $canonical_url = add_query_arg( 'page', $page, $canonical_url ); } else { $canonical_url = trailingslashit( $canonical_url ) . user_trailingslashit( 'page/' . $page, 'single_paged' ); } } } } return $canonical_url; }