Indexing and technical SEO guide
WordPress Pagination SEO: Reachable Pages and Correct Canonicals
Give page 2 and later of each archive its own canonical, link every page with a plain anchor, and make out-of-range pages return 404. Then check the whole sequence.
On this page
Treat each numbered page of an archive as its own page. Page 2 should print a canonical naming page 2, not page 1, and every page should link to the next with an ordinary <a href> link that works without JavaScript. Pages past the end of the sequence should return 404, not an empty archive with a 200. Those three checks are the core of a pagination review on a WordPress site.
Google’s pagination guidance, checked September 27, 2026, says to link each page to the following page with <a href> tags, not to use the first page as the canonical for the sequence, and to give each page its own canonical URL. It also says Google no longer uses rel="prev" and rel="next", though other search engines may, and that Google ignores URL fragments, so page numbers must not live after a #.
Map the page URLs and next-page links
WordPress paginates several kinds of list, each with its own URL shape. With pretty permalinks on, the common ones are:
| List | Page 2 URL | Controlled by |
|---|---|---|
| Blog home or posts page | /page/2/ or /blog/page/2/ |
Settings, Reading, Blog pages show at most |
| Category, tag, author, date archive | /category/pruning/page/2/ |
The same setting, unless a theme or plugin changes it |
| Custom post type archive | /projects/page/2/ |
The same setting, unless a theme or plugin changes it |
| A post split with the Page Break block | /long-guide/2/ |
The post content |
| Comments split into pages | /long-guide/comment-page-2/ |
Settings, Discussion |
With plain permalinks, archive pages use ?paged=2 instead. The number of posts per page comes from Blog pages show at most, which the WordPress Reading settings documentation, checked September 27, 2026, describes as the number of posts displayed per page on your site.
Pick one archive with enough posts to reach at least three pages. On a small site, lower Blog pages show at most on a staging copy so page 2 and page 3 exist. Then list what each page links to:
BASE="https://garden.example/category/pruning"
for n in 1 2 3; do
if [ "$n" = 1 ]; then u="$BASE/"; else u="$BASE/page/$n/"; fi
echo "== $u"
curl -s "$u" | grep -o '<a [^>]*href="[^"]*/page/[0-9]*/[^"]*"' | sort -u
done
The address is illustrative. Each page should contain a plain link to the next page. If page 1 shows no /page/2/ link, the theme may be using a load-more button or infinite scroll that only JavaScript can follow. Google’s pagination guidance says its crawlers do not click buttons and generally do not trigger JavaScript functions that require a user action, so posts that appear only after a click can be hard to discover unless another crawlable path, such as ordinary pagination links or the sitemap, reaches them.
Inspect each page’s content and canonical
For each page in the sequence, check the status, the canonical, the robots directives, and the posts listed:
for n in 1 2 3; do
if [ "$n" = 1 ]; then u="$BASE/"; else u="$BASE/page/$n/"; fi
echo "== $u"
curl -sI "$u" | grep -iE '^HTTP|x-robots-tag'
curl -s "$u" | grep -ioE '<link[^>]*rel=.(canonical|prev|next).[^>]*>|<meta[^>]*name=.robots.[^>]*>|<title>[^<]*</title>'
done
The . before and after the rel value and robots matches either quote mark, because WordPress core prints its robots meta tag with single quotes (<meta name='robots' ...>), as the wp_robots() function in wp-includes/robots-template.php shows, checked September 27, 2026.
Read the output against these expectations:
| Check | Expected | Problem if |
|---|---|---|
| Status | 200 on every real page |
A redirect from page 2 to page 1 hides the older posts |
| Canonical | Each page names itself | Page 2 names page 1, claiming to duplicate it |
| Robots | Matches your policy for paginated pages | An unintended noindex on page 1 |
| Title | Distinguishable, for visitors | Not required by Google, but helpful in tabs and bookmarks |
| Posts | Different posts on each page | Page 2 repeats page 1, often a custom query ignoring the page number |
Google’s pagination guidance says pages in a sequence can use the same titles and descriptions, so a repeated title is not a fault. A page number in the title still helps a visitor with several tabs open.
The last row catches a theme bug worth checking for: a custom query in a template that ignores the paged query variable, so every numbered page shows the first set of posts. Compare the first post title on each page to spot it.
WP Visibility 2.10.3 prints a self-referencing canonical on each page of a paginated blog, category, tag, author, or post type archive, adds the separator and a page label such as “Page 2” to archive titles from page 2 on, and prints rel="prev" and rel="next" links for search engines other than Google that may read them. A page set to noindex prints no canonical, and date archives print none at all. A custom canonical saved on the posts page, or imported onto a category or tag from another SEO plugin, is printed on every page of that archive, so check page 2 if one exists. The title behavior is described in Set Title and Description Templates.
Decide whether page 2 and later should be indexable
Leaving numbered archive pages indexable, each with its own canonical, matches Google’s pagination guidance, and those pages are one of the paths crawlers use to reach older posts. Some site owners prefer to keep page 2 and later out of search while leaving page 1 indexed. If you do that:
- use
noindex, follow, not a canonical to page 1, so the page is excluded without claiming it duplicates page 1; - do not block the paginated path in robots.txt, because a blocked page cannot be crawled for its links or its directive; Google’s noindex documentation, checked September 27, 2026, says a crawler blocked by robots.txt never sees the
noindexrule; - make sure the posts listed deeper in the sequence are reachable some other way too, such as the sitemap or related links.
Google’s guidance mentions noindex and robots.txt for unwanted URLs such as filter and sort variations of a list, which is a different situation from the plain numbered pages of an archive.
In WP Visibility, the Indexing section has a Noindex paginated archive pages switch, off by default, which adds noindex to page 2 and later while page 1 keeps its own setting. It does not change an archive whose own Search engine indexing setting is Index or Noindex, such as a category or the posts page; that setting applies to every page of the archive. Keep a Page Out of Search lists the related archive switches. Whole archive types are covered in should categories, tags, and author archives be indexed.
Test final, empty, and invalid pages
The end of a sequence is where errors hide. Test three cases:
# The last real page, one past it, and a nonsense page number
for u in "$BASE/page/3/" "$BASE/page/4/" "$BASE/page/999/"; do
printf '%s ' "$u"; curl -s -o /dev/null -w '%{http_code}\n' "$u"
done
Adjust the numbers to your archive. What each result means:
- Last real page returns
200with posts and no next link. Correct. - One past the end returns
404. Correct. There is nothing on that page. - One past the end returns
200with an empty list or “no posts found”. A soft 404: Google’s HTTP status code documentation, checked September 27, 2026, says Search Console reports one when a successful response is an empty page or suggests an error. Look for a theme or plugin that overrides the not-found handling, or a custom query that does not report the true number of pages. - Any page redirects to page 1 or the home page. Something is redirecting deliberately. Find the rule; redirecting deep pages can cut crawlers off from older posts.
Also test an archive with a parameter added, such as $BASE/page/2/?utm_source=test, and check whether the canonical keeps or drops the parameter. WP Visibility 2.10.3 drops it on page 1 but keeps it on page 2 and later, because those canonicals are built with WordPress’s get_pagenum_link(), whose source, checked September 27, 2026, carries the request’s query string over. The tracking parameters guide explains what the canonical should name.
Recheck after theme and plugin changes
Pagination depends on the theme’s templates and any plugin that alters archive queries, so a theme update can change it without any SEO setting moving. Keep a short record of the archive you tested, the number of pages, and the results, and rerun the three commands above after changes to the theme, Blog pages show at most, or permalink settings.
A final checklist for each paginated archive type:
- every page links to the next with a plain
<a href>; - each page prints its own canonical, or
noindexwithout a canonical if you chose that policy; - each page lists different posts;
- the page after the last one returns
404; - page numbers never appear only after a
#.
For the broader audit sequence these checks fit into, see the technical audit chapter of the field guide.
