The site is ready, the texts are approved and all that is left is the launch. This is exactly when things that do not show on screen get missed, such as a forgotten box that tells search engines not to index the site. Technical SEO for WordPress is the list of those checks, and they decide whether Google finds your pages and how it shows them.
This guide goes through the checks in a convenient order. Each one comes with a place in WordPress or a command that shows the result, and there is a checklist for your developer at the end. Plugins such as Yoast SEO or Rank Math gather many of these settings in one place, but you do not need one. What matters is the result in the page's code, whatever tool produced it.
What technical SEO for WordPress checks
SEO is usually associated with texts and keywords. The technical side is a different job. It checks whether Google can crawl and index the pages and whether it understands which copy of each page is the main one. A good text on a page with noindex brings nothing, because Google will not show it.
Most checks are done once before the launch and again after big changes. You need the WordPress admin and a browser, and a few checks go faster with read-only commands that run on a Mac or Linux computer or in cPanel's Terminal. If you are ordering a new site, ask for these checks to be part of the handover. In our WordPress website development, technical SEO done the way Google asks is part of every project.
Turn search engine visibility back on
Under Settings, Reading there is a "Discourage search engines from indexing this site" box, used while a site is being built. Since version 5.3 it adds a robots tag with noindex and nofollow to every page, and while it is on, WordPress also switches the sitemap off. Untick it and save.
Then check the source of the home page and the HTTP headers of the response. Both commands only read.
# Mac, Linux or cPanel > Terminal. Read-only, they change nothing.
curl -s https://primer.bg/ | grep -io '<meta name=.robots.[^>]*>'
curl -sI https://primer.bg/ | grep -i '^x-robots-tag'
On a public site the first command usually shows max-image-preview:large, which WordPress has added since version 5.7 to allow large image previews in search results. If you see noindex, the box is still ticked or another plugin adds the tag. The second command usually prints nothing. If it shows noindex, the X-Robots-Tag HTTP header blocks indexing even when the page's code is clean.
Check robots.txt and the sitemap
The robots.txt file tells crawlers which parts of the site not to crawl. If there is no such file on the server, WordPress serves its own. Open /robots.txt in your browser. On a site without its own file you will see this.
# https://primer.bg/robots.txt, as WordPress serves it
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Sitemap: https://primer.bg/wp-sitemap.xml
If you see Disallow: /, crawling of the whole site is blocked. Such a line may be left over in a physical robots.txt file from the test copy. Do not block the theme's styles and scripts either, because without them Google has a harder time understanding the pages.
The sitemap is an XML file that lists the addresses you want Google to know. WordPress has made one on its own since version 5.5 at /wp-sitemap.xml, covering all public content types and taxonomies, such as pages and categories. Some SEO plugins switch it off and publish their own, as Yoast SEO has done since version 14.5, and then the address is in the plugin settings. Open the sitemap in your browser and check that it contains the pages and products you want in Google, and no test or empty pages.
Clean permalinks and canonical tags
Permalinks set the addresses of your pages. Under Settings, Permalinks, choose a structure where the address contains the page name, such as Post name, instead of Plain, where addresses look like ?p=123. Google advises using words in the address that are useful to people. Choose the structure before the launch, because changing it later changes every address and requires redirects.
The canonical tag tells Google which address is the main copy of a page. WordPress adds it on its own to every individual page of any content type, products included, but not to archives and categories, where the canonical comes from the theme or an SEO plugin. Open the source of a few pages and search for rel="canonical". The address should be complete, with https and the live domain, and point to the page itself.
Titles, meta descriptions and headings
The page title (the title element) is the main source of the title Google shows in the results. Google advises giving every page its own short, descriptive title, without boilerplate or keyword stuffing, and naming the site once, set off with a separator.
The meta description is the short text that may appear under the title in the results. WordPress core does not output one, so it comes from the theme or an SEO plugin. Google says the snippet is mostly built from the page content, and the meta description is used when it describes the page more accurately. So write a separate description for each important page, because identical descriptions across a site do not help.
Headings structure the text. A good habit is one H1 per page, its main title, with H2 and H3 below it in a logical order. Google says the order and number of headings do not matter for search, but a logical structure helps people using screen readers and anyone skimming. Also check that the theme does not turn the logo into an H1 on every page.
hreflang for a site in several languages
hreflang is a tag that tells Google a page has versions in other languages and gives the address of each. Google uses it to show visitors the version in their language. The rules are strict.
- Every language version lists itself and all the others.
- The links must be mutual. If two pages do not point to each other, Google ignores the tags.
- The language uses an ISO 639-1 code, such as bg or en, and a region, if any, follows it, as in en-GB.
- The addresses are complete, with https and the domain.
- The x-default value marks the page for visitors whose language is not listed.
WordPress core does not output hreflang, so the tags come from the multilingual plugin. After the launch, open the source of one page in each language. The <head> of both versions should contain the same set of tags, like this.
<!-- In the <head> of the Bulgarian and the English version -->
<link rel="alternate" hreflang="bg" href="https://primer.bg/za-nas/" />
<link rel="alternate" hreflang="en" href="https://primer.bg/en/about/" />
<link rel="alternate" hreflang="x-default" href="https://primer.bg/za-nas/" />
Structured data and Open Graph
Structured data describes the content in the language of search engines, and Google recommends the JSON-LD format. For most company sites and stores, three types make sense.
- Organization describes the company with its name, logo, address, phone and details such as the VAT number. Google recommends putting it on the home page or on the page about the company, and it has no required fields.
- BreadcrumbList describes the path to the page, for example Home, Category, Product. Google uses it in desktop results.
- Product in a store describes the product with its name, an image and an offer with price and currency, and availability is recommended.
Test one page of each type with the Rich Results Test. Google requires the data to describe content visitors can see, and it does not guarantee a rich result even when the code is valid.
Open Graph is a set of tags from which social networks take the title, description and image when someone shares a link to your site. The four required ones are og:title, og:type, og:image and og:url. Without them, the network decides on its own what to show. Before the first post, check how sharing looks with Facebook's Sharing Debugger.
HTTPS and a real 404 page
Every page should open over HTTPS, and http addresses should redirect to https with a 301. Google lists whether pages are served securely among its questions on page experience. Under Settings, General, both site addresses should start with https. If the browser warns about mixed content, see the guide to HTTPS and mixed content.
When an address does not exist, the server should return a 404 code. If it returns 200 with a "Page not found" message, Google may treat it as a soft 404, and Search Console recommends a 404 code for pages that are truly gone. A good 404 page returns the right code and helps visitors with a search box and links to the main sections.
Both checks work with read-only commands.
# Mac, Linux or cPanel > Terminal. Read-only, they change nothing.
curl -s -o /dev/null -w '%{http_code}\n' https://primer.bg/no-such-page/
curl -sI http://primer.bg/ | grep -i '^location'
The first should return 404, and the second should show an address starting with https. If you are changing the addresses of an existing site, redirect every old address with a 301, as described in how to redesign a website without losing Google rankings.
Speed, Core Web Vitals and the mobile version
Google uses the mobile version of a site to index and rank it. That is why it needs the same content, structured data, titles and meta descriptions as the desktop version. Open the site on a phone and check that the menu and the forms work and that the text is not cut down.
Core Web Vitals are Google's three metrics for page experience. Good values are an LCP of up to 2.5 seconds, an INP of up to 200 milliseconds and a CLS of up to 0.1, measured at the 75th percentile of page loads. Google says its ranking systems use Core Web Vitals, and also that search shows the most relevant content even when the page experience is weaker. Speed helps, then, but it does not replace useful content. How to measure it is covered in the guide to PageSpeed Insights.
Images and internal links
Alt text describes an image in a few words. Google uses it together with image analysis and the surrounding text, and people with screen readers hear it in place of the image. Be specific, for example "red ceramic mug 350 ml", without stuffing keywords, because Google may treat that as spam. File names help too, so red-ceramic-mug.jpg is better than IMG00023.JPG.
Internal links lead Google from page to page. Google reliably crawls links built as an <a> element with an href attribute, so menus that work only through JavaScript may stay unknown to it. Every page that matters to you should have at least one link from another page on the site, and the link text should say where it goes. "Click here" tells Google nothing.
Search Console on launch day
Search Console is Google's free tool for seeing how your site performs in search. Add the site as a Domain property. It covers all subdomains and protocols and is verified with a DNS record. If you have no access to DNS, a URL prefix property can be verified in other ways, but it covers only one protocol and one subdomain.
Then do the following.
- Submit the sitemap address in the Sitemaps report. Google says this is a hint and does not guarantee crawling.
- In URL Inspection, check the home page and ask for indexing with Request indexing.
- After a few days, open the Pages report and see why some pages are not indexed. Look for noindex, blocking by robots.txt and 404s.
- If the site has structured data, review the rich result reports, because a theme or plugin update can break the data.
Data in Search Console usually appears within a few days.
Checklist
- The "Discourage search engines from indexing this site" box is unticked, and there is no noindex in the code or the HTTP headers.
- robots.txt does not block the site or the theme's resources, and it points to the sitemap.
- The sitemap opens and lists only the pages you want in Google.
- Permalinks contain words, with no addresses like
?p=123. - The canonical on every page is a complete https address pointing to the page itself.
- Every important page has its own title, meta description and a single H1.
- A multilingual site has mutual hreflang tags and x-default.
- Organization, BreadcrumbList and, for a store, Product pass the Rich Results Test, and sharing shows the right title and image.
- Every address is on https, http redirects with a 301, and an address that does not exist returns 404.
- Core Web Vitals are measured, and the site is checked on a phone.
- Images have descriptive alt text, and every important page has at least one internal link to it.
- The site is added to Search Console and the sitemap is submitted.
Do you have to check all of this yourself?
If your site is already live and Search Console shows no indexing problems, there is no need to go through the whole list again. Come back to it when you change the theme, the SEO plugin or the addresses.
In our website and online store development, technical SEO done the way Google asks is part of every project. Clean addresses, meta descriptions, structured data, the sitemap and hreflang are ready at the handover, and in a rebuild the old addresses redirect to the new ones. If you are replacing a site that already ranks, also read how to redesign a website without losing Google rankings.
Frequently asked questions
What is technical SEO for WordPress?
It is the set of checks on whether Google can crawl and index the site's pages and whether it understands which copy of each page is the main one. A good text on a page with noindex brings nothing, because Google will not show it. Most checks are done once before launch and again after big changes.
Why is Google not indexing my new WordPress site?
Often the cause is the forgotten "Discourage search engines from indexing this site" box under Settings, Reading, which since version 5.3 adds a noindex and nofollow robots tag to every page and switches off the sitemap. Another cause can be a Disallow: / line in robots.txt left over from the test copy, or an X-Robots-Tag HTTP header with noindex. Check the home page source and the response headers.
Where is my WordPress site's sitemap?
Since version 5.5 WordPress has made a sitemap on its own at /wp-sitemap.xml, covering all public content types and taxonomies such as pages and categories. Some SEO plugins switch it off and publish their own, as Yoast SEO has done since version 14.5, and then the address is in the plugin settings. Open the sitemap in your browser and check that it contains the pages and products you want in Google and no test or empty pages.
Which permalink structure should I choose in WordPress?
Under Settings, Permalinks choose a structure where the address contains the page name, such as Post name, rather than Plain with addresses like ?p=123. Google advises using words in the address that are useful to people. Choose the structure before launch, because changing it later changes every address and requires redirects.
Does WordPress add a meta description to pages by itself?
No. WordPress core does not output a meta description, so it comes from the theme or an SEO plugin. Google says the search snippet is mostly built from the page content, and the meta description is used when it describes the page more accurately. So write a separate description for each important page.
What are the hreflang rules for a site in several languages?
Every language version lists itself and all the others with complete https addresses, and the links must be mutual, or Google ignores the tags. The language uses an ISO 639-1 code such as bg or en, and the x-default value marks the page for visitors whose language is not listed. WordPress core does not output hreflang, so the tags come from the multilingual plugin.
What structured data should my site have?
For most company sites and stores three types make sense, in the JSON-LD format Google recommends. Organization describes the company with its name, logo, address and phone, BreadcrumbList describes the path to the page, and Product in a store describes the product with a name, an image and an offer with price and currency. Test one page of each type with the Rich Results Test, keeping in mind that Google does not guarantee a rich result even when the code is valid.
What code should a page that does not exist return?
A 404 code. If the server returns 200 with a "Page not found" message, Google may treat it as a soft 404, and Search Console recommends a 404 code for pages that are truly gone. A good 404 page returns the right code and helps visitors with a search box and links to the main sections.
Sources
- WordPress, Settings Reading screen
- WordPress Core, Changes to prevent search engines indexing sites (5.3)
- WordPress Core, Robots API and max-image-preview directive in WordPress 5.7
- WordPress Core, New XML sitemaps functionality in WordPress 5.5
- WordPress, do_robots() and WP_Sitemaps::add_robots()
- WordPress, rel_canonical()
- WordPress, Settings Permalinks screen
- WordPress, default-filters.php (the wp_head actions)
- Yoast, Yoast SEO 14.5 changelog
- Google, SEO Starter Guide
- Google, Block search indexing with noindex
- Google, Introduction to robots.txt
- Google, Build and submit a sitemap
- Google, Influencing title links
- Google, How to write meta descriptions
- Google, Localized versions of your pages
- Google, Intro to structured data and General structured data guidelines
- Google, Organization, Breadcrumb and Merchant listing
- The Open Graph protocol
- Google, Understanding page experience
- Google, How HTTP status codes affect Google's crawlers
- Search Console Help, Page indexing report
- Google, Mobile-first indexing best practices
- web.dev, Web Vitals
- Google, Image SEO best practices
- Google, Link best practices
- Search Console Help, Add a website property