SEO issues
Every SEO issue, and the fix
Each check in the free SEO audit, explained, along with the Search Console statuses, sitemap errors and crawl problems an on-page audit cannot see: what triggers each one, how much it really matters, and how to fix it in WordPress.
On-page 15
- Duplicate title tags: when different pages introduce themselves identicallyTwo or more indexable pages on the site have exactly the same <title> text.
- Few internal links: how to add useful links without overdoing itThe page has only one or two unique links to URLs on its own hostname.
- Google shows a different snippet: why your meta description is not usedThe snippet Google shows under the page's result is taken from page text instead of the content of its meta description tag.
- Google shows a different title: why title tags get rewritten and how to reduce itThe title shown for the page in Google results differs from the text in its <title> element.
- Skipped heading levels: fixing a page with H3s but no H2The page contains H3 or H4 headings but no H2 headings at all.
- "Just another WordPress site" in your title: clearing the default taglineThe site's tagline is still the WordPress placeholder "Just another WordPress site", and it appears in the homepage title, feed or other output.
- Meta description too long: how to trim it so the point survivesThe page's meta description is longer than 160 characters.
- Meta description too short: when to expand it and what to addThe page has a meta description, but it is shorter than 120 characters.
- Missing H1 tag: why pages lose their main heading and how to fix itThe page's HTML contains no <h1> element.
- Missing meta description: what it costs and how to fix itThe page has no <meta name="description"> tag, or the tag's content is empty.
- Missing title tag: why it matters and how to fix it in WordPressThe page has no <title> element, or the <title> element is empty.
- Multiple H1 tags on one page: does it matter and how to fix itThe page's HTML contains more than one <h1> element.
- No internal links found: why the audit sees none and how to fix itThe page contains no links to URLs on the same hostname as the page itself.
- Title tag too long: how to shorten it without losing the pointThe page's <title> is longer than 60 characters.
- Title tag too short: when it matters and how to write a better oneThe page's <title> is present but shorter than 30 characters.
Content 2
Technical 17
- Broken links: how to find and fix them on a WordPress siteA link on your site points to a URL on your own site that returns a 404 Not Found error.
- Hreflang "no return tags": the alternate does not link backPage A lists page B as a language alternate with hreflang, but page B does not list page A in return, or lists a different URL for it.
- Hreflang points to a non-canonical URL: alternates that redirect, are noindexed or canonicalise elsewhereAn hreflang annotation names a URL that redirects, returns an error, is noindexed, or declares a different URL as its canonical.
- Internal links to redirected URLs: updating links that take a detourLinks on the site point at URLs that answer with a 301 or 302 instead of at the final destination.
- Invalid hreflang language code: en-UK, en_US and other values Google ignoresAn hreflang attribute contains a value that is not a valid language code or language-region pair, such as en-UK, en_US or a country code on its own.
- "Links are not crawlable": anchors without a real hrefThe page contains link-like elements Google cannot follow: <a> tags with no href, href="javascript:…", or navigation handled only by a click handler.
- Missing character encoding: stop garbled text with one meta tagThe page declares no character encoding in a <meta charset> tag or a <meta http-equiv="Content-Type"> tag.
- Missing DOCTYPE declaration: what quirks mode does and how to fix itThe page's HTML contains no <!DOCTYPE> declaration.
- Missing favicon: how to add a site icon in WordPressThe page's HTML has no <link rel="icon">, <link rel="shortcut icon"> or <link rel="apple-touch-icon"> tag.
- Missing viewport meta tag: why your page looks tiny on phonesThe page has no <meta name="viewport"> tag, or its content is empty.
- No HTTPS detected: how to move a WordPress site to HTTPS safelyThe audited page URL uses http:// instead of https://.
- Non-UTF-8 character encoding: when to switch and how to do it safelyThe page declares a character encoding, but it is something other than utf-8, such as ISO-8859-1 or Windows-1252.
- Too many URL parameters: when query strings cause SEO problemsThe page's URL (on any page other than the homepage) has a query string longer than 20 characters.
- Underscores in URLs: how much they matter and when to change themThe page's URL path (on any page other than the homepage) contains an underscore.
- URL lacks descriptive words: when a numeric URL is worth changingThe page's URL path, on any page other than the homepage, contains no run of three or more letters.
- www and non-www both resolve: one site answering at two addressesThe site returns 200 on both the www and non-www hostname (or on both http and https) instead of redirecting three of the four variants to one.
- "XML declaration allowed only at the start of the document": removing the stray output that breaks your sitemapThe sitemap or feed response contains whitespace, a byte-order mark or other output before the <?xml declaration, so XML parsers reject it.
Crawling & indexing 34
- Blocked by page removal tool: finding and cancelling the removal requestA temporary removal request filed in Search Console's Removals tool currently hides the URL from Google Search results.
- Blocked due to access forbidden (403): when your firewall turns Googlebot awayThe server or a security layer in front of it answered Googlebot's request with HTTP 403 Forbidden, so the page was not crawled.
- Blocked due to other 4xx issue: finding the status code behind the labelGooglebot received a 4xx client-error status for the URL that is not covered by the report's 401, 403 or 404 rows.
- Blocked due to unauthorized request (401): pages Googlebot cannot log in toThe server answered Googlebot's request with HTTP 401, asking for credentials, so the page could not be crawled or indexed.
- Canonical and noindex together: two instructions that cannot both be followedThe page carries a noindex directive and also a rel="canonical" tag pointing at a different URL.
- Canonical points to a redirect or a 404: a hint Google has to throw awayThe URL in the page's rel="canonical" tag does not return 200 as an indexable page: it redirects, returns 404 or 410, or is itself noindexed.
- Canonical points to the wrong domain: staging and old-domain URLs left in your head tagsThe page's rel="canonical" tag contains a different hostname from the one the page is served on, such as a staging, development or previous domain.
- Duplicate, Google chose different canonical than user: why your canonical was overruledA page declares a canonical URL, but Google judged a different URL to be the better representative of the same content and indexed that one instead.
- Duplicate XML sitemaps: when wp-sitemap.xml and a plugin sitemap are both liveThe site serves more than one XML sitemap covering the same content, typically WordPress core's /wp-sitemap.xml alongside a plugin's or a leftover static file.
- /feed/ URLs in Search Console: why WordPress feeds show as not indexedThe Page indexing report lists URLs ending in /feed/ under reasons such as Crawled - currently not indexed.
- Images not indexed by Google: why your pictures are missing from image searchImages on the site do not appear in Google Images, because Google cannot discover them in the HTML, cannot fetch the files, or has been told not to index them.
- Indexed, though blocked by robots.txt: which of the two fixes you needSearch Console's Page indexing report lists a URL as indexed even though a robots.txt Disallow rule stops Googlebot from fetching it.
- JavaScript content not indexed: text that exists in the browser but not in GoogleText or links are added to the page by JavaScript after load and do not appear in the HTML Google stores for the page.
- Missing canonical tag: when it matters and how to add oneThe page has no <link rel="canonical"> tag, or its href is empty.
- No robots.txt found: why WordPress may not be serving one and how to fix itRequesting /robots.txt on the site's domain does not return a 200 response.
- No XML sitemap found: how to create one in WordPress and get it foundNo valid XML sitemap was found at the URLs listed in robots.txt or at /sitemap.xml, /sitemap_index.xml or /wp-sitemap.xml.
- Multiple canonical tags: when a page names two different originalsThe page declares more than one canonical URL, through two link tags, a tag plus a Link HTTP header, or a tag added by JavaScript.
- Multiple robots meta tags: when two tags disagree, the stricter one winsThe page's HTML contains more than one robots meta tag (or a robots tag plus a crawler-specific one) with directives that differ.
- Noindex in robots.txt: a rule Google does not support, and what to use insteadrobots.txt contains a Noindex: line, which Google's parser does not support, so the URLs it names can still be indexed.
- Noindexed URLs in the sitemap: one page, two opposite instructionsA URL listed in the XML sitemap carries a noindex directive, in a robots meta tag or an X-Robots-Tag header.
- Page indexed without content: when Google stores the URL but not the pageSearch Console reports that the URL is in Google's index but Google could not read its content, for a reason other than a robots.txt block.
- Page set to noindex: how to find the setting and get indexed againThe page's <meta name="robots"> tag contains noindex.
- Paginated pages canonicalised to page one: how deeper posts and products get lostPages two and onward of an archive or listing carry a rel="canonical" tag pointing at the first page of the series.
- Redirect error: loops, long chains and broken Location headersGooglebot followed a redirect from the URL and never arrived at a page: the chain looped, ran too long, exceeded the URL length limit or contained an empty or invalid target.
- ?replytocom= URLs in Search Console: one extra address for every commentSearch Console lists URLs ending in ?replytocom= followed by a number, created by the Reply link under each comment on a WordPress post.
- robots.txt is blocking CSS and JavaScript: why Google renders your page wrongrobots.txt disallows directories that hold stylesheets, scripts or images the page needs, so Googlebot cannot load them when rendering.
- robots.txt syntax not understood: the lines Google skips and whyOne or more lines in robots.txt cannot be parsed as a valid rule, so crawlers ignore them and the file does not do what was intended.
- robots.txt unreachable: when a failing robots.txt pauses crawling of the whole siteGoogle's request for /robots.txt fails with a server error, timeout or connection problem, so it cannot confirm which URLs it is allowed to crawl.
- Server error (5xx): finding what broke when Googlebot asked for the pageGooglebot requested the URL and the server replied with a 500, 502, 503, 504 or another 5xx status, so the page was not indexed.
- Sitemap "Couldn't fetch": working out whether Google tried and failed, or has not tried yetSearch Console's Sitemaps report shows the status "Couldn't fetch" for a submitted sitemap URL.
- "Sitemap is HTML": the URL you submitted returns a web page, not XMLA Sitemap: URL listed in robots.txt returns something other than an XML sitemap, for example an HTML page.
- Staging site indexed in Google: getting the copy out and keeping it outPages on a staging, development or test hostname appear in Google results or in a Search Console property for that host.
- /wp-json/ URLs in Search Console: REST API endpoints Google found in your page headSearch Console's Page indexing report lists /wp-json/ URLs under Excluded by 'noindex' tag, Blocked due to unauthorized request (401) or similar reasons.
- Noindex in the X-Robots-Tag header: the directive view-source does not showThe server's HTTP response includes an X-Robots-Tag header containing noindex, so the URL is excluded from search even though its HTML has no noindex meta tag.
Structured data 9
- "Either 'name' or 'item.name' should be specified": a breadcrumb with no labelA ListItem in the page's BreadcrumbList structured data has neither a name property nor an item object containing a name.
- "Either 'offers', 'review', or 'aggregateRating' should be specified": completing your Product markupA page's Product structured data has a name but none of the three properties Google requires alongside it: offers, review or aggregateRating.
- FAQ rich results not showing: the feature was retired, and what your FAQ markup is for nowThe page has valid FAQPage structured data, but its Google result shows no expandable questions beneath it.
- Invalid structured data: fixing JSON-LD missing @context or @typeThe page has JSON-LD, but at least one block is missing a top-level @context or @type property.
- Missing field "shippingDetails" and "hasMerchantReturnPolicy": optional fields in merchant listingsA Product's offers markup has no shippingDetails or hasMerchantReturnPolicy property, which Google's Merchant listings report lists as non-critical issues.
- No structured data on the page: how to add schema markup in WordPressThe page has no JSON-LD structured data block (a <script type="application/ld+json"> element).
- "Review has multiple aggregate ratings": one item rated twice in your markupStructured data on the page gives a single reviewed item more than one aggregateRating, usually because two components each output rating markup.
- Review stars not showing in Google: eligibility rules behind missing rating snippetsThe page has review or aggregateRating structured data, but its Google result shows no star rating.
- Unparsable structured data: locating the character that breaks your JSON-LDA structured data block on the page has a syntax error, so Google cannot parse it and cannot tell which type of item it was meant to describe.
Performance 5
- Images without width and height: reserving space so the page does not jumpOne or more <img> elements have no width and height attributes, so the browser cannot reserve their space before the files download.
- LCP image lazy-loaded: when the hero image is told to waitThe image that forms the page's Largest Contentful Paint has loading="lazy" or is loaded by a lazy-load script, so the browser starts fetching it late.
- No lazy loading detected: how to lazy-load images without hurting LCPThe page has more than five images and none of them has a loading="lazy" attribute.
- HTML page size too large: finding what bloats your WordPress markupThe page's HTML is larger than 3,000 KB; over 2,000 KB is reported as an optimization and over 5,000 KB as critical.
- Slow server response time: finding what makes WordPress slow to respondThe page took more than 3 seconds to respond when the audit fetched it; 1 to 3 seconds is reported as an optimization.
Social 3
- Missing Open Graph tags: fixing blank or broken share previewsThe page is missing one or more of og:title, og:description and og:image.
- Missing social share image: making sure every shared link has a pictureThe page has neither an og:image nor a twitter:image tag; an og:image value shorter than 20 characters is reported as a warning.
- Missing X (Twitter) card tags: getting large image cards on XThe page has no <meta name="twitter:card"> tag.
Accessibility 2
- Images missing alt text: how to find and fix them in WordPressOne or more <img> elements have no alt attribute or an empty one; it becomes critical when more than half of the page's images are affected.
- Missing lang attribute on the HTML tag: why it matters and how to fix itThe page's <html> element has no lang attribute, or it is empty.