Blog

  • How to set up htaccess 301 redirects in WordPress

    Key takeaways

    • Nginx doesn’t read .htaccess. Kinsta sites have no .htaccess file and WP Engine has deprecated it, so on hosts like these a correct rule does nothing and shows no error.
    • Put custom RewriteRule redirects above # BEGIN WordPress, never inside it. WordPress rewrites that block whenever Settings > Permalinks is saved.
    • Test with R=302 and curl before you switch to 301, because browsers cache 301s. Google follows up to 10 hops but advises ideally three or fewer.
    • Most ‘too many redirects’ errors happen because two layers, such as WordPress settings, .htaccess, an SSL plugin or a CDN, both enforce HTTPS or www.
    • If the site returns a 500 after an edit, rename the file to .htaccess_old, load the site, then save Settings > Permalinks to rebuild the default rules.

    You changed a URL, and now the old one returns a 404. Bookmarks, backlinks and Google’s index all still point to the old address. A 301 redirect in .htaccess tells the server to send every request for the old address to the new one, and it tells search engines the move is permanent.

    Writing the rule is the easy part. The real risk is the file it lives in, because WordPress keeps its permalink rules there too. A misplaced line can do nothing at all, start a redirect loop or take the whole site down. This guide covers the safe order of work. If you are changing URLs as part of wider search work, our guide to doing SEO on WordPress explains where redirects fit.

    Does your server read .htaccess at all?

    Check this first. .htaccess is an Apache configuration file. Nginx ignores it. Kinsta’s documentation says its WordPress sites have no .htaccess file and points users to its MyKinsta redirect tools instead. WP Engine has deprecated .htaccess and recommends its own alternatives. On hosts like these, a perfectly valid rule does nothing, and nothing tells you so.

    If your host’s control panel or documentation doesn’t say Apache, ask support which web server runs the site and whether it reads .htaccess rewrite rules. This matters most when staging and production run on different hosts: a rule that works on Apache staging can be dead weight on an Nginx production server. If the answer is no, use the host’s redirect tool, a redirect plugin or your CDN’s redirect rules. The patterns below won’t apply.

    Where do 301 rules go in a WordPress .htaccess file?

    Put them above the # BEGIN WordPress line, never between the BEGIN and END markers. WordPress owns that block and rewrites it whenever you save Settings > Permalinks, so anything you add inside it can disappear. Its last rule is a catch-all that hands every request that isn’t a real file to index.php. A RewriteRule placed below that catch-all may never run.

    Before you edit:

    1. Open the site root (often public_html) over SFTP or in your host’s file manager. Turn on “Show hidden files”, because names that start with a dot are often hidden. A missing-looking .htaccess is usually just hidden.
    2. Download a copy of the file and keep the SFTP connection open, so you can put it back in seconds.
    3. Edit in a plain-text editor. Curly quotes pasted from a word processor will break the file.
    cPanel File Manager showing the WordPress .htaccess file in public_html
    Checking the option to show hidden dotfiles ensures your site’s .htaccess file becomes visible in the file manager. · Source: www.inmotionhosting.com

    A working layout looks like this:

    # BEGIN Custom redirects
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^old-page/?$ /new-page/ [R=301,L]
    </IfModule>
    # END Custom redirects
    
    # BEGIN WordPress
    # (WordPress-generated rules, leave untouched)
    # END WordPress

    Practitioners disagree on one detail. A Webmasters Stack Exchange answer argues that the simpler Redirect directive (mod_alias) is processed by a different module from WordPress’s RewriteRule lines (mod_rewrite), so its position in the file matters differently. The practical answer is to pick one module for your redirects. RewriteRule above the WordPress block is the most predictable choice, and you still test the result.

    Which 301 rule fits your move?

    Use Redirect for a quick one-off. Use RewriteRule when you need patterns, conditions on the host or protocol, or query strings. Two details catch people out. In .htaccess, Apache strips the leading slash before matching a RewriteRule, so patterns start with ^old-page, not ^/old-page. And literal dots in a pattern need escaping, as in \..

    One page

    Redirect 301 /old-page/ https://example.com/new-page/

    Redirect matches a prefix and adds whatever follows it to the target. That means this rule also sends /old-page/child/ to /new-page/child/. If you want an exact match, use the RewriteRule version from the layout above. Include the trailing slash on the target too, or WordPress adds one with a second redirect.

    A whole directory or category

    RewriteRule ^category/guides/(.*)$ /resources/$1 [R=301,L]

    (.*) captures the rest of the path, and $1 puts it back in the new location. Rules for specific pages that should go somewhere else must sit above this one. Apache works through the rules in order, so a broad rule placed first catches those pages before their own rules get a turn.

    Old domain to new domain, keeping paths

    RewriteCond %{HTTP_HOST} ^(www\.)?old-example\.com$ [NC]
    RewriteRule ^(.*)$ https://new-example.com/$1 [R=301,L]

    This works only if the paths stay the same on the new domain. If /shop/product-a/ has become /catalog/product-a/, add specific rules above this one. Keep the old domain registered and pointing at the server, or every one of these redirects stops.

    HTTP to HTTPS and www to non-www in one hop

    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

    Separate rules for protocol and host stack into two redirects: http://www goes to https://www, then to https://. This combined rule does it in one response. Add it only after HTTPS works at the host. If the site sits behind a proxy or CDN that handles SSL, the origin may see every request as HTTP, and this rule loops. See the loop section below.

    A URL with a query string

    RewriteCond %{QUERY_STRING} ^p=123$
    RewriteRule ^$ /new-post/ [R=301,L,QSD]

    RewriteRule never sees the query string, so you match it with a condition. QSD drops the old ?p=123 from the target, so it isn’t carried over to the new URL.

    How do you test a 301 before it sticks?

    Write the rule as R=302 first. Apache’s per-directory rewrite guide recommends a temporary redirect while you debug, because browsers cache 301s. A wrong 301 can keep firing in your own browser even after you fix the file. Switch to 301 once every destination checks out.

    Test from the command line, not only in a browser:

    curl -sIL http://www.example.com/old-page/

    This prints each response in order. You want one 301 (or 302 while testing) with the correct Location, then a 200. Check the old URL, the new URL, and the http, https, www and non-www versions of each. If you prefer a browser, use a private window.

    Two or more 301s in that output is a chain. Google’s site-move documentation says Googlebot follows up to 10 hops but recommends redirecting straight to the final URL. If a chain can’t be avoided, Google says ideally no more than three hops and fewer than five. Point old rules straight at the final URL, and update your internal links so your own menus and posts skip the redirect entirely.

    Check where each redirect lands, too. Google warns that a redirect to an unrelated page, like sending everything to the homepage, can be treated as a soft 404. If a page has no real replacement, a useful custom 404 page serves visitors better than a homepage redirect.

    Why is the redirect doing nothing?

    These are the common causes, roughly from most to least frequent:

    1. The server doesn’t read the file. It runs Nginx, or the host has turned .htaccess off. Ask the host.
    2. The rule sits below WordPress’s catch-all. Move it above # BEGIN WordPress.
    3. Your browser cached an old response. Test with curl or a private window.
    4. The pattern starts with ^/. Remove the slash.
    5. A broader rule matched first. Put specific rules above general ones.
    6. You edited the wrong file. Hosting accounts with several domains have several document roots, each with its own .htaccess.
    7. mod_rewrite or AllowOverride is off. Only the host can change this.

    Not every unexpected 301 comes from your file. WordPress issues its own canonical redirects, for example adding a trailing slash, and a redirect plugin may also be acting on the same URL. Pick one place to manage each redirect and check both.

    How do you fix “too many redirects”?

    Chrome shows ERR_TOO_MANY_REDIRECTS. Firefox says “The page isn’t redirecting properly”. The usual cause is two layers both trying to set the canonical address. WordPress’s Logging In handbook lists mismatched site URL settings, mixed HTTP and HTTPS values, and conflicting SSL or redirect settings at the CDN, proxy, host or server.

    Work through the layers in order:

    1. Settings > General: WordPress Address and Site Address must match the final URL exactly, protocol and www included. If WP_HOME or WP_SITEURL is set in wp-config.php, those values win.
    2. Your .htaccess: comment out your HTTPS and www rules and test again.
    3. SSL or redirect plugins: if one already forces HTTPS, remove your rule or switch the plugin’s redirect off. Keep one, not both.
    4. The CDN: in Cloudflare, “Flexible” SSL serves HTTPS to visitors but connects to your server over HTTP. An HTTPS rule on the server then sends every request back round in a loop. Cloudflare’s troubleshooting docs cover switching the mode when the server has its own certificate.
    5. Reverse proxies: WordPress’s HTTPS handbook warns that loops happen when the proxy terminates SSL and WordPress doesn’t read the X-Forwarded-Proto header.

    Clear cookies and caches after each change, or you will be testing an old response.

    Chrome ERR_TOO_MANY_REDIRECTS error caused by a WordPress redirect loop
    A browser triggers the ERR_TOO_MANY_REDIRECTS error when competing configurations continuously bounce requests between HTTPS and non-secure protocols. · Source: kinsta.com

    What if the site returns a 500 after the edit?

    A syntax error in .htaccess can stop every request. Upload your backup copy straight away. If you don’t have one, follow WordPress’s Common Errors handbook: rename the file to .htaccess_old, load the site, then go to Settings > Permalinks and click Save Changes to rebuild the default rules. Add your custom rules back one at a time, testing after each. Our guide to fixing a WordPress white screen covers the other causes if renaming the file doesn’t help.

    If pretty permalinks then return 404 everywhere except the homepage, the WordPress block is missing or mod_rewrite is off. This is a different problem from a bad 301. Save permalinks again, then ask the host to enable mod_rewrite.

    When should you stop and get help?

    A handful of rules is a 20-minute job. A site migration is not. If you are moving hundreds of URLs, changing URL case, or consolidating sites, build a spreadsheet that maps each old URL to its closest live replacement first, and test a sample after launch. Get help if a loop persists across the CDN and host, if you can’t read the server error log, or if the whole site is down and the rename didn’t fix it. For WooCommerce product and category URL changes, turn on WooCommerce’s own 301 redirect option before you edit the permalinks. It avoids most of this.

    If you’d rather not edit server files at all, SiteSelf can add and check 301 redirects on request through chat. Editing .htaccess needs hosting (SSH) access, and the agent reports what changed and what it checked.

    Frequently asked questions

    Can I change or remove a 301 later?

    Yes. Edit or delete the rule and the server stops sending it. Browsers that already cached the 301 may keep following it for a while, though. That’s why you test with a 302 until the destination is final.

    Do I need RewriteEngine On before my rules if WordPress already has it?

    Add it to your own block anyway. It costs nothing, and your rules keep working if the WordPress block is removed or rebuilt. Repeating it does no harm.

    Should I redirect every 404 to the homepage?

    No. Google says redirects to irrelevant pages can be treated as soft 404s, and visitors get confused. Redirect old URLs to their nearest real equivalent, and let pages with no replacement return a proper 404.

    Is .htaccess faster than a redirect plugin?

    For a normal site with dozens or a few hundred redirects, the difference is too small to drive the decision. Choose by who maintains the redirects. A plugin suits people who don’t want to touch server files. .htaccess suits pattern rules and domain-wide moves on Apache.

    Why did my custom rules disappear?

    They were inside the WordPress block, or a plugin rewrote the file. Keep custom rules in their own commented section above # BEGIN WordPress. Check the file again after you save permalinks or update security and SSL plugins.

  • How the WordPress theme updater works and fails

    Key takeaways

    • WordPress’s documentation says theme auto-updates are switched on one theme at a time and run twice a day. Themes sold outside WordPress.org often never show up in that system.
    • Read the error before you retry. “Could not copy file” is a permissions problem for your host to fix, “cURL error 28” is a connection timeout, “Download failed. Unauthorized” is a premium license registered to another domain, and “Could not create directory” can mean the disk is full.
    • Since WordPress 6.3, a failed manual theme update puts the previous version back automatically. A successful update that breaks your layout gets no rollback at all.
    • A child theme protects files only. Database theme options, outdated WooCommerce template overrides and stale caches can all change what visitors see after a clean update.
    • WP Rollback only covers themes from WordPress.org. For premium themes, rolling back means uploading an older ZIP from the vendor or restoring a backup.

    People type “theme updater” as if it were one tool. On most sites it means one of three different routes, and the route you use decides what can go wrong. A free theme from WordPress.org, a theme bought on ThemeForest and a theme your agency built can sit side by side in Appearance → Themes. Each one gets its updates from a different place.

    This article explains how each route works, what its error messages mean, and what none of them check for you. If you just want the click-by-click routine, our guide to updating a WordPress theme without losing work covers that. This piece covers what happens underneath, which is what you need when the routine breaks.

    Which updater is updating your theme?

    Find out where the theme came from before you do anything else. That answer tells you which of the routes below applies.

    RouteWhere it runsWhat it depends onHow it usually fails
    Built-in updaterDashboard → Updates, Appearance → Themes, per-theme auto-updatesWordPress.org (or a registered update source), writable files, outbound connections, WP-CronPermissions, timeouts, disk space
    ZIP replacementAppearance → Themes → Add New → Upload Theme → “Replace current with uploaded”The correct ZIP, with the same folder name as the installed themeWrong package, “Destination already exists”
    Vendor channelA license-activated updater, a vendor dashboard (such as Avada’s), or a marketplace toolAn active license registered to this domain, and the vendor’s servers“Unauthorized”, vendor API timeouts, companion plugin version mismatch

    Two smaller categories sit on top of these. Update manager plugins from the WordPress.org directory schedule the built-in updater or control it item by item, but they don’t fetch anything new themselves. Agencies that distribute their own themes sometimes write custom update code that hooks into WordPress’s update check. That code is developer territory, and when it breaks, the fix belongs with whoever wrote it.

    Premium themes are where people get caught out. Kinsta’s documentation notes that premium and custom themes may have no public update endpoint, so the host’s standard update tools can’t reach them. If your theme came with a license key, the built-in updater probably isn’t the route doing the work.

    What the built-in updater does when you click Update

    WordPress checks for new versions on a schedule and caches what it finds. That cached result is what puts the yellow notice in your dashboard. When you click Update, WordPress downloads the package, unpacks it into wp-content/upgrade, puts the site into maintenance mode by writing a .maintenance file to the site root, swaps the theme folder and removes the file again.

    According to the core team’s announcement, since WordPress 6.3 the old version is moved to wp-content/upgrade-temp-backup/themes/ during a manual update. If the update fails, WordPress puts that copy back. If it succeeds, the copy is deleted. It is a safety net for a failed install, not a version archive.

    Auto-updates use the same machinery without the click. WordPress.org’s auto-update documentation says you switch them on per theme from Appearance → Themes, and that the process runs twice a day. They rely on WP-Cron, which only fires when someone visits the site. On a quiet site, or one where cron is disabled, “enabled” can still mean nothing happens for a while.

    WordPress theme updater auto-update toggle in Appearance Themes
    In the theme details overlay, clicking the Enable auto-updates link configures WordPress to handle that individual theme automatically through scheduled background checks. · Source: wordpress.org

    Themes and plugins share this whole system: the same screens, the same auto-update toggles, the same failure modes. A fix that works for one usually works for the other.

    Why the update failed: read the error before you retry

    Retrying almost never fixes a failed theme update, because the cause is usually in the server or the license, not a bad moment. The errors below are listed roughly by how often they come up in vendor support forums and WordPress threads. That ordering comes from reading threads, not from measured data.

    1. “Could not copy file” or “unable to copy some files… inconsistent file permissions.” The web server can’t write to the theme folder. WordPress picks its filesystem method based on who owns the files, which is also why it sometimes asks for FTP details. Check Tools → Site Health → Info → Filesystem Permissions, then ask your host to correct ownership. In one Catch Themes support thread from 2024, the same error came back with the manual method and the updater method, and support sent the user to the host. Don’t set folders to 777. WP Engine doesn’t allow it, and it opens a security hole without fixing ownership.
    2. “Download failed. cURL error 28: Connection timed out.” The server couldn’t reach the update source in time. On premium themes the slow side is often the vendor’s API. In a 2016 GeneratePress thread, the developer fixed it by whitelisting the server’s IP. Your host can confirm whether outbound connections are being blocked.
    3. “Download failed. Unauthorized.” The vendor won’t hand over the package. Usually the license is inactive or registered to another domain, which often happens after a migration or a cloned staging site. Deactivate the license on the old domain and activate it on this one, or download the official ZIP from your vendor account and use “Replace current with uploaded”. The XTemos support thread for WoodMart was resolved this way. Only use the vendor’s own package. A “nulled” copy from anywhere else is a security risk.
    4. “Could not create directory.” This one looks like a permissions error but can be a full disk or an exhausted hosting quota. Old backup archives stored inside the account are the usual cause. Check disk usage before you change any permissions.
    5. A critical error, or “Briefly unavailable for scheduled maintenance” that won’t go away. A stuck maintenance message means the update was interrupted and left .maintenance behind. WP Engine’s guidance is to delete it from the site root over SFTP or SSH once the update has stopped, then clear the cache. Deleting it brings the site back but doesn’t finish the update, so check the version number afterward. Critical errors on premium suites often come from mismatched companion plugins. Avada’s FAQ says to delete Avada Core and Avada Builder and reinstall them from the Avada Dashboard.

    “Destination already exists” isn’t an updater failure. It means you uploaded a ZIP whose folder name matches an installed theme. Use “Replace current with uploaded” if the screen offers it. Renaming the folder inside the ZIP installs a second, separate theme. On block themes that can cost you work, because Site Editor customizations are tied to the theme’s identity. When an Ollie user moved from the GitHub copy to the WordPress.org release, it installed as a new theme rather than an upgrade. Also check what you’re uploading: marketplace downloads are often a bundle containing documentation and plugins, with the installable theme ZIP inside it.

    WordPress theme updater error message Could not copy file
    A failed update notification in the WordPress dashboard directly identifies inconsistent file permissions as the root cause. · Source: meta.discourse.org

    If the update leaves a white screen rather than an error message, our guide to fixing a WordPress white screen walks through finding which file failed.

    What the updater doesn’t check

    The updater reports whether files were replaced. It has no idea whether your header, product grid or checkout still look right. In practice, the more common pain is an update that “succeeded” and changed the site anyway.

    • Edits made directly to the parent theme. Learn WordPress’s theme troubleshooting lesson is blunt: updates overwrite theme files. A phone number someone added to the parent’s header.php disappears. Customizations belong in a child theme, and our guide to theme customization that survives updates covers where each kind of change should live.
    • Theme options stored in the database. A child theme doesn’t protect these. The same Learn WordPress lesson warns that major releases may require re-selecting options and that shortcodes can change. Read the changelog before a major version.
    • WooCommerce template overrides. Templates your theme or child theme copies from WooCommerce go stale, and WooCommerce → Status → System Status flags them as outdated. WooCommerce’s developer docs say to back up the old override, copy in the current default template, and re-apply your changes to it. Swapping the file without merging throws your changes away.
    • Caches. A stale page cache can make a good update look broken, or make it look like nothing happened. In one r/Wordpress thread, a Neve update seemed to wreck one site’s layout, and turning off W3 Total Cache fixed it. Clear your browser, plugin, host and CDN caches before you decide anything.
    WooCommerce System Status outdated template overrides after a theme update
    The WooCommerce status report flags template overrides whose versions lag behind core releases, signaling customized files that require manual reconciliation. · Source: forum.bricksbuilder.io

    If something is still broken after the caches are clear, WooCommerce’s conflict test is the standard way to isolate it. Switch to a default theme, deactivate every plugin except WooCommerce and the extensions you need, reactivate them one at a time, and repeat the action that failed, with the browser cache bypassed each time.

    Should the updater run on its own?

    It depends on the theme and what it’s attached to, and nobody has outcome data that settles it. A sensible split looks like this. Auto-update simple WordPress.org themes on sites where a broken layout costs little. Update premium themes, heavily customized themes and anything on a store by hand, after a backup. Apply security releases quickly either way.

    The tradeoff is real on both sides. Waiting a few days lets other people find the broken releases first. Waiting for years builds a backlog that turns into a risky catch-up job, and leaves known holes open in the meantime. Auto-updates swap the second risk for the first: the update happens on time, but nobody is looking when it lands.

    What each route lets you undo

    Rollback depends on the route, so sort it out before you update.

    • Failed manual update: since 6.3, WordPress restores the previous version itself.
    • Successful update you don’t want: the WP Rollback plugin reinstalls an earlier version, but only for themes from WordPress.org.
    • Premium theme: upload an older ZIP from your vendor account through “Replace current with uploaded”, or restore a backup. Keep the previous ZIP before you update.
    • Anything else: a full backup of files and database. Our guide to what a backup plugin really covers explains why “full” sometimes isn’t.

    How the work changes when an agent does it

    Updating a theme takes two minutes. Most of the time goes on everything around it: checking which route applies, reading the changelog, catching the outdated template, clearing three caches and then actually looking at the pages that matter. That’s why updates pile up, and why a two-minute job turns into an afternoon.

    SiteSelf handles this as a request in chat. Example request: “Update the parent theme on the live site. Before you do, tell me whether the child theme overrides any WooCommerce templates that will be out of date. Afterward, check the homepage, one product page and the cart, and tell me what changed.”

    The agent says what’s about to change and whether it can be undone, then runs the update. A theme update replaces files, so it needs hosting (SSH) access, not just the connector plugin. Afterward it fetches the pages you named and reports what it saw, including any error, and the work is recorded. That’s a fetch of each page, not a screenshot, a device test or a payment run through checkout. You still decide whether the result is right.

    It has limits. It works on request and doesn’t watch the site, so it won’t notice an auto-update that misbehaves overnight. It can’t sign in to ThemeForest or any other vendor account, so moving a license to a new domain stays with you. Pages owned by Elementor, Divi or Beaver Builder are refused when the work starts, with the reason given. The same routine covers plugins, which is where most update work goes, and the page on WordPress update work shows how a full update cycle runs through chat.

    Frequently asked questions

    Why does WordPress ask for FTP credentials when I update a theme?

    WordPress picks how to write files based on who owns them. If the web server process can’t create files with the right ownership, it falls back to asking for FTP details. Tools → Site Health → Info → Filesystem Permissions shows which folders are writable, and your host can fix the ownership so the prompt goes away.

    Do I need to deactivate my child theme to update the parent?

    No. Leave the child theme active and update the parent. Files in the child theme stay untouched. Afterward, check any templates the child overrides, because the parent may have changed the originals they were copied from.

    Why doesn’t my premium theme show an update in the dashboard?

    Usually the license isn’t active on this domain, or the vendor’s update check is timing out. Some premium themes never report to the built-in updater at all and only update through their own dashboard or a manual ZIP. Check the vendor’s documentation for which channel it uses.

    Will updating remove my Additional CSS?

    Usually not, because Additional CSS is saved in the database, not in the theme files. Edits to the parent theme’s style.css are a different story: the update overwrites them. Move that CSS to a child theme or to Additional CSS before you update.

    Is Easy Theme and Plugin Upgrades still a good choice?

    Its WordPress.org page warns that it hasn’t been tested with the last three major WordPress releases and may no longer be maintained. WordPress core now offers “Replace current with uploaded” when you upload a ZIP for an installed theme, which covers the main thing the plugin was for.

    Can I update a theme on staging and push it live on a store?

    You can push the theme files. Pushing the whole database will overwrite orders placed since the staging copy was made. Test the update on staging, then run the same update on production, rather than copying the staging database over the live one.

  • How to customize a WordPress template safely

    Key takeaways

    • On a block theme, a template saved in the Site Editor takes priority over the child theme’s file, and the child’s file takes priority over the parent’s. That is why editing a file can look like it did nothing.
    • Editing a template changes every page that uses it. To change one page, edit that page’s content or give it its own template.
    • Put code changes in a child theme. Its style.css Template value must match the parent theme’s folder name exactly, including capital letters.
    • WooCommerce template overrides don’t update when WooCommerce does. WooCommerce > Status > System Status lists the outdated ones, and the only fix is to copy the new default file and redo your changes by hand.
    • If your change doesn’t show up, clear every cache layer and check the page in a private window before you touch any code.

    In WordPress, “template” can mean five different things. It can be a block template in the Site Editor, a PHP file in a classic theme, a WooCommerce template override, a page builder layout, or a demo design you imported when you set the site up. Most failed template edits happen in the wrong one of these.

    So the job is not “edit the template”. It’s finding the layer that actually draws the page, making the change there, and checking that the change shows up, affects only what you meant, and survives the next update. This guide covers each route. If you want the broader picture of theme work first, see our guide to editing themes without losing work.

    Which kind of template is your site using?

    Start at Appearance in the dashboard. If you see an Editor item, you have a block theme. If you see Customize and no Editor, you have a classic theme. WordPress.org’s documentation says the Site Editor only appears when a block theme is active. If you’ve been looking for a template editor and can’t find one, this is usually why.

    What you seeTheme typeWhere templates live
    Appearance > EditorBlock themeSite Editor (saved in the database), plus HTML files in /templates and /parts
    Appearance > Customize, no EditorClassic or hybrid themePHP files such as single.php, page.php, header.php
    A builder’s own template or theme-building menuEither typeThe builder’s own templates, with display rules
    A woocommerce folder in your themeEither type, store onlyOverride files that replace WooCommerce’s defaults

    Next, work out whether your change is to content, to style or to structure. Six words in a hero is content: edit the page. A new button color everywhere is style: use Styles or Additional CSS. An author box on every post is structure: edit the template.

    How to customize a block theme template in the Site Editor

    On a block theme, you can change templates without writing code. Every template is shared, though, so check what else uses it before you save.

    1. Go to Appearance > Editor > Templates. Open the template that controls the page type you want to change, such as Single Posts, Pages or Archive.
    2. Edit the blocks. Headers and footers are template parts. A change to one appears on every page that uses that part.
    3. Click Save. WordPress lists everything you’re about to save: templates, template parts, navigation and synced patterns. Read that list. If you see something you didn’t mean to touch, untick it.
    4. To change colors, fonts or spacing across the whole site, use Styles instead. Styles keeps revisions, and you can reset it.
    WordPress Site Editor Templates screen used to customize a block theme template
    The Site Editor organizes all templates for your active block theme in one central screen, where any customized template takes priority over the theme’s default files. · Source: learn.wordpress.org

    How to change the template for one page only

    Leave the shared template alone. Someone on the WordPress.org forums edited a template they used for every page, trying to change just one of them, and lost earlier work. The advice they got applies to everyone. Edit that page’s content instead. Or create a new template, assign it to that page in the page’s settings sidebar, and build it from a non-synced pattern. A non-synced pattern is a plain copy, so editing it on one page leaves the others alone.

    Why your file edit loses to the Site Editor

    WordPress’s Theme Handbook sets the order. WordPress first looks for a template saved in the database through the Site Editor. Then it checks the child theme’s /templates folder, then the parent theme’s. It uses the first one it finds. So if anyone has ever saved that template in the Site Editor, nothing you change in the file over FTP will show.

    To make the file count again, reset that template in the Site Editor. A reset deletes the saved version, so export or copy its block markup first. The handbook also notes that templates saved in the database never turn into theme files on their own. If you want a template to ship with the theme, copy its markup into the matching file yourself.

    How to customize a classic theme template with a child theme

    On a classic theme, templates are PHP files. WordPress picks the most specific file that matches each request. A page with the slug “about”, for example, uses page-about.php if it exists, and page.php if it doesn’t. Never edit the parent theme’s files. The next theme update replaces them, and your changes go with them. Put your changes in a child theme, which a parent update leaves alone. Practitioners report losing work to this mistake more than any other.

    1. Back up the site. Ideally, work on a staging copy.
    2. Create a folder in wp-content/themes, for example astra-child.
    3. Add a style.css with a header. The Template line must match the parent theme’s folder name exactly, including capital letters.
    4. Copy only the file you need from the parent into the child, at the same path and with the same filename, and edit the copy.
    5. Activate the child theme under Appearance > Themes and check the page.
    /*
    Theme Name: Astra Child
    Template: astra
    */

    Your child theme’s stylesheet won’t always load on its own. The handbook says that depends on how the parent theme loads its styles. If your CSS isn’t applying, add this enqueue to the child theme’s functions.php:

    add_action( 'wp_enqueue_scripts', function () {
        wp_enqueue_style( 'child-style', get_stylesheet_uri() );
    } );

    To give one page its own layout, create a file in the child theme that starts with <?php /* Template Name: Landing */ ?>. Then pick it from the Template field when you edit the page.

    Child themes have limits. A child theme still depends on the parent, and some themes load their files with get_template_directory(). That function always points at the parent theme, so a copy in the child is ignored. The handbook also says a child theme isn’t always the right tool. If your design differs a lot from the parent’s, building a separate theme may be the better choice.

    When Additional CSS is all you need

    A lot of “template” requests are really styling: padding, a font size, a button color. On the WordPress.org forums, a non-coder who took over a site built by an agency had been installing plugins to adjust spacing. The fix was simpler. They right-clicked the element, chose Inspect to find the CSS rule, and pasted an override into Appearance > Customize > Additional CSS. As support pointed out in that thread, plugins are for adding features, not for CSS tweaks.

    Theme updates don’t touch Additional CSS. It can’t change the HTML structure, though. If the element you want doesn’t exist in the page’s markup, you need the template layer. For block themes, the Styles panel is the equivalent place. We cover choosing between these layers in more detail in theme customization that survives updates.

    How WooCommerce and page builder templates differ

    To override a WooCommerce template on a classic theme, copy the file from wp-content/plugins/woocommerce/templates/ into a woocommerce folder in your child theme. Keep the same path, minus the templates folder. WooCommerce’s template documentation adds two traps. If your theme has a woocommerce.php file, WooCommerce uses that file instead of woocommerce/archive-product.php. And themes with custom templates have to declare WooCommerce support.

    Overrides go stale. WooCommerce’s developer docs say your copies don’t update when WooCommerce updates its own templates. WooCommerce > Status > System Status lists your overridden templates and flags outdated ones. The fix is manual: back up your copy, copy the new default into its place, then redo your changes. WooCommerce says a one-click update isn’t practical, because themes are coded too differently. Our guide to updating a theme without losing work adds this check to the update routine.

    Some parts of a product page are added by hooks rather than by a template file being loaded directly. In one WordPress.org support thread, copied overrides of price.php and product-image.php did nothing. WooCommerce support suggested removing the woocommerce_template_single_price action and adding a replacement that loads the template with wc_get_template(). Experienced store developers go further: use hooks where you can, and keep your overrides few and small.

    On block themes, WooCommerce 10.2 moved its product block templates into the Site Editor, under All Templates > Add Template. Instructions written before September 2025 may point you to the wrong screen.

    Page builders keep a template layer of their own. If a builder’s theme-building feature controls your shop or product pages, editing the WooCommerce page or a theme file won’t change them. Edit the builder’s template and check its display conditions.

    Why your template change doesn’t show up

    Work through these in order. The first two cause most cases.

    1. A higher-priority template wins. A version saved in the Site Editor, a woocommerce.php file or a builder template is drawing the page, not the file you edited.
    2. A cache is serving the old page. WordPress.org’s FAQ names the browser cache, the server cache and caching plugins. Add your CDN and object cache to that list. In the WooCommerce thread above, the overrides only appeared after the poster cleared the Redis object cache. Purge the caching plugin, the host cache, the object cache and the CDN. Then load the page in a private window.
    3. You edited the wrong file or path. WordPress suggests a deliberately obvious test change, such as a block of red text. If it doesn’t appear, you’re editing a file the site doesn’t use.
    4. The child theme is misconfigured. Check the Template value and the stylesheet enqueue, and make sure the copied file’s folders match the parent’s.

    If the site shows “There has been a critical error on this website,” the change broke PHP. WordPress’s handbook says to check the admin email inbox, turn on debugging and read wp-content/debug.log. The file path in the error message tells you which file to fix or restore.

    When to stop and get help

    Visual changes in the right editor are well within reach for most site owners. Stop when the work moves into PHP and you don’t have a working backup or a staging copy. Stop too when a WooCommerce override is outdated on a store that’s taking orders, when a hooked template needs replacing, or when you’re switching themes or builders. A switch means rebuilding every post, archive and product template, not reskinning them. If you’d rather describe the change and have it done on your existing site, here is how SiteSelf handles design and template changes.

    After any structural change, check two things the old template may have done for you. Can you still tab through the menus with a keyboard, and does every form field still have a label? And does each page still output exactly one canonical tag?

    Frequently asked questions

    Do I need a child theme to customize a template?

    You need one for code changes to a parent theme that still gets updates. For style-only changes, Additional CSS or the Site Editor’s Styles is usually enough. For block template changes made in the Site Editor, the database copy already survives theme updates.

    Is it safe to edit templates in the Theme File Editor?

    It’s risky. One PHP typo can take the site down, and the editor doesn’t keep a copy of the previous version. If you use it at all, use it on a child theme and keep FTP or hosting file access ready so you can undo the change.

    How do I reset a block template to the original?

    Open the template in Appearance > Editor > Templates and use its reset or “clear customizations” option. That deletes your saved version and goes back to the theme’s file, so export or copy the markup first if you might want it again.

    Why can’t I see the Template option on my page?

    On a classic theme, the Template field only appears if the theme or child theme includes at least one custom page template. On a block theme, you may need to create the template in the Site Editor before you can assign it to a page.

    Will my template customizations survive a theme switch?

    Mostly not. Child theme files belong to the old parent theme. Block templates saved in the Site Editor belong to the old theme. Builder templates go with their builder. Plan a theme switch as a rebuild, on a staging copy.

    How do I know which classic template file renders a page?

    Use the template hierarchy: WordPress chooses the most specific matching file, such as single-product.php before single.php. To confirm, make a visible test change to the file you think is responsible and load the page.

  • How to add internal links in WordPress

    Key takeaways

    • WordPress’s link control checks that a URL is formatted correctly, not that the page exists. Open the published page in a private window and click every new link.
    • Never link to a URL containing /wp-admin. Copy the public address, and make it match the version your site serves (www or not, trailing slash or not) so it doesn’t go through a redirect.
    • Section links need an HTML Anchor set under the block’s Advanced panel. Anchors are case-sensitive, have no spaces, start with a letter and must be unique on the page.
    • Yoast’s warning ‘No internal links appear in this page’ can be wrong. It often misses links in menus, page builders and custom fields that search engines still crawl.
    • There is no ideal number of links per post. Ahrefs found that 66.2% of sites in a study of over a million domains had at least one page with only one dofollow internal link pointing at it.

    Adding an internal link in WordPress takes about ten seconds: select the words, press Ctrl+K, pick the page. The link itself rarely goes wrong. The things around it do: a URL copied from the edit screen, a slug renamed last spring, an anchor with a capital letter in the wrong place, or a plugin warning that says the links you can see aren’t there.

    This guide covers the editor steps, then the cases the editor doesn’t handle: section links, menus, WooCommerce products, and what to do when a link breaks. Internal links are one part of the wider job of doing SEO on WordPress. They are also the part that slowly goes stale on any site that keeps publishing.

    What you need before you start

    You need an account that can edit the post or page, and the destination has to be published. A link to a draft takes logged-out visitors to a 404. If the destination doesn’t exist yet, create and publish the page first, and settle its slug before anything links to it.

    These steps are for the block editor. In the Classic Editor, the link button in the toolbar does the same job.

    How do you add an internal link in the block editor?

    1. Select the words that describe the destination. Choose “business audit checklist”, not “here”. The link should sit in the sentence where the reader would want the next step.
    2. Open the link control. Press Ctrl+K (Cmd+K on a Mac) or click the link icon in the block toolbar.
    3. Search or enter the destination. Type part of the post or page title and WordPress searches your own content. Pick the correct result, and look twice when two titles are similar. You can also paste a full URL, a relative path like /about, or an anchor on the same page like #contact.
    4. Leave the advanced options off. For an internal link, “Open in new tab” and nofollow should normally stay unticked.
    5. Press Enter, then Save or Update the post.
    6. Test it as a visitor. Open the published page in a private window and click the link.

    Step six is the one people skip, and it is the one that catches mistakes. WordPress’s Link control documentation says the editor checks whether a URL is formatted acceptably. It does not check whether the page exists or loads. A typo in a slug looks fine in the editor and returns a 404 on the live site.

    Why you should select words before pasting a URL

    If you paste a bare URL on its own line, the editor may turn it into an embed or a preview card instead of a text link. WordPress’s documentation warns about this. Select the words first, then add the link to them.

    Why you should never link to an admin URL

    A URL copied from the address bar while you are editing looks like /wp-admin/post.php?post=123&action=edit. It works for you because you are logged in. For everyone else it goes to a login screen. A thread on WordPress.org’s support forums turns on exactly this mistake. Open the page itself in a private window and copy that address.

    Match the exact version your site serves. If your site uses https://www.example.com/pricing/, a link to http://example.com/pricing still arrives, but only after one or two redirects. Visitors and crawlers both pay for each hop.

    What does a correct internal link look like?

    In the page source, a correct internal link is a plain anchor element with an href, descriptive text and no extra attributes:

    <a href="https://www.example.com/services/business-audit/">business audit service</a>

    Google’s link best practices page says Google uses links to find new pages to crawl and as a signal of relevance, and asks for crawlable links with descriptive anchor text. Accessibility asks for the same thing. WCAG 2.2 success criterion 2.4.4, Level A, requires that a link’s purpose be clear from its text or the text around it. “Click here” fails, and so does an empty link around an icon.

    Don’t add nofollow to internal links. WordPress describes nofollow as telling search engines not to associate with or crawl the linked page from your site. That is almost never what you want for your own pages. It also doesn’t fix a broken link or remove a page from search.

    How do you link to a section of a page?

    You give the section an HTML anchor, then link to it with a hash.

    1. Select the heading (or other block) you want to jump to.
    2. In the block settings sidebar, open Advanced and type a name in HTML Anchor, for example pricing-faq.
    3. Link to #pricing-faq from the same page, or to https://www.example.com/pricing/#pricing-faq from another page.

    WordPress’s Page Jumps documentation sets the rules: anchors are case-sensitive, contain no spaces, start with a letter and must be unique on the page. If clicking a jump link takes the reader to the top of the page instead of the section, the anchor and the link don’t match exactly. #Pricing-FAQ and #pricing-faq are different anchors.

    Where are menu and WooCommerce product links set?

    Menus are a separate system

    A link inside a post never becomes a menu item, and a menu item doesn’t count as a link in your article. In a block theme, edit menus in the Navigation block (Appearance, then Editor, then Navigation) and add a page link or a Custom Link. Classic themes use Appearance, then Menus. Both kinds of link matter, but only contextual links in the body tell readers and search engines which specific pages relate to this one.

    WooCommerce has three kinds of product link

    To link to a product inside a post, use an ordinary link to the product’s public URL. Recommendations work differently. WooCommerce’s documentation explains that you choose up-sells and cross-sells by hand in the product’s Product data panel, under Linked Products. WooCommerce generates related products automatically from shared categories and tags, so you can’t pick them one by one. Whether these lists appear, and where, depends on your theme.

    Product URLs follow the product permalink setting under Settings, then Permalinks. If you change it on an established store, every product link typed into posts points at the old structure. Add redirects and update those links in the same session.

    WooCommerce Linked Products tab with up-sells and cross-sells fields
    Under the Linked Products tab, store managers can manually search and designate specific items for up-sells and cross-sells. · Source: woocommerce.com

    Which pages should you link, and how many links?

    There is no correct number. Guides recommend anything from two links per post to one every 50 words, and none of those figures comes from a controlled test. Two rules hold up better: link where the reader would want to go next, and make sure every page you care about has at least one link to it from the body of another page.

    Many sites miss the second rule. In Ahrefs’ study of over a million domains, 66.2% of sites had at least one page with only one dofollow internal link pointing to it. Note that the figure is for sites, not pages. Still, under-linked pages are common.

    A habit that scales well with a small archive:

    • When you publish, link the new post to two or three older pages it builds on.
    • Then open those older pages and link back to the new one where it adds something.
    • Link from service, product or category pages only where the sentence supports it. A related offer at the right moment helps readers. A forced one reads like an ad.
    • Once a quarter, use a crawler or your SEO plugin’s link report to find pages with no inbound links, and give each one a home.

    Plugins that suggest or auto-insert links save search time on large archives. Practitioners regularly report irrelevant suggestions and repetitive anchors, and AI tools that make up URLs or break HTML. Treat every suggestion as a draft and read the sentence it lands in before you accept it.

    Why does Yoast say there are no internal links when there are?

    Yoast’s content analysis shows “Internal links: No internal links appear in this page, make sure to add some!” even on pages with several links. One WordPress.org support thread opens with exactly that complaint about a post with at least three links. The usual reason is where the links sit. Yoast reads the post content, so links in menus, footers, sidebars, some page builder modules and custom fields often aren’t counted. Yoast’s support has said search engines can still crawl those links.

    So trust the page, not the counter. If you want the warning gone:

    • Put at least one link in a normal paragraph in the editor, not in a builder module or custom field.
    • Check that the Site Address under Settings, then General, matches your live URL, including https and www. A mismatch can make your own links look external.
    • Run Yoast’s SEO data optimization from the Yoast SEO tools screen.

    Yoast’s link suggestions in the editor are a Premium feature, and Yoast’s help page says to run the data optimization first. If you don’t see suggestions on the free version, nothing is broken.

    What to do when an internal link doesn’t work

    Find out what the destination returns, then match the fix to the cause.

    • 404 after a slug change. Add a 301 redirect from the old URL to the new one, then update the links that still use the old path. A redirect is a safety net, not a replacement for correct links. A helpful custom 404 page catches the visitors you miss.
    • 404 because the page was deleted. Redirect to a page that answers the same need. If none exists, remove the link.
    • Every pretty URL returns 404. Open Settings, then Permalinks, and click Save Changes without changing anything. WordPress rebuilds its rewrite rules. This fixes rewrite problems only. It won’t fix a typo or a deleted page.
    • The editor misbehaves. If the URL disappears after Ctrl+K, or nofollow gets added when you didn’t choose it, a theme or plugin is interfering. Run a conflict test, switching to a default theme, turning all plugins off and turning them back on one at a time, as described in our guide to plugins that stop working.
    • Links point at the old domain after a migration. They may still work through redirects, but each one takes a detour. A database search-and-replace from the old domain to the new one fixes them all at once. Take a backup first. If the original domain is carrying over to the rebuilt site, keep linking to it rather than to the temporary staging address.

    If you’d rather not do this cleanup page by page, SiteSelf takes it as a chat request: it updates the links, adds redirects and other SEO fixes on your site, and reports what changed and what it checked.

    Stop and get help when links break across the whole site after a migration or host move, or when the editor fails the same way with every plugin off and a default theme on. At that point the cause is in the server, the database or WordPress itself, and it needs someone with hosting access.

    Frequently asked questions

    Should internal links open in a new tab?

    Usually not. The reader is staying on your site, and a new tab breaks the back button they expect to use. If you do open a link in a new tab, W3C lists telling users in advance as an advisory technique, for example by adding “(opens in a new tab)” to the link text.

    Should I use relative paths or full URLs?

    Both work in a browser, and the link control accepts paths like /about. Full URLs are easier to search and replace after a domain change and behave the same in feeds and emails. Whichever you use, use it consistently.

    How do I edit or remove a link?

    Click the linked text in the editor. A small popover shows the destination with buttons to edit it or remove the link. Removing the link keeps the words. Then update the post.

    Do internal links improve rankings?

    They help search engines find pages and understand which pages relate to each other, and Google says it uses them as a relevance signal. No public controlled study shows that adding a set number of links lifts a given page. Reports of traffic gains after linking work usually come with other changes made at the same time.

    Does every WooCommerce product need links from other products?

    No. Store owners disagree about product-to-product linking, and linking every product to every other one looks spammy to shoppers. Relevant links from guides and category pages, plus up-sells and cross-sells chosen with care, do the job.

    Can I change the same link across many posts at once?

    Core WordPress has no bulk link editor. On a small site, search your posts for the old URL and edit each result. On a large one, a database search-and-replace is faster, but take a backup and test a single post first.

  • How to add a map widget in WordPress

    Key takeaways

    • Pick the map by the job it has to do: a share-link iframe for one address, a map plugin such as WP Go Maps or MapPress for markers and locators, a custom build for data-driven maps.
    • A Google Maps Platform key only works when four things belong to the same Cloud project: the key, the enabled APIs, the billing account and the referrer list, and the key has to sit in the plugin’s own settings field.
    • Since March 1, 2025, Google gives each SKU its own free monthly usage threshold in place of the old $200 credit. The Maps Embed API is free for unlimited use but still needs a key and billing.
    • The browser console names the failure: RefererNotAllowedMapError, BillingNotEnabledMapError and ApiNotActivatedMapError each point to one specific setting.
    • Write the address on the page as text as well. Search engines and screen readers can’t read the map itself.

    A contact page with a grey box where the map should be, or a darkened map stamped “For development purposes only”, tells every visitor that nobody is looking after the site. It’s also one of the easiest things on a WordPress site to get wrong. “Map widget” can mean five different things, and they each have their own settings.

    Here is what those five are, which one fits your page, how to add each, and how to find out why a map won’t load. If you’re still building the page the map will sit on, start with how to add pages in WordPress.

    Which kind of map does your page actually need?

    Start with the job, not the plugin. A single office address needs something much simpler than a dealer network with a radius search, and the simpler option has fewer ways to break.

    What you needSimplest approachGoogle API key?
    One location on a contact pageGoogle Maps share-link iframe in a Custom HTML blockNo
    A map in a sidebar or footerCustom HTML block in the widget area, or a plugin’s widgetOnly for plugin widgets that use Google
    Several markers, popups, categoriesA map plugin with a block, widget and shortcodeYes with the Google engine, no with OpenStreetMap or Leaflet
    Store locator, radius search, filtersA store locator plugin or a full map plugin’s locatorUsually, for address search
    A map built from your own data (listings, custom fields)Custom code, often with LeafletDepends on the tile provider

    Page builders have map widgets of their own. Elementor, for example, documents its own Google Maps integration, which has nothing to do with any map plugin. A key you save in one product does nothing for another. The most common mistake with these maps is pasting a key into the wrong plugin.

    Before you build a store locator, check that visitors will actually use a map. On many local business sites people only want the address, a phone number and a directions link. Those do more for them than an interactive map.

    How to add a single-location map without a plugin

    For one address, the embed code from Google Maps is the most reliable option. You don’t create an API key, set up a Cloud project or install a plugin to keep updated.

    1. Open Google Maps, search for your business or address, and click Share.
    2. Choose the Embed a map tab, pick a size, and click Copy HTML.
    3. In WordPress, edit the page, add a Custom HTML block where the map should go, and paste the code.
    4. Add a title attribute to the iframe that says what the map shows.
    5. Below the map, type the full address as normal text in a Paragraph block.
    6. Update the page, then load it in a private browser window to check the map renders.
    Google Maps Embed a map dialog used to add a map widget in WordPress
    Selecting Embed a map inside the Google Maps share dialog generates a ready-to-use iframe snippet that requires no API key or complex configuration. · Source: slides.com

    The finished code should look like this. The src value will be longer:

    <iframe src="https://www.google.com/maps/embed?pb=..."
      title="Map showing Example Bakery, 12 High Street, Leeds"
      width="600" height="450" loading="lazy"></iframe>

    The address text in step 5 matters more than people think. The W3C’s accessibility technique H64 uses the iframe title to name the frame. A screen reader user learns there is a map, but can’t read the street name from it. Search engines index your page text, not the map tiles. So put the address, phone number and opening hours in text, and add LocalBusiness structured data if you use an SEO plugin that supports it.

    If you would rather not do this yourself, SiteSelf can add the embed and the address text to your WordPress pages through chat, then fetch the live page and report what changed. Pages owned by Elementor, Divi or Beaver Builder are refused, and the Google account side stays with you.

    How to put a map in a sidebar or footer widget area

    This depends on your theme. Go to Appearance. If you see Widgets, your theme has widget areas. If you only see Editor, you have a block theme, and the sidebar and footer are template parts you edit in the Site Editor. Our guide to editing the footer in WordPress explains both paths.

    Both paths accept a Custom HTML block, so the iframe method above works there too. Keep the map small. A 300-pixel-wide map in a sidebar is enough to show where you are, with a “Get directions” link under it.

    If you want the plugin whose name matches the search, Maps Widget for Google Maps, know one thing first. It shows a static thumbnail and opens the interactive map in a lightbox when clicked, and it was built for the classic widgets screen. The plugin’s support forum says it does not work with the block-based widget editor. It recommends installing the official Classic Widgets plugin or switching to a map block. If you manage many sites, that choice will come up again and again.

    How to set up a Google Maps API key for a plugin

    Plugins that load Google’s interactive maps need a key from Google Maps Platform. The steps below cover most of them. Always follow your plugin’s list of required APIs, because each plugin needs different ones.

    1. Create or pick a Google Cloud project. For a client site, the client should own the project and its billing account and add you as a user. The charges belong to them, and so does the account.
    2. Attach a billing account to that same project. Billing attached to a different project doesn’t count.
    3. Enable the APIs your plugin lists. Interactive maps use the Maps JavaScript API, thumbnail images use the Maps Static API, and address search uses Places and Geocoding. Enable only what the plugin needs.
    4. Create the key and restrict it. Under application restrictions, choose websites (HTTP referrers). Google’s security guidance reserves IP restrictions for server-side calls. Under API restrictions, allow only the APIs from step 3.
    5. List every hostname the site uses. For example https://example.com/*, https://www.example.com/* and https://staging.example.com/*. A wildcard such as *.example.com/* covers subdomains but not the bare domain, so add both.
    6. Paste the key into that plugin’s own settings field. If the plugin has a “Test API Key” button, use it.
    7. Wait before you test. GravityKit’s referrer error guide says restriction changes can take up to five minutes to apply. If you change three settings in two minutes, you won’t know which one fixed it.
    Google Cloud API key referrer restrictions for a WordPress map plugin
    Restricting the key to authorized website referrers prevents unauthorized usage across unapproved domains. · Source: www.wpgmaps.com

    If you loosen a restriction to test, put it back afterwards. A browser key with no restrictions can be copied from your page source and used on anyone’s site, and your billing account pays for it.

    What a Google-powered map costs

    For most small sites, nothing. You still have to add billing details. Google’s March 2025 pricing change replaced the old $200 monthly credit with a free monthly usage threshold for each SKU, from March 1, 2025. Guides written before then that mention the credit are out of date.

    Google’s Maps Embed API billing page says that API is free for unlimited requests, but it still needs a key and a billing account. The Maps JavaScript, Static, Places and Geocoding APIs charge for usage above their free thresholds. Sites with many listings or address lookups on every page view are the ones that run up bills. Set a daily quota on each API in the Cloud console so a traffic spike stops the map rather than running up the bill.

    If you don’t want to manage any of this, choose an engine that doesn’t use Google. WP Go Maps offers Google, Leaflet and OpenLayers engines. MapPress describes itself as “Free, no API key, no setup” and supports Leaflet, OpenStreetMap and Mapbox as well as Google. You give up Google’s familiar map style and some of its place data. In exchange there’s no key, no project and no bill.

    Why a map shows blank, grey or watermarked

    Open the page, press F12, and look at the Console tab. Google writes a named error there, and each name points to one setting. Google’s error messages reference lists them all. The table starts with the most common ones.

    Browser console showing a Google Maps error on a WordPress map widget
    A specific browser console message like RefererNotAllowedMapError directly reveals which URL restriction setting is preventing the map from loading. · Source: brighterwebsites.com.au
    Console errorWhat is wrongFix
    MissingKeyMapError, InvalidKeyMapErrorNo key, or the wrong key, in this plugin’s fieldPaste the right key into the plugin that draws the map
    BillingNotEnabledMapErrorNo billing on the project that owns the keyAttach billing to that project, not a different one
    ApiNotActivatedMapErrorThe API the plugin calls is not enabledEnable it in the key’s project
    ApiTargetBlockedMapErrorThe key’s API restriction leaves that API outAdd the API to the key’s allowed list
    RefererNotAllowedMapErrorThe page’s URL is not in the referrer listAdd the missing hostname (www, non-www, staging), then wait
    OverQuotaMapErrorA usage limit was reachedWait for the daily reset or raise your own quota

    A key that works on one domain and fails on another is almost always a referrer problem. Adding billing doesn’t fix a wrong key, and a correct key doesn’t turn on an API you haven’t enabled. Each is a separate setting.

    If there’s no Google error, the problem is on the WordPress side. Check these in order:

    • Cache. Purge your caching plugin, the host cache and any CDN. Then reload in a private window.
    • Two loaders. A theme with built-in maps and a map plugin can both load Google’s script. Turn off the script loading in one of them. Don’t install a third plugin to fix the first two.
    • Optimisation plugins. Settings that combine or delay JavaScript can break map scripts. Exclude the map script, or test with those settings off.
    • Hidden containers. A map inside a tab or accordion can render at zero size. Your plugin’s docs will explain how to redraw it when the tab opens.
    • Theme hooks. A custom theme that never calls wp_footer() in footer.php drops the scripts many plugins add at the bottom of the page.
    • Thumbnail shows, click does nothing. On thumbnail-and-lightbox maps, this usually means another script has loaded the lightbox library twice, or an earlier JavaScript error stopped the page. It isn’t a key problem.
    • Wrong location. The address was too vague. Use the full street, town and country, or enter coordinates. A new key won’t change the pin.

    To test for a conflict on a live site, use the Health Check plugin’s troubleshooting mode. The WordPress support handbook explains that it turns off plugins and switches to a default theme for your logged-in session only. Visitors see the normal site. Then turn plugins back on one at a time. Our guide to fixing plugins that stop working covers that routine in detail.

    When to stop and get help

    Get a developer or your host involved if all three of these are true: the console shows no Google error, Health Check troubleshooting mode with every plugin off still shows a blank map, and the map works on a default theme but not on yours. The problem is then in the theme’s code. Get help too if you need the map to write to other systems, such as putting a selected pickup store’s address into a WooCommerce order. That needs custom code using the plugin’s hooks.

    What to keep in mind after launch

    A map plugin is code on your site like any other plugin, and map plugins have needed security fixes. Keep them updated, and delete any you’ve stopped using. An iframe embed has no plugin code to update, which is another reason it suits a single location.

    Speed is the other ongoing cost. An interactive map loads Google’s script and map tiles from outside your site. Put it only on the pages that need it, and use lazy loading or the thumbnail-and-lightbox approach so the map doesn’t load until a visitor needs it.

    Frequently asked questions

    Do I need a Google Maps API key to show a map in WordPress?

    Not for the share-link embed you copy from Google Maps and paste into a Custom HTML block. You do need one for plugins or builder widgets that load Google Maps Platform APIs. Plugins running OpenStreetMap or Leaflet engines don’t need a Google key.

    Widget, block or shortcode: which should I use?

    Use a block in page content, a block or widget in sidebars and footers, and a shortcode in places that accept neither, such as some builder text modules. Many map plugins offer all three. Check whether a widget was built for the classic widgets screen before you rely on it in a block theme.

    Why does the map show “For development purposes only”?

    Google adds that watermark when the key or billing fails its checks. The console usually names the reason, most often billing missing from the key’s project or an API that isn’t enabled. Fix that setting, wait a few minutes, and reload.

    Who should own the Google account on a client site?

    The client. They create the project, attach their own billing, and add the developer as a user. Charges then go to the business that uses the map, and access stays with the client if the developer moves on.

    Can I show my customers’ locations on a map?

    Mapping your own stores is different from mapping where buyers live. Showing customer addresses, even roughly, raises privacy questions. Check with whoever handles your privacy policy before you publish one.

  • How to edit your homepage in WordPress

    Key takeaways

    • Settings > Reading names your homepage, but a block theme’s Front Page template, or front-page.php in a classic theme, overrides that setting.
    • The fastest way to reach the right document is to open the live homepage while logged in and click Edit (or Edit with Elementor) in the admin bar.
    • Clear each cache layer once: browser, cache plugin, host and CDN. If a full purge changes nothing, cache was not the problem, so go back and check which document you edited.
    • The WooCommerce Shop page, stale Google results and a homepage sent back to Drafts by a theme switch all look like failed edits. None of them is.
    • Stop and get help when the fix needs a template file, a host limit changed, or deleting pages you have not yet confirmed are duplicates.

    You change the headline, click Update and reload the site, and the old headline is still there. On WordPress this rarely means the save failed. Usually you edited something other than what WordPress serves at the root of your domain.

    “Edit the homepage” can mean three different jobs. You might be choosing which page WordPress shows at the root, editing that page’s content, or changing the template that lays it out. Each job happens on a different screen. Our guide to editing pages in WordPress covers the page editor in general. This article covers the homepage, which is where most of the traps are.

    Find out what produces your homepage before you edit

    You need three answers first, and they take about two minutes to get:

    1. Settings > Reading. “Your homepage displays” is set to either Your latest posts or A static page. If it says static, write down which page is selected as the Homepage.
    2. The Appearance menu. If it has an Editor item, your theme is a block theme. If it shows Customize and no Editor, your theme is a classic theme.
    3. The live homepage, viewed while logged in. If the admin bar shows Edit with Elementor or another builder’s button, a page builder owns the layout.
    WordPress Settings Reading screen for choosing a static homepage
    Selecting a static page under Reading Settings designates the specific page WordPress loads as your site homepage. · Source: learn.wordpress.org

    Those answers tell you where to make the edit:

    Your setupWhere to edit
    Static page, block editorPages > All Pages, then the page named in Reading
    Block theme with a Front Page templateAppearance > Editor > Templates > Front Page
    Latest posts, block themeAppearance > Editor, the Home or Index template
    Classic themeAppearance > Customize for the theme’s homepage options. If the theme has a front-page.php file, the layout lives in that file.
    Page builderThe builder, opened from the live homepage

    One habit prevents most problems. Open the live homepage and click Edit in the admin bar. You get the document WordPress is actually serving, not a duplicate with the same title.

    How to choose which page is your homepage

    WordPress.org’s guide to creating a static front page gives the steps:

    1. Publish the page you want to use. The Homepage dropdown only lists published pages, and our guide to adding pages in WordPress explains why drafts and private pages are left out.
    2. Go to Settings > Reading and select A static page.
    3. Choose your page in the Homepage dropdown.
    4. If you run a blog, you can also choose a Posts page. WordPress will not let the Posts page be the same page as the Homepage.
    5. Click Save Changes.

    Calling a page “Home” does not make it the homepage. Only this setting does. After you save, WordPress marks the page “Front Page” in your Pages list, which makes it easy to find next time.

    Why the page you picked may not be what visitors see

    A template can override the Reading setting. WordPress.org’s additional guide to the Site Editor says that in a block theme, a Front Page template takes precedence over the Reading setting. Classic themes have the same rule. The template hierarchy uses front-page.php for the front page whatever Reading says. The name home.php is misleading: it is the posts index, not the homepage.

    Here is what that means in practice. Suppose Reading names your page, you edit it, you publish, and nothing changes. Open Appearance > Editor > Templates and look for a Front Page template. A template only shows a page’s own content if it contains a Post Content block. Without that block, your page edits have nowhere to appear. You have two options: add a Post Content block to the template so page edits show up, or edit the template itself.

    How to edit a static homepage in the block editor

    1. Go to Pages > All Pages and find the entry marked Front Page.
    2. Click Edit. Change the text, images and buttons directly in the blocks. If a block is nested inside groups or columns, open List View to select it.
    3. Click Save (called Update in older versions) and wait for it to finish before you leave the screen.
    4. Open the homepage in a private window. The private window skips your logged-in view and your browser cache.

    Colors and fonts that appear across the site belong in the Styles panel, not in each block’s settings. If you style blocks one by one, the next homepage change means redoing that work.

    How to edit the homepage in a block theme’s Site Editor

    If your site shows latest posts, or the theme ships a Front Page template, the homepage is a template, and it may not appear in your Pages list at all. WordPress’s own contributors acknowledge this. Gutenberg issue #56244 is about making the Home page easier to find in the editor.

    1. Go to Appearance > Editor > Templates.
    2. Open Front Page. If there is none, open Home, the template for the posts page. If neither exists, open Index, the fallback. Some themes use slightly different names.
    3. Edit the blocks and click Save.
    WordPress Site Editor templates list with the Front Page homepage template
    In the Site Editor templates list, the Front Page template takes priority for dictating the structure of your homepage. · Source: www.gravityforms.com

    Pay attention to what you are editing. A change to the Front Page template only affects the root URL. The header and footer are template parts shared by every page, so editing them inside the homepage template changes them across the whole site. If a template edit goes wrong, the Site Editor keeps revisions and lets you reset a customized template to the theme’s default.

    How to edit a classic theme homepage

    Classic themes send you to Appearance > Customize. The Homepage Settings panel there mirrors the Reading setting. Many themes add their own panels for homepage sections, such as the hero, featured boxes and widget areas. If the theme has a front-page.php file, some of the layout is written in PHP and no setting will change it. That is a job for a child theme, and our guide to editing themes without losing work explains why you should never edit the parent theme’s files.

    How to edit a homepage built with Elementor or another builder

    Open the live homepage and click Edit with Elementor in the admin bar, then click Update when you are done. Starting from the live page matters. On one WordPress.org support thread, an Astra starter-template import had created two Home pages and two Elementor Default Kits. The owner kept editing the copy that was not live, and caching turned out not to be the cause. If you think you have duplicates, check which page Settings > Reading names before you delete anything.

    Do not open a builder page in the block editor and rewrite it there, because that can break the builder’s layout data. Elementor’s History panel, at the bottom left of the editor, lists recent revisions if you need to step back.

    You may see “Sorry, the content area was not found in your page. You must call the_content function in the current template.” Elementor’s help page on that error gives two causes. Either the template has no content area, or you are trying to edit a dynamic page such as an archive or a shop page. Use Theme Builder for dynamic pages. A template that is missing the_content needs a developer or a different theme.

    Why your homepage changes are not showing

    Check these in order. The cheap, common causes come first:

    1. You edited the wrong document. Click Edit from the live page and compare. Confirm the status is Published, not Draft, Pending or Scheduled. Also confirm you are on the live domain and not a staging copy or a translated version.
    2. A template controls the layout. See the Front Page and Post Content section above.
    3. A cache is serving an old copy. There can be several layers: your browser, a cache plugin, your host’s cache and a CDN. Elementor sites have one more, the CSS files Elementor generates, which its changes-not-appearing guide tells you to clear at Elementor > Tools > Clear Files & Data. Purge each layer once. If a full purge changes nothing, the cache was not the problem, so stop purging and go back to step 1.
    4. The editor will not load or save. Plugin conflicts, PHP memory limits and host firewalls cause this. Take a backup first (see what a backup plugin covers), then isolate the cause using our guide to fixing plugins that are not working.
    5. It only looks wrong on mobile. Builders store separate settings for mobile. Check at phone width before you decide the desktop edit failed.
    Elementor Tools screen with Clear Files and Data for homepage changes not showing
    Clearing files and data in the Elementor Tools panel forces WordPress to purge and regenerate the builder’s internal CSS cache. · Source: elementor.com

    Three problems that look like homepage edits but are not

    The WooCommerce Shop page. WooCommerce assigns its Shop page separately from your homepage. According to WooCommerce’s Product Catalog documentation, the layout of that page comes from the Product Catalog template in the Site Editor. Content you type into the Shop page may not appear.

    Google still shows the old version. Search results are not your website. Google Search Central’s page on asking Google to recrawl says recrawling can take days to weeks. You can request it once with URL Inspection in Search Console. Requesting it repeatedly does not make it faster.

    The homepage vanished after a theme switch. WordPress.com’s homepage troubleshooting guide notes that the old homepage can end up in Pages > Drafts. The same check works on any WordPress site: republish the page, then select it again in Settings > Reading.

    When to stop and get help

    Stop when the fix means editing front-page.php or adding the_content to a template. Stop when the error points to a host limit such as memory or a firewall rule, because only your host can change those. And stop before you delete pages or re-import a starter template to fix duplicates you have not identified yet. Doing that before you know which copy is live usually makes the damage worse.

    Whoever helps you will want the same things: the URL, what Settings > Reading says, the theme, the builder, and the exact error text. If you would rather hand the change over, SiteSelf can make homepage and page edits through chat on request and tell you what it changed and checked, though it refuses pages owned by Elementor, Divi or Beaver Builder when the work starts.

    Frequently asked questions

    Can I edit my homepage by typing directly on the live site?

    No. WordPress edits happen in the dashboard: the page editor, the Site Editor or your builder. The Edit link in the admin bar on the live page takes you to the right one.

    Why can’t I find my homepage in Pages?

    On a block theme that shows latest posts, or one with a Front Page template, the homepage is a template rather than a page. Look under Appearance > Editor > Templates.

    How do I put my blog on its own page?

    In Settings > Reading, choose A static page, pick your homepage, and pick a different page as the Posts page. Leave that Posts page empty, because WordPress replaces its content with your post list.

    How do I change the homepage title that shows in search results?

    SEO plugins set it in different places depending on your Reading setting. For a static homepage it is usually set on the page itself. For a latest-posts homepage it is in the plugin’s site-wide settings. Either way, Google shows the new title only after it recrawls the page.

    Only my homepage breaks in Elementor. What else can I try?

    People report success with a simple workaround: create a new page, copy the content across, and select the new page as the homepage in Reading. This is anecdotal. Afterwards, rename or delete the old copy so you do not create the duplicate-page problem.

    Will editing the Front Page template change my other pages?

    The template itself only applies to the root URL. The header and footer inside it are shared template parts, so editing those changes every page on the site.

  • How to use case studies for research on WordPress

    Key takeaways

    • A usable case study names the date and versions, the exact symptom, the root cause, the fix, how the fix gets misapplied and how the result was checked. If several of these are missing, you are reading an anecdote.
    • The Stripe Gateway 9.4.1 update fixed one incident in April 2025. It was never general advice for missing payment methods, and clearing the payment-method cache does nothing about API rate limiting.
    • Duplicator’s analysis of 8,000+ support tickets is the rare source with a denominator: host PHP limits in close to 1 in 5 migration tickets, wp-admin lockouts in nearly 1 in 10. It covers only migrations that produced a ticket.
    • Test a borrowed fix in a way visitors can’t see, such as Health Check’s Troubleshooting Mode. Then check the business journey (a test order, a submitted form), not just whether the homepage loads.
    • Hold your own case studies to the same standard: starting constraints, what failed, what fixed it, and how you checked.

    WooCommerce released Stripe Payment Gateway 9.4.0 on April 16, 2025. Within days, some stores found payment methods missing at checkout. The fix was version 9.4.1, and a lot of threads and agency write-ups from that week say so, correctly. Read one of them today, apply it to a store whose payment methods have vanished, and you have borrowed the right fix for somebody else’s problem.

    That is the hard part of using case studies for research. Most WordPress knowledge travels this way: a support thread, an agency’s incident page, a host’s write-up, a vendor’s report. Each one describes a single site at a single moment. Read well, a case study is the fastest route to a cause. Read carelessly, it sends you down the wrong path while the checkout stays broken. Our guide to fixing plugins that stop working covers the general diagnosis. This article covers how to judge the stories you find along the way, and how to write your own so someone else can use them.

    What separates a usable case study from an anecdote

    A usable case study lets you check whether its situation matches yours. For that it needs six things, and most published WordPress case studies leave out at least half of them.

    ElementWhy you need it
    Date and versionsWordPress, PHP and plugin versions change what a fix does. An undated fix can’t be scoped.
    The symptom, exactly“Critical error on every page” and “checkout hangs” point to different causes. You need the error text.
    The named root cause“A plugin conflict” is a category. “Broken Link Checker retrying a failed schema update” is a cause.
    The exact fixWhich setting, file or version, and in what order.
    How the fix goes wrongA fix applied to the wrong cause often looks like it worked, or hides the real problem.
    How success was checked“The site loads” and “a test order went through” are different results.

    WordPress.org’s own documentation shows what this looks like. The Recovery Mode article says when the feature triggers (a fatal error during a regular page load, not during cron or background tasks), what to do (deactivate the faulty plugin or theme) and where it stops working. Deactivating is typically a temporary fix, and the recovery email may never arrive if the server can’t send mail. That is a cause, a fix and a warning on one page.

    Provider case studies usually give you the story and leave out the specifics. You get “a plugin update broke checkout” with no plugin name, no host and no error text. Such a case can show you a sensible process. It can’t tell you whether its fix applies to your site.

    Why a case study’s symptom is not your diagnosis

    The same symptom can come from very different causes, and the cause in someone else’s story is only one of them. Migrations show this clearly, because the post-move symptoms look far worse than what usually causes them.

    Duplicator, which makes a migration and backup plugin, published an analysis of more than 8,000 support tickets. Migration and restore problems were the largest technical category. The patterns in it cut against the usual reading of the symptoms:

    • A frozen progress bar is usually the destination host’s PHP execution time or memory limit stopping extraction. That accounted for close to 1 in 5 migration tickets. Running the same migration again hits the same limit. Raise max_execution_time and memory_limit, or ask the host to.
    • Locked out of wp-admin after the move (nearly 1 in 10) often doesn’t mean the migration failed. Check the WordPress Address and Site Address, and clear your cookies. You can set both values in wp-config.php temporarily if the dashboard won’t load.
    • “Error establishing a database connection” after a move is more likely wrong DB_NAME, DB_USER, DB_PASSWORD or DB_HOST values in wp-config.php than a damaged database.
    • A 500 error after a move is more often a stale .htaccess file than corruption. Saving Settings, then Permalinks, regenerates the rewrite rules.

    If a case study jumps from a symptom straight to a dramatic cause, such as corruption, malware or a failed migration, look for the ordinary explanation first. Our guide to the WordPress white screen works through the same order for fatal errors.

    WordPress error establishing a database connection screen after a migration
    The default WordPress connection error screen points directly to mismatched login credentials inside the wp-config.php file rather than database corruption. · Source: wedevs.com

    Why an old fix is not current advice

    A case study records one moment, and plugins, hosts and WordPress keep changing after it. The Stripe incident is the clearest example. WooCommerce’s developer advisory explains that 9.4.0 added a sync between plugin and Stripe dashboard settings that made more calls to Stripe’s Payment Configuration API than expected. Some stores were rate-limited, which caused slow admin dashboards and payment methods that disappeared for a while. Updating to 9.4.1 was the fix for that incident. It was never general advice about which version to run.

    WooCommerce’s general page on Stripe methods missing at checkout lists other causes: the payment-method cache, outdated checkout templates, SSL and HTTPS problems, and plugin conflicts. It also points you to the Stripe logs. It notes that clearing the cache doesn’t fix rate limiting. So the two most common forum fixes, “update” and “clear the cache”, each fix one cause and do nothing for the others.

    Before you apply a fix from a case study, compare its date and version numbers with your site. If the case is about a specific release, check that release’s changelog to confirm the problem, and the fix, belong to that version.

    Why one case can’t tell you how common a problem is

    A single case study tells you that something can happen. It can’t tell you how often. Frequency needs a denominator, meaning the total number of cases the share refers to, and almost no WordPress case study has one.

    The Duplicator report is the exception, and it comes with limits. The publisher sells a migration tool. The data covers only migrations that led to a support ticket, so a quick fix that nobody reported isn’t counted. The shares overlap and don’t add up to a total. Use it to decide what to check first during a migration. Don’t use it to rank WordPress problems in general.

    Practitioner incident pages work the opposite way. They are thin on frequency but sometimes strong on mechanism. One maintenance provider, Gaurish, describes a site that went down when MySQL’s per-user connection limit ran out. It traces the cause to Broken Link Checker repeatedly retrying a schema update that kept failing, and says the site was back in 1 hour 30 minutes. It names the plugin and gives the time taken, which is more than most such pages do. What you can take from it: a plugin you barely use can take a site down from the database side. It tells you nothing about how likely that is on your site.

    How to test a borrowed fix without breaking the live site

    Treat a fix from a case study as a guess to test, not as an answer. This order keeps the risk low:

    1. Match the symptom exactly. Same error text, same page, logged in or logged out, front end or admin. If it doesn’t match, the case doesn’t apply.
    2. Check the date and versions. Compare the case’s WordPress, PHP and plugin versions with yours on Tools, then Site Health, then Info.
    3. Confirm the cause on your own site. Look for it in the PHP error log, the plugin’s own log (WooCommerce, then Status, then Logs for payment gateways) and the changelog of anything updated recently.
    4. Test where visitors can’t see. The Health Check plugin’s Troubleshooting Mode, described in the WordPress.org support handbook, turns off plugins and switches the theme for your logged-in session only, so visitors keep the normal site while you test. Deactivating plugins across the whole site disrupts every visitor.
    5. Check the business journey. Place a test order, submit the contact form, log in as a customer. A homepage that loads can still sit on a checkout that fails.
    Health Check Troubleshooting Mode active in the WordPress admin
    The Troubleshooting Mode dropdown in the WordPress admin bar lets you isolate plugins and themes strictly for your own administrative session. · Source: make.wordpress.org

    Caching deserves a separate check, because case studies often assume their host’s defaults. Kinsta’s technical FAQ says it excludes cart, account and checkout pages from caching by default and skips the cache when certain WooCommerce cart cookies are present. Your host may use different rules. If personal pages are being cached, clearing the cache hides the problem until the next visitor. You fix it by adding the exclusion.

    If you’d rather not work through this list yourself, SiteSelf’s WordPress bug fixes start from the symptom you describe in chat, and the agent reports what it changed and what it checked.

    How to read an agency’s or vendor’s case study

    A sales case study is evidence that the provider has solved a problem like yours before. It is not proof they will solve yours. Read it with a few questions in mind:

    • Is it your problem? A case that matches your kind of site and your constraints is worth reading closely. A generic success story isn’t.
    • What did they actually do? Look for their role and their process, not just before-and-after numbers. Screenshots with no explanation tell you little.
    • How was the result measured? Sessions and clicks are easy to report. Ask how the work changed sales, enquiries or hours saved.
    • Who published it, and what is missing? Hosts, plugin makers and agencies publish case studies to win customers. Their data can still be useful, like Duplicator’s tickets, but a survey with no respondent count, or a success story with no plugin, host or price, is a claim to ask about, not a fact to rely on.

    Use the case study to start the conversation. Ask the agency to walk you through one engagement, including what went wrong.

    How to write a case study someone else can use

    Write your own with the same rigour you want from others, because that is also what makes it persuasive. A prospect or a colleague trusts a case study that admits what failed.

    1. Starting point. The site, the stack (theme, key plugins, host type), the versions, the date and the constraint: no staging, a live sale, a locked-down host.
    2. Symptom. What people saw, including the exact error text.
    3. What you ruled out. The approaches that didn’t work and why. This is the part most write-ups drop, and it is the part a reader learns the most from.
    4. Cause and fix. Named plainly, with the setting, file or version involved.
    5. Check. How you confirmed it worked, especially the business journey.
    6. Limits. What you couldn’t verify, and what would make the fix wrong for a different site.

    For marketing, a few deep write-ups aimed at the clients you want usually beat a long portfolio of thin ones. Give every other project a short summary in the same format so readers can skim. Clients are more likely to take part if you offer a short interview and a draft they can approve than if you ask them to write or record something.

    Publishing case studies on a WordPress site

    Most sites give case studies their own post type, so they get their own archive, URL and categories. The usual setup registers the post type with a rewrite slug:

    add_action( 'init', function () {
        register_post_type( 'case_study', array(
            'label'        => 'Case studies',
            'public'       => true,
            'has_archive'  => true,
            'show_in_rest' => true,
            'rewrite'      => array( 'slug' => 'case-studies' ),
            'supports'     => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
        ) );
    } );

    After adding it or changing the slug, save Settings, then Permalinks, so WordPress rebuilds its rewrite rules. A WordPress.org support thread from a nonprofit moving its “Case Studies” post type to Twenty Twenty-Four went through exactly this. If the archive returns a 404 afterwards, the rewrite rules or the registration are wrong, not the content. It’s the same Permalinks save that fixes the post-migration 500 error above.

    WordPress Settings Permalinks screen used to regenerate rewrite rules for a case studies post type
    Clicking the Save Changes button on the Permalink Settings screen flushes and regenerates WordPress rewrite rules to instantly resolve 404 errors on custom post types. · Source: kinsta.com

    Frequently asked questions

    Is this the same as a case study in academic research?

    The core idea is the same: study one case in depth, in its real setting, using more than one kind of evidence. This article is about the practical version that WordPress site owners, agencies and developers run into every day. If you are designing a formal study, follow your field’s methods guidance for sampling and analysis.

    Can I apply a fix from a forum thread directly to my site?

    Only once you’ve confirmed your symptom, versions and cause match the thread. Try it in Troubleshooting Mode or on a staging copy first, and take a backup before changing files or the database. Afterwards, check the journey that matters, such as checkout or a form submission.

    Why do so many agency case studies leave out plugin names and hosts?

    Usually client confidentiality, sometimes to avoid naming a vendor, and sometimes because the write-up is meant to impress rather than inform. Whatever the reason, you can’t check whether its fix applies to you. Ask the agency for those details in a call.

    Which WordPress problems are most common?

    There is no reliable ranking across all WordPress problems. The best narrow data is Duplicator’s migration ticket analysis, where host PHP limits and post-move login problems lead. Treat any wider “most common problems” list as opinion unless it states what its percentages are out of.

    Should I include failed approaches in a public case study?

    Yes, briefly. They show the reader you diagnosed the problem instead of guessing, and they save the next person time. Leave out anything that would expose a client’s security details.

  • What a website backup plugin does and where it fails

    Key takeaways

    • WordPress’s Advanced Administration Handbook says a full backup needs both files and the database, kept as multiple copies in different places. The built-in content export is not a backup.
    • In Duplicator’s analysis of more than 1,400 of its own support tickets, about 1 in 4 backup tickets came down to a host or server limit stopping the build. The host environment breaks backups more often than plugin bugs do.
    • A manual Backup Now run doesn’t show that the schedule works, and a restore that reports ‘completed’ doesn’t show you got a working site. Only a test restore to staging or a local copy shows either.
    • WooCommerce warns that restoring an older backup to a live store can lose orders, customer accounts, payment tokens and subscriptions created after it, and can run processed renewals again.
    • A backup plugin has deep access to your site, so its updates are part of plugin maintenance like any other plugin’s.

    Most site owners find out whether their backups work on the worst possible day. An update white-screens the site, or the host account disappears, or a restore finishes and the site comes back empty. Only then do they check what the plugin had actually been saving, and where.

    A website backup plugin copies your WordPress files and database on a schedule and sends the copy somewhere else. The copying is the easy part, and nearly every plugin in the WordPress.org directory does it. What sets a working setup apart is whether the backup is complete, stored off the server, still running months later, and restorable when the dashboard is gone. If you’re here because an update is coming up, our guide on updating a WordPress theme safely shows where the backup fits in that process.

    What does a complete WordPress backup actually include?

    It includes two things: the database and the files. WordPress’s Advanced Administration Handbook says a full backup needs both. The database holds your posts, pages, settings, users and, on a store, the orders. The files are your themes, plugins, uploads and the WordPress core install. A backup of only one half won’t rebuild the site. One WordPress.org support reply points out that a copy of the uploads folder alone won’t restore anything.

    Two misunderstandings come up again and again. First, Tools → Export in WordPress is a content export, not a backup. It skips your settings, theme, plugins and most plugin data. Second, “full backup” in a plugin’s settings may still leave things out. Many plugins create their own database tables, and WooCommerce is the obvious example. In one WordPress.org support thread, a restore reported success and the site came back with default content. The backup had skipped the tables that weren’t part of core WordPress.

    The handbook also gives an order: back up the database first, then the files. When you restore, put the files back first, then the database.

    Website backup plugin settings in WordPress admin showing files and database options
    Selecting both database and file backup options ensures that website media, code, and dynamic database tables are fully preserved. · Source: www.veerotech.net

    Why does it matter where the backup is stored?

    A backup kept on the same server as the site is lost along with the site. If the disk fails, the host suspends the account or an attacker gets in, the site and its only backup go together. The WordPress handbook recommends several copies in different places and on different media. Practitioners put it more bluntly: a backup on the same server isn’t a backup.

    People who assume otherwise usually learn it from an account problem, not a technical one. One Reddit thread describes a client who lost their site and irreplaceable images after the host deleted the account over a missed payment. The host kept backups, but they sat inside the same account. The practical setup is simple. Keep your host’s backups, and add at least one copy in storage you control, such as Google Drive, Dropbox or an S3 bucket in your own name. Keep weeks of copies, not one night’s, so you can go back past a problem that stayed hidden for a while.

    Why do WordPress backups fail?

    Usually because of the hosting environment, not a bug in the plugin. Duplicator analysed more than 1,400 of its own support tickets. About 1 in 4 backup tickets were a host or server limit stopping the archive build partway through. Compression failures on constrained hosts, sites too large for the host, PHP timeouts, file permissions and memory exhaustion made up most of the rest. These are one vendor’s tickets, not a failure rate for all sites, but the pattern matches what the support forums show.

    Where it brokeWhat you seeWhat usually fixes it
    Building the archive504 Gateway Timeout, “Maximum execution time exceeded”, “Allowed memory size … exhausted”Split the archive into smaller parts in the plugin’s settings, exclude cache folders, or ask the host to raise PHP limits
    Writing it to disk“permission denied”, “failed to open”, a disabled Backup Now buttonDelete old local backups, set a retention limit, and have the host correct the folder permissions
    Running on scheduleThe last backup is weeks old and nothing reported an errorReplace WP-Cron with a real server cron and turn on failure alerts
    Uploading off-siteLocal copies exist but the remote folder is empty or staleRe-authorise the storage connection and check the storage isn’t full

    Memory errors trip people up because of one setting. You can raise WP_MEMORY_LIMIT in wp-config.php, but UpdraftPlus’s restoration documentation says that only helps up to the limit the server allows. Past that, only the host can change it. Our white screen troubleshooting guide covers the same limit from the other side.

    The schedule that quietly stopped

    This failure is the hardest to spot because nothing looks wrong. WordPress’s built-in scheduler, WP-Cron, runs only when someone loads a page. On a low-traffic site, behind password protection, in maintenance mode or on a host that blocks the site from sending requests to itself, scheduled jobs just don’t run. A manual Backup Now works fine, because your click started it, not the scheduler. So a successful manual run tells you nothing about the schedule.

    The fix is to stop depending on visitors. Disable WP-Cron’s page-load trigger and have the server call it on a timer:

    // wp-config.php
    define( 'DISABLE_WP_CRON', true );
    
    # server crontab, every 15 minutes
    */15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

    Your host’s control panel usually has a cron screen if you don’t have shell access. Turn on the plugin’s failure notifications too. One small-business thread made a fair point: owners miss emails, so send the alert somewhere they’ll actually see it.

    Remote storage causes the same kind of quiet failure. Duplicator puts about 4 in 10 of its storage-connection tickets down to cloud authorisation or connection breaks. Google Drive, Dropbox and OneDrive connections run on tokens that expire or get revoked. When that happens, the backups keep running and pile up on the server’s disk. In Duplicator’s data, old local backups filling the disk caused about 1 in 7 scheduled-backup failures.

    Remote storage options in a WordPress website backup plugin
    Connecting automated backups to cloud providers like Google Drive or Dropbox relies on authorization tokens that can expire without warning. · Source: www.sktthemes.org

    Why doesn’t “restore completed” mean the site is back?

    The message only means the plugin ran its steps. It doesn’t mean the result is a working site. You find that out by restoring a copy somewhere safe before you need to. The WordPress handbook recommends periodic manual backups to check that the automated ones are working. The test that settles it is restoring the backup to a staging site or a local environment like LocalWP and clicking around. One Reddit practitioner puts a local test restore at about 20 minutes. A test on a small local machine won’t catch every problem a large production site would hit, but it catches missing tables, corrupt archives and missing files.

    UpdraftPlus’s restoration documentation maps the common restore errors to fixes, and most of it applies to any plugin:

    • PCLZIP_ERR_BAD_FORMAT (-10): the archive is damaged. Download it again and test-unzip it on your computer. When you delete the bad local copy, leave “also delete from remote storage” unticked, or you lose the good copy too.
    • Memory exhausted: raise WP_MEMORY_LIMIT up to the server’s ceiling, then ask the host.
    • Disk quota exceeded: free up space. A good backup still needs room on the server to unpack.
    • “Could not move the files into place”: a permissions problem on the server, and the documentation sends you to the host.

    If the site was hacked, restoring a backup that already contains the malware brings the problem back. Restore to a clone first and check it. Our guide to malware removal that holds covers what to check.

    Stores need a different restore plan

    On WooCommerce, restoring an older backup over the live site also removes everything that happened since that backup was taken. WooCommerce’s Subscriptions documentation warns that it can lose orders, customer accounts, payment tokens and subscriptions created after the backup, and can run renewals again that were already processed. Restore to staging, find what you need, and bring it across selectively. Back up more often too. A daily backup still means a day of orders at risk.

    Can you restore when you can’t reach wp-admin?

    Only if you set that up in advance. Most backup plugins live inside WordPress, so a white screen or a hacked admin can lock you out of the restore button along with everything else. Before you need it, find out whether your setup can restore from outside the dashboard. That could be a standalone installer you upload over FTP, your host’s own restore tool, or a service with its own interface. Write the steps down where someone other than you can find them.

    How should you choose a backup plugin?

    Choose by how you will need to recover, not by feature count. Ask these questions of any plugin, and ask them about the edition you’ll actually pay for:

    • Does it back up the full database, including plugin tables, and every file you need?
    • Can it send copies to storage you own, on a schedule, and alert you when a run fails?
    • Can you restore without wp-admin?
    • Is restoring a large backup part of the free version? One WordPress.org support user found they needed a $69 extension to restore theirs.
    • Does it handle what you run: Multisite, a busy store, a site too big for your host’s limits?

    Popularity is a weak signal. WordPress.org shows install counts in rounded tiers. All-in-One WP Migration and Backup shows 5+ million, and UpdraftPlus’s badge shows 4+ million while its own description still says “more than 3 million.” WordPress.org’s backup tag also lists migration, staging and site-management tools, so it isn’t a ranking of backup plugins.

    Why does the backup plugin need updating too?

    A backup plugin can read your whole database, write to your files and unpack archives on your server. That makes it one of the most privileged plugins on the site. Its updates fix both reliability problems and security holes. UpdraftPlus’s 1.26.8 release, for example, fixed backups failing on PHP-FPM servers and on WebDAV storage. Updating it belongs in your regular update cycle, not only when something breaks. After an update, run a backup and read the log.

    The link works in both directions. WooCommerce’s update guide tells store owners to back up before updating and to test updates on staging. The backup exists so updates are safe, and the plugin that makes it needs updates of its own. If you’d rather not run that cycle yourself, SiteSelf handles plugin updates on request through chat.

    What if a backup file is publicly reachable?

    Remove it or put it behind a password. An archive in a public web folder contains your whole database, including user emails and password hashes. Google Search Central says noindex doesn’t control access and robots.txt isn’t a security measure. Once the file is secured, you can ask Google to remove it from search results.

    WordPress backup plugin log showing backup and restore status
    A detailed activity log reveals the precise file operations and uncleaned archives that a simple finished status can easily conceal. · Source: wordpress.org

    Frequently asked questions

    Does WordPress have built-in backups?

    No. WordPress core has no full-site backup. The Export tool saves content as an XML file, and the WordPress handbook is clear that a real backup needs the files and the database. Most hosts offer backups, but how often they run, how long they’re kept and whether you can restore them yourself all vary.

    Do I need a plugin if my host already backs up the site?

    You need at least one copy that doesn’t depend on the host account. Host backups are fine as one layer, but if the account is suspended or deleted, they usually go with it. A plugin sending copies to storage you own gives you that second copy.

    How often should I back up?

    As often as you can afford to lose data. A brochure site that changes monthly is fine with daily or weekly backups. A store taking orders all day needs backups every few hours or continuously. The answer comes from how fast the site changes, not from a standard.

    How do I know my backup plugin is working?

    Check three things: the log shows recent scheduled runs, not just manual ones; the files are actually in the remote folder; and a test restore to staging or a local copy produces a working site. Turn on failure notifications so a stopped schedule doesn’t stay hidden.

    Can a backup plugin slow down my site?

    It can on weak hosting, because building an archive takes CPU, memory and disk. Practitioners schedule heavy backups overnight, exclude cache folders and back up less often if jobs overlap. Plugins that back up only what changed put less load on the server per run.

    Who is responsible for backups on a client site?

    Whoever the contract says, and vague contracts cause disputes. “Install a backup plugin” doesn’t cover how often, how long copies are kept, where they’re stored, who watches for failures or who does the restore. Write all of that down, including whose storage account holds the copies.

  • How to update a WordPress theme without losing work

    Key takeaways

    • WordPress’s Updates screen warns that changes made to theme files are lost on update. Edits in the parent theme disappear without any error, so move them into a child theme, a small custom plugin or Additional CSS first.
    • A child theme protects you, but it can still break. After a major ColorMag release changed class names, users running child themes lost CSS and menus, and the developer told them to rewrite their custom code.
    • Since WordPress 6.3, a manual theme update that fails partway restores the previous version on its own. That does nothing for an update that installs cleanly and then breaks your layout, so you still need a backup.
    • On WooCommerce stores, open WooCommerce > Status > System Status after the update and look under Templates. Outdated template overrides can break shipping or checkout even when the theme update itself succeeded.
    • Match the exact error message to its cause before you retry. “Could not create directory” means a permissions or disk problem, and “Download failed. Unauthorized.” means a license problem.

    The update button is the easy part. WordPress’s own Updates screen warns that any changes made to theme files will be lost, and that warning covers most of the damage people see afterward: a header gone, a mobile menu that stops opening, a custom template back to the theme author’s version. The site still loads, so nobody notices until a customer does.

    This guide covers the dashboard update, the manual route, premium themes, what to check afterward, and how to read the error when an update fails.

    Answer three questions before you click update

    A theme update is low risk when nobody has edited the theme and the site is simple. It carries more risk when the theme has been customized, when it is a premium theme with a license, or when the site is a store. Three questions tell you which case you are in.

    Where do your customizations live? If someone edited style.css, functions.php or a template file inside the parent theme, including through Appearance > Theme File Editor, the update overwrites those edits without warning you. Before you update, move them into a child theme (for PHP and templates), a small site-specific plugin (for code snippets) or Appearance > Customize > Additional CSS (for styling). Setting up a child theme does not move existing edits into it. You have to find each edit, copy it across and test it. Our guide to theme customization that survives updates covers where each kind of change belongs.

    Where does this theme get its updates? Free themes from the WordPress.org directory update through the dashboard. Themes bought on the WooCommerce Marketplace update through the WooCommerce.com Update Manager. Other premium themes update through their vendor’s license, which is usually tied to one domain.

    Can you get back? Take a backup of the database and the whole wp-content folder. WooCommerce’s update guide gives the same scope for a manual store backup. Then confirm you can actually restore it. A backup you have never restored is a guess.

    For a store or a heavily customized site, run the update on a staging copy first. If your host offers one-click staging, use that. Otherwise a staging plugin will do the job.

    How to update a theme from the dashboard

    You need an administrator login. No hosting access is needed unless WordPress asks for FTP credentials, which is covered in the errors table below.

    1. Go to Appearance > Themes. A theme with an update available shows a notice on its card. Click the card, then View details to read the changelog. Look for a major version jump, a new minimum PHP version or a new required plugin.
    2. Take and confirm your backup.
    3. Click Update now on the theme card. The other route is Dashboard > Updates: tick the theme under Themes, then click Update Themes.
    4. Wait until the screen confirms the update is done. Closing the tab while it runs is how sites end up stuck in maintenance mode.
    5. Clear every cache layer: your caching plugin, the host’s server cache, and any CDN. Then open the site in a private browser window.

    You do not need to deactivate a child theme to update its parent. Leave the child theme active and update the parent.

    WordPress Themes screen showing a theme update available notice
    An update banner appears directly across the theme card, alerting you to new versions before you perform the update. · Source: www.hostinger.com

    Theme updates and plugin updates share most of their mechanics: the same Updates screen, the same maintenance file, the same permission failures and rollback tools. If you would rather not run this cycle yourself, SiteSelf handles WordPress plugin and theme updates on request through chat, and anything that touches theme files needs hosting access.

    Premium themes follow the vendor’s channel

    A premium theme that shows no update usually has a license or connection problem. The theme itself is rarely at fault. For WooCommerce Marketplace themes, WooCommerce’s troubleshooting page lists the usual causes: an expired subscription, the wrong or disconnected WooCommerce.com account, a key assigned to another site, a missing Update Manager, a blocked REST API (load yourdomain.com/wp-json/ and you should see JSON), Plain permalinks, WP-Cron not running, a firewall or security plugin, or restrictive file permissions.

    Other vendors bind the license to a domain. After a migration, or on a staging copy, updates can fail with “Download failed. Unauthorized.” until you register the license again for the current URL.

    Updating manually with a ZIP

    The manual route is fine when the dashboard update is not offered, for example with a premium theme you downloaded from the vendor. Go to Appearance > Themes > Add New > Upload Theme and upload the ZIP. When WordPress recognizes the theme is already installed, choose Replace current with uploaded.

    Three mistakes cause most manual failures. The first is uploading the vendor’s full package (theme plus documentation) instead of the installable theme ZIP, which returns “No valid themes found” or a missing style.css error. The second is extracting the ZIP first. The third is deleting the old theme before you upload, which WooCommerce’s theme update guide warns loses your customizations.

    Uploading the theme folder over FTP into /wp-content/themes/ also works. Treat it as a workaround: if the dashboard update failed, the reason it failed is still there.

    What a correct result looks like

    A finished update shows the new version number on the theme’s card under Appearance > Themes. On the site itself, check the pages that earn money or leads, not just the homepage:

    • Header, footer and menus, including the mobile menu at phone width.
    • One post, one page, an archive and the 404 page.
    • Every form, with a real test submission.
    • Your browser console and the PHP error log, for new warnings.

    Stores need more. WooCommerce’s update guide lists product pages, cart, checkout, payments, shipping, taxes and emails. Then open WooCommerce > Status > System Status and scroll to Templates. If your theme overrides WooCommerce templates and those copies are now outdated, they are flagged there. Update the override to match the current template, or remove or rename it so WooCommerce falls back to its default.

    WooCommerce System Status Templates section flagging outdated theme overrides after a theme update
    The WooCommerce System Status report highlights overridden template files in red when their bundled versions lag behind the core release. · Source: forum.bricksbuilder.io

    Some breakage stays invisible. In one project’s GitHub issue, an Avada site came through an update with “nothing visibly broken,” yet its pages grew to about 1.46 MB of raw HTML, up from about 0.3 MB. A quick page-weight or speed check after the update catches this kind of regression.

    Should you turn on theme auto-updates?

    WordPress lets you enable auto-updates per theme from Appearance > Themes. That makes sense for an unedited theme on a simple site with working backups. It makes less sense for a store, a site with template overrides or a page builder, or any site where a broken checkout costs revenue before anyone notices.

    Professionals are split. In MelaPress’s 2025 survey of 264 professionals, 32% of web designers and 33% of web developers used automatic updates. Agencies commonly stage risky updates (page builders, WooCommerce, major versions), batch the low-risk ones and keep a 24 to 48 hour rollback window. Waiting forever carries its own risk: a site several major versions behind is much harder to bring up to date than one that has been updated regularly.

    What to do when the update fails

    Read the exact message before you retry anything. Each message points to a different cause.

    What you seeLikely causeFix
    “Could not create directory”, or WordPress asks for FTP detailsFile ownership or permissions on wp-content/themes and wp-content/upgrade, or a full diskAsk your host to correct ownership and check disk space. Don’t open permissions across the whole site.
    “There has been a critical error on this website.”A PHP, plugin or page-builder conflict with the new versionUse the recovery-mode email link, read wp-content/debug.log, test on a default theme, then deactivate plugins one at a time.
    No error, but custom layout or features are goneEdits in the parent theme were overwrittenRestore the old theme files from backup, move the edits into a child theme, then update again.
    “Download failed. Unauthorized.”License expired or registered to another domainRenew, or register the license again for this URL.
    “Briefly unavailable for scheduled maintenance. Please check back in a minute.”An interrupted update left a .maintenance file behindDelete .maintenance from the WordPress root (not the theme folder), then run the update again.
    “Destination folder already exists” or “No valid themes found”Wrong ZIP, or the upload collided with the existing folderUpload the installable ZIP and choose Replace current with uploaded.
    Site looks unchanged, or oddly styledCachePurge the plugin, server and CDN caches, then check in a private window.

    Deleting .maintenance brings the site back but does not finish the update. Confirm the version number afterward. For a white screen or critical error, our guide to fixing a WordPress white screen walks through the isolation steps.

    Stop and get help when the error log names the theme and you cannot tell what changed, when a restore fails, or when checkout is affected on a live store. Stacking more changes on top of a failure you don’t understand makes the cause harder to find.

    WordPress stuck in maintenance mode after a failed theme update
    Encountering this maintenance message typically indicates that an interrupted update failed to automatically delete the temporary maintenance file from the site root. · Source: kinsta.com

    How to roll back a theme update

    Since WordPress 6.3, if a manual theme update fails partway through, WordPress restores the previous version, which it keeps temporarily in wp-content/upgrade-temp-backup/themes/. That covers a broken install. It does nothing when the update installs cleanly and the new version is the problem.

    For that case you have two options. WP Rollback reverts any theme from the WordPress.org directory to an earlier version. It does not cover premium themes. For everything else, restore the backup you took before updating. Once the site is back, reproduce the problem on staging and fix the cause before you try the update again.

    Frequently asked questions

    Will updating my theme delete my posts and pages?

    No. Posts, pages and media are stored in the database and uploads folder, not in the theme. The update puts code edits inside the theme’s folder at risk, and it can change how the site looks. Customizer settings are stored separately from theme files.

    Do I need to update my child theme when the parent updates?

    Not if it only holds small CSS or function tweaks. If it contains copied template files, or code that depends on the parent’s class names, compare those files against the new parent after a major release. The ColorMag threads on wordpress.org show child-theme sites breaking after a major update that changed classes.

    Why did I lose customizations even though a child theme was active?

    The edits were never moved into the child theme. Creating and activating a child theme does not copy anything across from the parent. Restore the old parent files from backup, find the edits, and move them over by hand.

    Should I update core, plugins or the theme first?

    People disagree, and there is no official order. What matters more is updating risky items one at a time (the theme’s major releases, page builders, WooCommerce), so a failure points to one cause. Batch the low-risk updates.

    How do I stage a store update without losing new orders?

    Don’t push the staging database back to live, because orders keep arriving on production while you test. Test the update set on staging, then apply the same updates on production and run your checkout checks there.

  • How to do SEO on WordPress, step by step

    Key takeaways

    • Start with Settings > Reading and your server’s response headers. One leftover noindex from staging can hide the whole site, and some hosts add an X-Robots-Tag header that the WordPress checkbox never removes.
    • Run one SEO plugin and one sitemap. Two plugins writing titles, Open Graph tags or schema is one of the most common sources of duplicate output.
    • Choose Post name permalinks on a new site. On an established site, change URLs only when you have 301 redirects ready, or old links start returning 404s.
    • Check what the site actually serves (page source, headers, /robots.txt, the sitemap), not what the plugin says it saved.
    • In Search Console, “Excluded by noindex tag” is a setting you can fix. “Crawled – currently not indexed” usually points to the content, not the configuration.

    A WordPress.org forum poster once described 39 indexed pages, every one green in Yoast, a submitted sitemap and search engines allowed, and still nothing showed up in search. That thread sums up the whole topic. The settings were correct, and correct settings only get your site considered. Being considered and being found are separate problems.

    Doing SEO on WordPress means three jobs. Get a handful of technical foundations right. Confirm they took effect on the live site. Then do the ongoing work of publishing useful pages and linking them together. The first two take an afternoon. The third never ends, and it is where the results come from.

    What WordPress handles, and what stays your job

    Out of the box, WordPress core gives you a search visibility setting, a permalink setting and an automatic XML sitemap at /wp-sitemap.xml. An SEO plugin such as Yoast SEO, Rank Math or All in One SEO adds control over per-page titles, meta descriptions, canonical URLs and structured data. No plugin has been shown to rank a site better than another, so pick on workflow and price.

    What no plugin does is decide whether two pages compete for the same search, whether a page answers the question better than the pages already ranking, or whether anyone can reach it through your menus. Those decisions stay with you. If you are adding pages as you go, the basics of publishing pages Google can find apply to every one of them.

    What you need before you start

    • Administrator access to wp-admin. Every setting below lives under Settings or in the SEO plugin’s menu.
    • A verified Google Search Console property for the live domain. It is the only place Google tells you how it sees your pages.
    • A backup before you change permalinks, switch plugins or edit theme files.
    • Optional: a terminal or your host’s file manager for the header checks and any theme fixes.

    The setup, in the order that matters

    1. Make sure the live site can be indexed at all

    Go to Settings > Reading and find “Discourage search engines from indexing this site.” When it is ticked, WordPress adds a noindex, nofollow robots meta tag to every page. Visitors still see the site normally, which is why the setting survives unnoticed after launch. Untick it and save.

    WordPress Settings Reading screen with the search engine visibility checkbox for SEO
    Leaving the Search engine visibility checkbox unchecked in WordPress Reading settings ensures search bots are not blocked from indexing published pages. · Source: wordpress.org

    Then check two things the checkbox does not control. First, some hosts noindex staging sites with an X-Robots-Tag HTTP header as well as the WordPress setting. Kinsta’s documentation describes exactly this for its staging environments. If staging configuration was copied to production, the header can remain after you untick the box. Second, look at individual pages. Your SEO plugin can set noindex per page, per post type or for whole archives.

    Do not use robots.txt to keep pages out of Google. Google’s noindex documentation is explicit: Google has to crawl a page to see its noindex tag. If robots.txt blocks the URL, Google never reads the tag, and the page can still appear in results.

    2. Set permalinks once and redirect if you ever change them

    On a new site, go to Settings > Permalinks and choose Post name, so URLs read /pricing/ rather than /?p=123. WooCommerce stores have a separate “Product permalinks” section on the same screen. WooCommerce’s documentation recommends short structures with relevant words, and warns that a custom product base can conflict with a taxonomy base.

    On an established site, “switch to Post name” is not automatic advice. Changing the structure changes every existing URL, and old links from Google, email and social posts start returning 404s. If you must change it, map each old URL to its new one with a 301 redirect first. Google treats redirects as a strong signal of which URL you prefer.

    3. Install one SEO plugin and use one sitemap

    Pick one plugin and deactivate any other plugin that writes titles, meta descriptions, Open Graph tags or schema. Two plugins doing the same job produce duplicate tags. Yoast’s own help pages warn about Open Graph conflicts for exactly this reason.

    Most SEO plugins replace the core sitemap with their own. That is fine, as long as only one exists. In Yoast, the switch is under Yoast SEO > Settings > Site features > XML sitemaps, and content types you set to stay out of search are left out of the sitemap automatically. Yoast also advises deleting any physical sitemap.xml file left in the site root by an old plugin, because it can shadow the real one.

    A sitemap helps Google discover URLs. Google’s sitemap documentation says it does not guarantee crawling or indexing. A page that appears only in the sitemap, with no links from your menus or other pages, is still close to invisible.

    4. Write a real title and description for each important page

    Use the plugin’s fields under the editor, or set templates for whole post types. Each title should say what the page is, specifically: “Emergency plumbing in Leeds, same-day callouts” beats “Home | Services | Company Name.” Avoid template text repeated across dozens of pages.

    Set expectations accordingly. Google can rewrite title links, and its snippet documentation says the result text comes mainly from page content and only sometimes from the meta description. Write the description anyway, because it is the version you control, but do not spend hours on it.

    5. Pick one version of every URL

    The same page can exist at http and https, with and without www, with and without a trailing slash, and with tracking parameters. Choose the preferred form, redirect the others to it, and keep internal links and sitemap entries consistent with it. Your SEO plugin outputs a self-referencing canonical tag on each page by default. Leave that alone unless you have a reason.

    Manual canonicals are where this goes wrong. In one WordPress.org support thread, a Yoast post sitemap showed “This XML Sitemap contains 0 URLs.” Cache purges, a Cloudflare purge, disabling plugins and switching themes did nothing. The cause was hand-entered canonical URLs without trailing slashes on a site that used them. Removing them fixed it.

    6. Validate structured data, and expect eligibility only

    Your SEO plugin, WooCommerce or your theme outputs schema for articles, products and breadcrumbs. Run key pages through Google’s Rich Results Test, then URL Inspection in Search Console. Valid markup makes a page eligible for richer results. It does not guarantee them and it is not a ranking boost.

    Theme code causes duplicates as often as plugins do. In a GeneratePress forum case, breadcrumbs loaded twice and Search Console reported “Missing field ‘item’ (in ‘itemListElement’).” The cause was a child theme’s header.php calling wp_head() twice, so every plugin’s head output appeared twice.

    7. Measure speed with field data before you change anything

    Google’s Core Web Vitals thresholds for a good experience are Largest Contentful Paint within 2.5 seconds, Interaction to Next Paint under 200 milliseconds and Cumulative Layout Shift under 0.1. Google uses them in its ranking systems, and its page experience documentation also says good scores do not guarantee top rankings.

    WordPress sites are improving here. HTTP Archive’s 2024 Web Almanac found that the share of WordPress mobile sites passing all three metrics rose from 28% in 2023 to 40% in 2024. Check your own field data in Search Console’s Core Web Vitals report, find the failing template, and fix the specific cause: usually an oversized hero image, a heavy builder section or unneeded scripts. Adding a third optimization plugin on top of two others makes debugging harder and rarely helps.

    8. Connect Search Console and submit the sitemap

    Submitting the sitemap in Search Console is optional, and it is worth doing because you then get a report of what Google fetched. Use URL Inspection on your homepage and two or three key pages. It shows whether Google can crawl the page, which canonical Google chose, and whether a noindex was found.

    Google Search Console URL Inspection result for a WordPress page
    The URL Inspection tool in Google Search Console confirms whether a specific page is crawled and successfully indexed in search results. · Source: developers.google.com

    How to confirm the settings actually reached the live site

    A plugin’s “Settings saved” message tells you what is in the database. It does not tell you what the site serves. Caching, host rules, security plugins and theme code all sit between the two. Check the output directly, logged out, after clearing your cache:

    # Any robots header added by the server or host
    curl -sI https://example.com/ | grep -i x-robots-tag
    
    # The robots meta tag and canonical in the served HTML
    curl -s https://example.com/ | grep -iE 'name="robots"|rel="canonical"'
    
    # What robots.txt really says
    curl -s https://example.com/robots.txt

    No terminal? Open the page, choose View Page Source, and search for robots and canonical. Then open /robots.txt and your sitemap URL in a private window.

    A correct result: no noindex anywhere on pages you want found, one canonical tag per page pointing at the URL you chose, one title tag, one set of Open Graph tags, a robots.txt that does not disallow those pages, and a sitemap that lists real URLs in the same format as your canonicals. Repeat this after every plugin update, theme change or migration. Updates occasionally change defaults, and nothing on screen tells you when they do.

    WordPress page source showing robots meta tag and canonical link for SEO checks
    Inspecting the rendered page source reveals the exact canonical link and robots directives delivered to search engines. · Source: rankmath.com

    What to do if Google still is not showing your pages

    Read the exact status in Search Console’s Pages report, because each one points somewhere different.

    • “Excluded by ‘noindex’ tag.” A technical block. Find where the noindex comes from: the Reading setting, a page-level plugin setting, an archive default or a host header. Remove it, then request indexing.
    • Sitemap “Couldn’t fetch.” Open the sitemap yourself. Common causes are Plain permalinks (one forum poster fixed a sitemap 404 by switching to Post name), two sitemap sources, a stale physical file, or a security rule blocking Googlebot.
    • “Crawled – currently not indexed.” Usually not a setting. Google fetched the page and decided it was not worth indexing yet. Resubmitting the sitemap will not change that. Make the page more distinct and more useful, and link to it from pages Google already values.

    If a plugin misbehaves in a way you cannot explain, test for conflicts one plugin at a time on a staging copy. The steps for isolating a plugin that is not working apply here too.

    The part that moves rankings: pages worth finding

    Google’s guidance on helpful content says its systems favour reliable, people-first content, written from first-hand knowledge. In practice that means one page per real question, answered better than the pages already ranking, with headings a reader can scan.

    Practitioners on X and Reddit repeat one method so often it is worth trying, though nobody has controlled data for it. In Search Console’s Performance report, filter for queries where you sit around positions 4 to 20 and sort by impressions. Those pages are already close. Answer the query more fully, fix a weak title, and add internal links from related pages. That usually beats writing another near-duplicate post.

    Three smaller habits help. Write alt text that describes informative images, and use alt="" for decorative ones, as the W3C images tutorial recommends, rather than stuffing keywords. Keep tags and categories purposeful, because a tag per post creates hundreds of thin archive pages. And do not noindex every archive by default either, because older posts can lose their only crawl path.

    Give it time. Forum replies to owners with correct setups say competitive searches can take months. The r/marketing commenters in the research put it at three to six months before anything shows. Measure impressions and clicks in Search Console, not the plugin’s score.

    When to stop and get help

    Get a developer or your host involved when a noindex or X-Robots-Tag header persists after you have removed every setting you can find, when duplicate tags come from theme files, when a migration or domain change needs a redirect map, or when a security plugin or firewall is returning 403 errors to the SEO plugin. Those are code, server and hosting problems, not settings. If what you want off your plate is the routine part (titles, descriptions, redirects, plugin settings), SiteSelf handles WordPress SEO changes from chat: it works through its connector plugin for settings and content and needs hosting access for header or theme fixes, then fetches the changed page and reports what it found.

    Frequently asked questions

    Can I do SEO on WordPress without a plugin?

    Partly. The visibility setting, permalinks and the core sitemap at /wp-sitemap.xml are free and built in. Per-page titles, meta descriptions and canonical control normally come from a plugin, and the free versions of the major ones cover those basics.

    Which SEO plugin is best?

    No evidence shows one plugin ranks sites better than another. Choose on interface, the features you actually use and licensing cost across your sites. Whichever you pick, run only one.

    Does a green plugin score mean I will rank?

    No. The score checks things like keyword placement and length on one page. It knows nothing about competing pages, links or whether your content answers the search better than what already ranks.

    Do I need to submit my sitemap to Google?

    No, Google can find it through robots.txt and links. Submitting it in Search Console is still worth doing, because you get a report on whether Google could fetch it and how many URLs it read.

    Should I change my permalinks to Post name on an old site?

    Only if the current structure causes a real problem, and only with 301 redirects from every old URL. Otherwise you trade a cosmetic improvement for broken links and lost signals.

    How is WooCommerce SEO different?

    Product permalinks have their own settings, product schema comes from WooCommerce or your SEO plugin and needs validating, and near-identical product descriptions compete with each other. Filling in every metadata field is not enough on its own. Distinct product pages and guides that link to them do more.