Blog

  • How to make a mobile friendly website on WordPress

    Key takeaways

    • Google recommends responsive design, meaning one site and one URL that adapts to the screen. Separate mobile themes like WPtouch take the opposite approach.
    • Most sideways scrolling comes from one element with a fixed width, such as a logo, header column or paragraph. Find that element and fix it. Don’t put overflow: hidden on the whole page.
    • Test at 320 CSS pixels wide, the width WCAG 2.2 Reflow uses. Make tap targets at least 24 by 24 CSS pixels, the WCAG AA minimum.
    • Google retired the Mobile-Friendly Test in December 2023. Use a real phone, Search Console URL Inspection and PageSpeed Insights instead.
    • Speed is a separate job. In HTTP Archive’s 2025 Web Almanac, only 45% of WordPress sites passed Core Web Vitals on mobile.

    The usual complaint is “it looks fine on desktop and awful on my phone.” The usual fix is smaller than people expect. Most themes made in the last several years are already responsive. One element, plugin setting or stale cache is breaking them.

    Google indexes and ranks the mobile version of your pages. Its mobile-first indexing guide calls responsive design the easiest setup to build and maintain: one site and one URL, with the layout adapting to the screen. Everything below works toward that. If you already know which CSS rule you need, our guide to CSS media queries for mobile goes deeper.

    What you need before you start

    You need an admin login and a phone. Most fixes can be made in the block editor or with Additional CSS. Classic themes have Additional CSS under Appearance → Customize. Block themes have it in the Styles panel of the Site Editor. Editing theme files needs a child theme or hosting access. Take a backup first, and try larger changes on a staging copy if your host provides one.

    Step by step: making the site work on phones

    1. Write down what is actually broken

    Open your most important pages on a real phone. That means the homepage, a service or product page, the contact form and, for stores, cart and checkout. For each problem, note the page, the screen width and the symptom, for example: “Contact page, 390px, submit button hidden behind sticky bar.” Then open Chrome DevTools, turn on the device toolbar and set the width to 320px. That is the width WCAG 2.2 Reflow uses. Content should read at that width without scrolling in two directions.

    Google retired the Mobile-Friendly Test and the Search Console Mobile Usability report in December 2023. Older guides still send people to them. Use URL Inspection in Search Console to see how Google renders a page.

    2. Confirm the theme is responsive and the viewport tag is there

    View the page source and look for this line in the <head>:

    <meta name="viewport" content="width=device-width, initial-scale=1">

    Current themes almost always include it. Without it, phones draw a desktop-width page and shrink it. With it, fixed-width elements still overflow, so the tag alone isn’t enough. Don’t add maximum-scale=1 or user-scalable=no. W3C mobile accessibility guidance says to avoid them, because they stop people from zooming.

    If the theme has no mobile layout at all, it’s a theme decision. See the section on rebuilding below.

    3. Find the element that is wider than the screen

    Sideways scrolling, or a white strip down the right side, almost always comes from a single element. Paste this into the DevTools console at phone width:

    document.querySelectorAll('*').forEach(el => {
      if (el.offsetWidth > document.documentElement.clientWidth) console.log(el);
    });

    The usual suspects are a logo with a pixel width, a header split into fixed columns, an image or embed with inline sizes, and an animation that slides in from off-screen. Remove the fixed width, or override it at narrow widths:

    img, video { max-width: 100%; height: auto; }
    
    @media (max-width: 600px) {
      .site-logo img { width: 160px; }
      .wide-box { width: auto; }
    }

    Don’t reach for overflow: hidden on the body. In one WordPress.org support thread about an Elementor header, that rule removed the side margin but clipped the mobile menu down to one visible item. If custom CSS has piled up, remove it and add it back one rule at a time until the problem returns.

    4. Use the responsive controls WordPress already has

    In the block editor, select a Columns block and check that “Stack on mobile” is on. WordPress 7.1 adds responsive styles to block themes. You can set a block’s font size, padding and other settings separately for mobile and tablet. Set them per block type under Appearance → Editor → Styles → Blocks, or per block in its Responsive styles view.

    The limits trip people up. Responsive styles only work in block themes. Tablet values don’t carry over to mobile, so set mobile on its own. Some toolbar controls, such as text alignment, still apply at every size. Your theme’s breakpoints may also differ from the defaults. Page builders keep their own per-device settings, and a margin set on desktop may need changing again on mobile.

    5. Check embeds, tables and text inside images

    A responsive page can still hold a video that doesn’t resize. If you control the theme, opt in with add_theme_support( 'responsive-embeds' );. The Block Editor Handbook lists this as an opt-in feature, so it is off by default. Wide tables are one of the exceptions in the Reflow guidance. They can scroll inside their own box while the page stays put:

    .wp-block-table { overflow-x: auto; }

    Text baked into an image shrinks with the image until nobody can read it. Put the words in a Cover block or a heading instead.

    6. Make menus, buttons and forms work with a thumb

    WCAG 2.2 Target Size (Minimum) sets 24 by 24 CSS pixels as the AA minimum for anything people tap, with some exceptions. Treat that as the floor. Bigger and better-spaced is easier. Open and close the menu, then fill in each form with your thumb. Watch for a keyboard or sticky bar covering the submit button, labels that vanish once you start typing, and error messages that appear off-screen. Use type="email" and type="tel" on fields so phones bring up the right keyboard.

    7. Keep the mobile content the same as desktop

    Hiding blocks on mobile is tempting. Google warns that primary content missing from the mobile version, or loaded only after a tap or swipe, may not be indexed. Titles, meta descriptions and structured data should match desktop too. Hide decoration, not prices, contact details or copy. Accordions and tabs are fine as long as the content is in the page.

    Don’t force the desktop layout onto phones either. A WordPress.org volunteer explained the reason to an owner who wanted exactly that: visitors end up zooming and scrolling sideways. Mobile-specific CSS is the better fix.

    8. Test the store pages separately

    A theme can handle blog posts well and still struggle with WooCommerce. WooCommerce’s guide to choosing the right theme says to check every store page, including My Account, cart and checkout. On a phone, choose a product option, change the quantity and get as far as payment.

    9. Clear every cache layer

    “My fix didn’t work” often means “I’m looking at old CSS.” Purge your caching plugin, then your host’s cache, then the CDN, then your browser. Clearing one layer can leave another serving the old version. Our guide on a WordPress page not updating walks through the order.

    10. Treat speed as its own job

    A layout can fit perfectly and still be slow on mobile data. HTTP Archive’s 2025 Web Almanac found that 45% of WordPress sites passed all Core Web Vitals on mobile. Google’s “good” thresholds are LCP within 2.5 seconds, INP below 200 milliseconds and CLS below 0.1.

    Start with images. Resize them to the size they actually display at, use WebP and lazy-load images below the fold. Don’t lazy-load the hero image, because that delays LCP. Then look at third-party scripts and heavy plugins. Our guide to optimizing pictures in WordPress covers the image side.

    What a correct result looks like

    At 320px and on your own phone, nothing scrolls sideways. Text reads without pinching. The menu opens, closes and shows every link. Forms submit and show their errors next to the right field. The store pages work through to payment. URL Inspection shows Google the same content as desktop. A good PageSpeed score doesn’t prove the menu works, and a poor one doesn’t mean the layout is broken. Check both.

    If it still breaks after the fix

    Suspect an optimisation or plugin setting before you suspect the theme. In one TablePress support thread, horizontal scrolling on mobile stopped working because of SiteGround Optimizer’s “Combine JavaScript Data” setting. Turning it off fixed the problem. On a staging copy, turn off one suspect at a time, such as JS combining, CSS combining or animations, and retest after each. Turning an optimisation off can lower your speed score. Keep that tradeoff in mind instead of switching everything off.

    When the theme isn’t worth retrofitting

    Sometimes the theme stacks everything into one column that looks wrong, or it has no mobile layout at all. At that point you are fighting the theme with overrides. Nobody has good data on when rebuilding beats retrofitting. A useful test: if most of your fix list is “override the theme’s layout,” the theme is the problem. If it’s a handful of elements, fix the elements.

    When to stop and get help

    Stop if the fix needs theme files and you have no backup, if checkout is affected, or if you have been turning plugins on and off on the live site for an hour. If you’d rather describe the problem, for example “the menu on the contact page is cut off on phones,” and have someone make the edit and check it, SiteSelf handles website edits through chat. Pages owned by Elementor, Divi or Beaver Builder are refused, and you are told why.

    Frequently asked questions

    Is there a plugin that makes WordPress mobile friendly?

    Not in the sense people hope for. Your theme and CSS decide whether the site is responsive. Plugins like WPtouch serve a separate mobile theme to phones. That is the opposite of the responsive approach Google recommends, and it needs careful cache setup. Mobile menu plugins can fix the menu, but nothing else on the page.

    Do I need a separate mobile version of my site?

    Generally no. Google recommends responsive design because separate mobile setups add ways to fail: redirects to the wrong page, missing content and metadata that doesn’t match. Edits made on desktop also get missed on the mobile copy.

    Is a resized desktop browser good enough for testing?

    It’s good for finding layout overflow quickly. It won’t show the keyboard covering a button, how a tap feels or how the page behaves on mobile data. Check the important pages on at least one real phone before calling them done.

    What text size should I use on mobile?

    No standard sets a single number. Many themes use 16px body text as a sensible default. The test that matters is whether text reflows at 320px and when zoomed without forcing sideways scrolling.

    Will fixing mobile break my desktop layout?

    Not if you put the changes inside media queries for narrow widths, or use the mobile settings in your blocks. Changes made outside a media query apply everywhere. That’s why you should check desktop again after each fix.

  • 504 HTTP code on WordPress and how to fix it

    Key takeaways

    • Each layer has its own limit: nginx, a host proxy, PHP, PHP-FPM, the CDN. In one WordPress.org thread, nginx allowed 300 seconds and the request still died at 60.
    • The action may have finished anyway. A menu save that returned a 504 had saved, and a checkout that timed out still sent its order email, so check before you retry.
    • On a store, look up the payment in your gateway’s records and in WooCommerce → Status → Logs before telling a customer to try again.
    • Raise a timeout only at the layer the logs point to. One user fixed a bulk image job by raising a cPanel proxy timeout from 300 to 1,200 seconds.
    • If many unrelated URLs time out together, look at PHP worker capacity before blaming one plugin.

    A 504 Gateway Timeout means a server that passes requests along, such as nginx, your host’s proxy or a CDN, waited for the server behind it and gave up. RFC 9110, the HTTP standard, defines it like that: a gateway or proxy did not get a timely response from an upstream server it needed. On a WordPress site, that upstream is almost always PHP running WordPress, and behind PHP sits the database or a remote service.

    So the code tells you where the waiting stopped. It doesn’t tell you what was slow. The most common mistake is to raise a timeout before working out which layer gave up and what work was taking so long. If you are seeing 503s as well, our explainer on what a 503 response code means covers the code that looks the most like this one.

    How is a 504 different from a 502 or 503?

    All three are server-side errors, but each one blames a different part of the chain. The table shows where each one sends you first.

    CodeWhat happenedWhere to look first
    502 Bad GatewayThe upstream answered, but the answer was broken or unusablePHP error log, crashed PHP processes
    503 Service UnavailableThe server said it can’t take the request right nowMaintenance mode, overload, resource limits
    504 Gateway TimeoutThe upstream didn’t answer before the gateway’s limit ran outWhich request hung, and which layer ended it
    524 (Cloudflare only)Cloudflare’s own timeout waiting for your originYour origin server, not Cloudflare

    The error page won’t tell you whether your host, a plugin, the database or a payment API was slow. It can also look different depending on who generated it: “504 Gateway Time-out (nginx)”, “Update failed: 504 Gateway Timeout” in the admin, an import plugin’s error line, or a checkout that spins and then fails.

    Why the action may have worked even though you saw an error

    A 504 means the gateway stopped waiting. PHP may keep going after that. In one WordPress.org thread, a menu save returned a 504 after about a minute, but the menu had been updated. In a WooCommerce thread, checkout hung for 60 seconds and showed “Gateway Timeout”, and the order email still arrived.

    That changes what you do next. Don’t refresh a heavy request over and over. Every retry can start another copy of the same slow work, take another PHP worker and make the queue longer. Check what happened first: did the post save, did the import write rows, did the payment go through.

    Step one: find the exact request that timed out

    Most of the diagnosis comes before you change a single setting. Collect these facts while the error is fresh:

    1. Write down the URL, the action and the time. “Saving the main menu at 14:32”, not “the admin is broken”.
    2. Open the browser’s Network panel (right-click, Inspect, Network), repeat the action once and find the red 504 row. Note the request URL, such as /wp-admin/admin-ajax.php, /wp-json/... or ?wc-api=..., and how long it ran before failing.
    3. Work out the scope. One action or many URLs? Admin only, or the front end too? Every time, or only some of the time?
    4. Look at the duration. If failures keep stopping at about the same number of seconds, that number is a configured limit. It points you to the layer that set it.
    5. Get the logs for that timestamp. You need the access log, the error log, the PHP error log and, if you can get it, the database slow-query log. On shared or managed hosting, ask support to match your URL and time against their logs and tell you which component returned the 504.

    Kinsta’s server-errors documentation recommends the same thing: match the time and URL of the failure to the access and error logs. If you want PHP errors from WordPress too, turn on private logging in wp-config.php above the “stop editing” line:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );

    Errors then go to wp-content/debug.log and visitors don’t see them. WordPress’s debugging handbook says these tools are meant for local or staging sites, so turn them off when you are done. In one Stack Overflow case, reinstalling and deactivating plugins did nothing, and the debug log showed the exact line that was breaking.

    What usually causes a WordPress 504, and the fix for each

    Nobody publishes data on how often each cause happens. The order below follows how often each one turns up as the confirmed answer in WordPress.org, Stack Overflow and Reddit threads. That partly reflects which fixes are easy to report, so treat it as a place to start, not a ranking.

    A plugin doing too much work in one request

    This is the usual cause when the 504 hits one action, especially in wp-admin, and the rest of the site works. Admin requests skip the page cache and run admin-only plugin code, so a slow hook shows up there first. In the Nav Menu Roles thread, deactivating the plugin turned a save that timed out after about a minute into a two-second save.

    Scale can make this worse. A plugin that is harmless on 500 posts can rewrite every post on every dashboard load when you have tens of thousands. One detailed 2026 write-up described a post-ordering plugin doing exactly that. The 504 looked like a failed login.

    Fix: use the Health Check plugin’s troubleshooting mode. WordPress’s support handbook explains that it turns off plugins and switches to a default theme for your logged-in session only, so visitors keep seeing the normal site. Turn plugins back on one at a time until the 504 comes back. Then update, configure, replace or report the plugin. Turning it off for good is a workaround, not a fix.

    A long job running inside a browser request

    Imports, backups, migrations, security scans and bulk image optimization all try to do minutes of work inside one web request. Messages like “Import Error 504 Gateway Time-out” come from this.

    Fix: make the work smaller or move it out of the browser. Kinsta recommends WP-CLI or scripts for imports, exports and bulk operations. Use the plugin’s batch or chunk settings if it has them. For Duplicator, its documentation suggests directory filters, a different database build method or the DupArchive engine, which has a 500 MB limit in the free Lite version. Duplicator’s Max Build Time limits only the plugin’s own build. It does not lift your host’s limits.

    A slow external service

    Some plugins call out to SMTP servers, payment gateways, shipping APIs or licence servers while the page waits. If that service is slow, the whole request waits with it. In the WooCommerce checkout thread, turning off the SMTP plugin made checkout work but stopped all order emails. Trying other SMTP plugins didn’t help. Switching from the SMTP server to a mail API service fixed it.

    Fix: find which remote call is hanging and replace it, cache its result or give it a shorter deadline. Turning off the feature only hides the symptom.

    PHP workers are all busy

    If many unrelated URLs return 504 at the same moment, think capacity before you think plugin. Kinsta’s documentation explains that requests can queue while they wait for a free PHP thread, then time out. Requests that visitors have already abandoned can still be holding workers.

    Fix: find out what is filling the workers, such as uncached traffic, a bot or one slow endpoint called over and over. In one thread, restarting PHP-FPM brought a site back after renaming the plugins folder did not. That restart is a host or server task, and it clears the jam without explaining it. More workers need more memory, so a plan upgrade without a diagnosis can cost more and change nothing. One store on a 6-core, 12 GB plan still had 504s.

    The limit was raised at the wrong layer

    Every layer between the visitor and the database has its own clock, and whichever runs out first sends the error. In one WordPress.org thread, a scan of about 150,000 files kept dying at about 60 seconds. Nginx was set to 300 seconds, and raising PHP’s max_execution_time made no difference. Duplicator’s documentation makes the same point: if PHP limits are already high and the problem continues, the web server’s timeout may be the one cutting the request off.

    LayerSettingWho usually changes it
    PHPmax_execution_timeYou (php.ini or host panel), if the host allows it
    PHP-FPMPool and request time limitsHost or server admin
    Nginxproxy_read_timeout, fastcgi_read_timeoutHost or server admin
    Host proxy (for example cPanel’s)Proxy timeoutHost
    CDNOrigin response timeoutCDN plan and settings

    The nginx documentation gives proxy_read_timeout a default of 60 seconds. It measures the gap between two reads from the upstream, not the total time the response takes. Hosts often change these values, so a repeating 60-second failure is a clue, not proof.

    Fix: raise a limit only at the layer the logs point to, and only for work that really needs the time. In one thread, a bulk image job failed at 60.081 seconds and worked once the cPanel proxy timeout went from 300 to 1,200. Raising limits everywhere just lets slow work hold workers for longer.

    A CDN in front of the site

    A CDN can have a shorter timeout than your origin server. Cloudflare reports its own timeout as 524, not 504, and its “Host Error” page points at your server. A CDN won’t fix a slow origin. It only caches pages for anonymous visitors, which is why the homepage can load fine while wp-admin and checkout time out.

    A 504 at checkout: check the payment before anything else

    On a WooCommerce store, a checkout that times out can still have charged the customer. One WordPress.org case with Stripe and PayPal shows exactly that: the payment went through, but the request back to the store returned 504 and the thank-you page never loaded. If the customer tries again, you can end up charging them twice.

    WooCommerce’s troubleshooting guide for orders gives the order of checks. Open the order and read its status and notes. Search the payment gateway’s own records for the transaction. Read the gateway log under WooCommerce → Status → Logs. If the gateway shows a charge but the order is still pending, check the webhook or callback setup and match the two up before you ship anything. Only then tell the customer what to do.

    When to stop and get help

    Stop guessing once you have the URL, the time and a scope, but no logs. At that point the fix sits with whoever can see the server: your host for proxy, PHP-FPM and resource limits, or a developer for plugin code and slow queries. Send them the request, the timestamp, the duration and what you have already ruled out. If a store migration or plugin update stalls partway, don’t mark steps as complete by hand to get past the timeout. Keep the backup and get help.

    If you’d rather hand over the whole job, SiteSelf’s WordPress troubleshooting and bug fixes work starts from the error on your live site: with hosting (SSH) access it reads the logs, makes the fix, fetches the page again and tells you in chat what changed. For other errors, the guide to why WordPress is not loading sorts problems by what you see on screen.

    Frequently asked questions

    Is a 504 my host’s fault or my site’s?

    The code alone can’t tell you, and in public threads the answer goes both ways. Some 504s come from a plugin’s admin code, others from a crowded server. The logs decide it, so ask your host to match your URL and timestamp against them before you change plans or blame anyone.

    Why does the 504 still happen after I raised max_execution_time?

    Another layer is probably ending the request first, such as nginx, the host’s proxy or PHP-FPM. If the error still arrives at the same number of seconds after your change, you changed the wrong clock. Ask the host which component returned the 504.

    Why does it happen only in wp-admin?

    Admin pages skip the page cache and run plugin code that never runs for visitors. A fast cached homepage doesn’t mean the server behind it is healthy. Test with Health Check’s troubleshooting mode to find which plugin’s admin code is slow.

    Will a CDN or better hosting fix a 504?

    A CDN caches pages for anonymous visitors. It doesn’t make slow PHP faster, so admin pages and checkout still time out. Bigger hosting helps when the logs show the server is out of capacity, and does nothing for a plugin stuck in a loop.

    Will moving away from WordPress stop the timeouts?

    Not on its own. Replies in r/webdev made the point that heavy work times out on any framework if it runs inside a web request. The fix is the same anywhere: batch the work, queue it or run it from the command line.

    Is there a fix for a 500 error that hides a 504?

    Some hosts show a generic 500 page while their access log records a 504. If the 500 steps don’t help, ask what the access log recorded for that request. Our guide to fixing a server error 500 covers the real 500 cases.

  • WordPress maintenance mode plugins and when to use one

    Key takeaways

    • “Briefly unavailable for scheduled maintenance” comes from a .maintenance file that a WordPress update creates. Deleting that file takes the screen down, but the update still isn’t finished.
    • Most reports of a plugin “not working” turn out to be caching or a logged-in bypass. Purge every cache layer, then test in a private window.
    • Google Search Central recommends a 503 status with Retry-After only when a site is fully down for one or two days. For longer closures, keep the site up and turn off functions such as the cart.
    • On a store, a simple on/off plugin is enough for an update window. Builder plugins only make sense when the holding page has a marketing job.
    • WooCommerce’s update guide puts the live store in Coming Soon mode during updates and keeps checkout closed until store workflows have been tested.

    Most people searching for a maintenance mode plugin want one of two things. Some want a holding page up while they change something. Others want to get rid of a maintenance screen they never turned on. These are different problems, and WordPress uses a different mechanism for each.

    Start by working out which one you have. The rest of this page covers choosing the right kind of plugin, checking that it tells search engines the right thing, and knowing when maintenance mode is the wrong tool.

    What does a maintenance mode plugin do that WordPress doesn’t?

    A plugin gives you a holding page you control, and it stays up until you switch it off. WordPress core only has a maintenance state tied to updates. When you update core, a plugin or a theme, WordPress writes a hidden file called .maintenance to the site root. Visitors then see “Briefly unavailable for scheduled maintenance. Check back in a minute.” The updater normally deletes the file when the update ends.

    A plugin’s maintenance mode is a saved setting. LightStart’s documentation says its mode is switched on and off manually in the plugin settings. Other plugins work the same way. As a result:

    • Deleting .maintenance does not turn off a plugin’s mode.
    • Switching a plugin off does not fix a failed update.
    • WP-CLI’s wp maintenance-mode activate, deactivate and status commands control core’s maintenance mode, not a plugin’s setting.

    You can usually tell them apart by eye. Core shows one plain line of text. A plugin shows a designed page with its own heading, a logo, and sometimes a countdown or a signup form. The 503 response code explained article has a table of which screen comes from which source.

    Why is my site stuck if I never installed a maintenance plugin?

    An update was interrupted before WordPress could delete .maintenance. Common causes include closing the browser tab, a timeout, low memory or disk space, wrong file permissions, and updating many plugins at once. Kinsta’s documentation lists bulk updates as a risk.

    WordPress’s Advanced Administration Handbook gives the fix. First, make sure no update is still running. Then delete .maintenance from the folder that holds wp-config.php, which is often public_html. You can do this with your host’s file manager or over SFTP. The file name starts with a dot, so you may need to turn on “show hidden files.”

    Deleting the file only takes the screen down. Your plugin or core files may still be half-updated. Go to Dashboard, then Updates, and run whatever didn’t finish, one item at a time. Our guide to fixing a failed WordPress update covers what to do if the update fails again.

    Core treats the file as expired once its timestamp is ten minutes old, according to the wp_is_maintenance_mode() reference. So if the screen lasts for hours, the file may not be the only cause. Common culprits are a cached copy of the 503 page, a site broken by the half-finished update, or a plugin’s own screen.

    If the site keeps getting stuck, another plugin may be interfering with the updater. In one WordPress.org support thread, updates stalled again and again, and clearing caches didn’t help. A moderator traced it to a starter-templates plugin that was blocking updates. The fix was to deactivate that plugin, update it, reactivate it, and then update everything else. Retrying the same bulk update without finding the cause just recreates the lock.

    Which kind of maintenance plugin fits the job?

    Pick the lightest tool that does the job. Plugins in this category range from a single switch to a full page builder, and the extra weight only pays off when you use it. Install bands below are from the WordPress.org directory.

    The jobWhat you needExample from the directory
    A 20-minute update windowAn on/off switch and a 503 statusSlim Maintenance Mode (10,000+ installs): no settings page, and only administrators see the site
    A branded holding page for an established businessA logo, a message and access rulesMaintenance by WebFactory (1,000,000+): a 503 status and a temporary page you edit in its settings
    A client reviewing work while the public sees a noticeA bypass by role or linkCMP by NiteoThemes (200,000+), recommended in r/Wordpress threads for its client bypass link
    A pre-launch page with a signup formA page builder and form handlingLightStart (400,000+), described on WordPress.org as a drag-and-drop page builder

    Practitioners in WordPress.org and Reddit threads keep asking for the same three things: a plain switch for update windows, preview access for clients, and the option to use an existing WordPress page as the holding page. The third request usually ends with someone suggesting custom code. Test before you trust any feature list, including the one above. Bypass rules and paid tiers change between versions.

    If you are writing the message itself, our coming soon text examples cover the difference between a launch announcement and a notice that the site is down.

    Why does the plugin look broken when it isn’t?

    Usually there are two reasons: you are logged in, or a cache is serving an old copy.

    You are logged in. Administrators bypass the holding page, and on some plugins any logged-in user does. Owners who test while signed in often decide the plugin “won’t publish.” Test in a private window or on another device. Note whether your plugin’s bypass applies to administrators only or to every logged-in account. On a store, every customer who logs in counts as a logged-in user.

    A cache is serving the old page. This can be a page cache plugin, your host’s server cache or a CDN. It explains both “I turned it on and nothing happened” and “I turned it off and visitors still see it.” In one resolved WordPress.org thread, the maintenance page stayed up after the plugin was deleted, and there was no .maintenance file. The cause was caching. LightStart’s FAQ advises turning off cache plugins while its mode is on, or clearing the cache after every change. Purge every layer each time you switch the mode on or off.

    On LightStart, check the exclusions too. Its documentation says exclusions match parts of URLs, so excluding / matches every page and opens the whole site. If you use a custom login URL, add it to the exclusions, or you may lock yourself out of the login page.

    What should the page tell search engines?

    Visitors read the page. Search engines read the status code. A page can look like a maintenance notice and still return 200 OK. Search engines then treat it as the site’s real content.

    Google Search Central gives specific guidance for closures:

    • If the site is fully down for one or two days, return a 503 with a best-effort Retry-After header and show a short, helpful page.
    • For longer closures, keep the site online and limit what it does, for example by disabling the cart.
    • Don’t block the site in robots.txt, return 403, 404 or 410, or use noindex to signal a temporary closure.

    A coming-soon page for a site that has never launched is a different case. It is common practice to serve it with a 200 status so it can be indexed as the real front page. Google’s closure guidance covers existing sites, not pre-launch pages.

    Check the response, not the preview. Open your browser’s developer tools, select the Network tab, and load a deep page (not the homepage) while logged out. Or run:

    curl -I https://example.com/some-page/

    The first line should read HTTP/2 503 (or HTTP/1.1 503). Look for a retry-after line too. LightStart’s changelog includes a fix for a 503 problem in its selected-page mode, which is a good reminder that a correct-looking screen doesn’t prove a correct status.

    How do you use maintenance mode around plugin updates?

    On a simple brochure site, you often don’t need a plugin. Core already blocks visitors for the few seconds each update takes. On a store, or any site where a half-updated page could take a payment or a booking, use maintenance mode on purpose.

    WooCommerce’s update guide sets out the order:

    1. Take a current backup.
    2. Test the updates on a staging copy first.
    3. Put the live store in Coming Soon mode so customers can’t check out while files and the database change.
    4. Run updates one at a time and wait for each to finish before refreshing, navigating away or starting the next.
    5. Run the WooCommerce database update when you’re prompted.
    6. Test the key store workflows: cart, checkout, and the payment method you use most.
    7. Reopen. If anything is wrong, keep checkout closed, restore from the backup if needed, and troubleshoot on staging.

    Step 7 is the one people skip. When the holding page comes down, all you have confirmed is that it’s gone. Load the checkout as a customer, then clear caches so nobody gets served the maintenance page.

    Not everyone wants to run this routine every month. SiteSelf handles plugin and core updates on request through chat: before it starts, it says what is about to change and whether that can be undone, and afterwards it reports what it checked on the live page.

    When is maintenance mode the wrong tool?

    A maintenance plugin is meant for short, planned pauses that visitors will notice. It doesn’t fit these jobs:

    • Weeks of rebuild work. In an r/woocommerce thread, practitioners advised building on staging and going live in a short window. Running a store behind a holding page for weeks risks search visibility. Copying a staging database over the live one can also wipe out orders placed in the meantime.
    • A month-long holiday closure. Use catalog mode, a notice, or mark products out of stock. This matches Google’s advice to limit functionality. Replies in the same community strongly advised against pointing DNS somewhere else.
    • Keeping a dev site out of Google. “Discourage search engines” relies on robots.txt and isn’t foolproof. A staging site needs real access control.
    • Migrations and server-level risk. A plugin only runs once PHP and WordPress have loaded. If the change can break WordPress itself, a static HTML page or a rule on the server is more reliable.

    Stop and call your host if the maintenance screen turns into “Error establishing a database connection” or 500-range errors that keep coming back. Learn WordPress’s debugging material for site owners treats those as signs of a wider server problem, not a plugin setting.

    Frequently asked questions

    How do I turn maintenance mode off?

    For a plugin, switch it off in the plugin’s settings, save, and purge every cache. For core’s update screen, delete the .maintenance file from the folder that holds wp-config.php, or run wp maintenance-mode deactivate. Then finish the interrupted update.

    Can I put WordPress in maintenance mode without a plugin?

    Not from the dashboard. Core’s only maintenance state is the temporary one it creates during updates. Developers sometimes write a small template or a server rule instead. That works, but someone has to maintain it, so most owners use a lightweight plugin.

    Does maintenance mode hurt SEO?

    A short closure with a 503 status and a Retry-After header is what Google recommends for one or two days. Problems come from long closures, a holding page served with 200 OK, or using noindex or robots.txt to hide the site. Check the status code before you leave it running.

    What’s the difference between coming soon and maintenance mode?

    Coming soon is for a site that hasn’t launched yet. Maintenance mode is a temporary outage on a site that already has visitors and search rankings. Practitioners on Reddit warn against using coming-soon mode on an established site, because it can cause indexing problems.

    Can my client preview the site while it’s hidden?

    Yes, if the plugin supports a bypass link or role-based access. Many plugins let only logged-in users through, so a client would need an account. Test the bypass with a real non-admin account before you send the link.

    Does maintenance mode protect the site during a security problem?

    No. The plugin runs inside WordPress, so an attack against PHP or the server reaches the site before the plugin loads. Use your host’s controls or a static page for that.

  • Fix WordPress permalinks that are not working

    Key takeaways

    • Click Save Changes under Settings → Permalinks without changing anything. That rebuilds WordPress’s rewrite rules, and after a migration or restore it is usually the whole fix.
    • A 404 page in your theme’s design means WordPress got the request. A bare white server error page means the server never handed the request over, so look at the server, not the dashboard.
    • Nginx never reads .htaccess. The fix there is a try_files rule in the server block, and on managed hosts like Kinsta that change goes through support.
    • Do not switch to a new permalink structure or WooCommerce product base to make 404s go away. Every existing URL changes, and old links break unless you add 301 redirects.
    • Redirect plugins cannot repair broken rewriting. Redirection’s own docs say it needs working permalinks before it can run.

    The homepage loads. wp-admin works. The editor still shows the post you published. But the link you just sent a customer returns “404 Not Found”, and so does every other post, page and product you try.

    That pattern means a routing problem, not missing content. Pretty URLs like /blue-shirt/ only work if two layers agree. WordPress needs a current set of rewrite rules, and the web server has to send each request for a path that is not a real file to WordPress’s index.php. The homepage needs no rewriting, which is why it still works. Your job is to find out which layer broke before you change anything. If the 404 is about one URL that moved, our guide to how WordPress slugs work is the better starting point.

    Which 404 are you looking at?

    Look at the error page before you touch a setting. If it shows your theme’s header, footer and styling, WordPress received the request and could not match it to content. That points at rewrite rules, the content itself or a plugin. If it is a plain white page that says “404 Not Found” with a server name like nginx at the bottom, the request never reached WordPress. That points at server configuration. WP Engine’s support docs make the same split between a WordPress-themed 404 and a default Nginx 404.

    Then check the scope:

    • Everything except the homepage fails. Rewrite rules or server routing. Keep reading.
    • One URL or a few fail. Open the item in the editor. Check that it is published, not in the trash, and that the slug matches the link. A renamed or deleted page needs a redirect, not a routing repair.
    • Only products, a custom post type or account pages fail. Probably a slug collision or a plugin. See the sections below.

    One more quick test. Find the post’s ID in the editor’s address bar (post.php?post=123) and visit yoursite.com/?p=123. If that loads while /my-post/ does not, rewriting is broken. If ?p=123 fails as well, the problem is deeper than permalinks, usually theme or plugin code changing the query.

    Re-save your permalinks first, without changing anything

    Go to Settings → Permalinks and click Save Changes. Do not pick a different option. The WordPress documentation for that screen explains that WordPress regenerates its rewrite rules there. On Apache, if WordPress can write to .htaccess, saving also updates the file.

    Test the URL that failed in a private window. If it loads, you are done. This is the standard fix after a migration, a backup restore, a change of host, or installing a plugin that adds its own URL types. Migration plugin vendors put this step at the end of their own checklists for exactly that reason.

    For custom post types, WordPress documents a longer variant: switch to the default structure, save, switch back to your real structure, and save again. It is optional. Just make sure you finish on the structure you started with.

    Developers with WP-CLI can run wp rewrite list to see whether a rule for the failing URL exists, and wp rewrite flush to rebuild the rules from the command line. Do not put flush_rewrite_rules() on every page load. WordPress’s function reference warns that flushing is expensive, and it does nothing for a server that ignores the rules.

    Why saving did not fix it

    Saving only rebuilds WordPress’s half of the routing. If the 404s are still there, check these in order. They start with the cheapest to rule out, not with whatever happens to be most common, because nobody has measured how often each cause turns up.

    A cache is still serving the old 404

    Your fix may have worked while a cache keeps handing out the old error page. Clear your caching plugin, any server cache your host runs (LiteSpeed, Varnish), and your CDN, then test logged out in a private window. WooCommerce’s product 404 documentation warns that cached 404s and testing while logged in can make a working fix look broken.

    Apache is not reading the rules

    On Apache and LiteSpeed, pretty permalinks depend on three things. WordPress’s Common Errors handbook names an inactive mod_rewrite module as a cause. Apache also ignores .htaccess completely when the directory is set to AllowOverride None. Your host controls both settings, so ask them to confirm both are on.

    The third is the file itself. It lives in the WordPress root, next to wp-admin and wp-content. Your file manager may hide it because the name starts with a dot. For a site installed at the domain root, the WordPress block looks like this:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    Download a copy of the file before you edit it. Many sites keep redirects and security rules in there, and pasting a fresh block over the whole file deletes them. Add or fix the WordPress block only, and keep custom rules above # BEGIN WordPress, as our guide to htaccess 301 redirects explains. Subdirectory installs need a different RewriteBase, so copy the rules WordPress shows you rather than the example above.

    If WordPress cannot write the file, the Permalinks screen tells you to update .htaccess yourself and shows the rules to paste. That usually means the file’s ownership is wrong. Setting the file to world-writable (666) is not a fix. Ask your host to correct the ownership.

    The server is Nginx, and .htaccess does nothing

    Nginx has no per-directory config files. WordPress’s Nginx handbook says WordPress cannot generate Nginx rewrite rules, so no amount of saving in the dashboard will help. Editing .htaccess on an Nginx server is the most common wasted afternoon in this whole topic. A missing .htaccess on Nginx is normal, not a fault.

    The handbook’s rule for a single site goes in the server block:

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    If a location / block already exists, edit it rather than adding a second one. Run nginx -t before reloading. On managed hosting you probably cannot touch this file. Kinsta’s docs, for example, say its WordPress sites have no .htaccess and that server configuration changes go through support. Send your host the failing URL, what you have already tried, and the exact 404 page you see.

    Two things are claiming the same URL

    The Common Errors handbook notes that a custom post type and a page with the same name cause 404s. WooCommerce’s permalinks documentation warns against using the same value for the product base and the product category base. Re-saving cannot fix a collision. Rename one of the two, save permalinks again, and add a redirect for whichever URL changed.

    A plugin or theme is intercepting the request

    Plugins that register their own content types, custom fields or URL rules can break WooCommerce account endpoints, product pages or whole sections of a site. Themes can do it too, which is when even ?p=123 URLs fail. Start with whatever was installed or updated last. Use the Health Check & Troubleshooting plugin’s Troubleshooting Mode, which turns plugins off only for your own session, or use a staging copy. Change one thing at a time, and re-save permalinks after each change. Our guide to troubleshooting plugins that are not working covers the full isolation method.

    A migration damaged the data

    If someone moved the site by running a raw SQL find-and-replace on the old domain, they may have corrupted serialized data. PHP stores the length of each string inside serialized values, and a replacement that changes the length breaks them. Practitioners report 404s, missing images and plugin errors after this kind of move. Restore from backup and redo the replacement with wp search-replace, starting with --dry-run, or use a migration plugin that handles serialized data.

    Why the 404s come back after you re-save

    If saving fixes the site for a day or a week and then the 404s return, saving is hiding the problem, not fixing it. Something keeps overwriting the rewrite rules or caching a broken state. In community threads the usual suspects are security plugins that rewrite .htaccess, host-level caching, and plugin interactions nobody pinned down. None of those threads confirmed a single root cause.

    To narrow it down, keep a copy of .htaccess from when the site works and compare it with the file the next time the site breaks. If the WordPress block has changed or disappeared, check which plugin writes to that file and look at its settings. If the file has not changed, look at caching. Do not settle for re-saving every few days on a store, where a broken return URL after payment costs you orders.

    Do not fix a 404 by changing your URLs

    Switching to “Post name” or renaming the WooCommerce product base can make the 404s go away, because WordPress rebuilds the rules along the way. It also changes every established URL. Links already shared, bookmarked and in Google’s index now point at nothing. WooCommerce’s documentation warns that old product links will return 404 unless you redirect them. Re-save the structure you have. Change it only on purpose, with a redirect map ready.

    If URLs did change, Google’s site-move guidance asks for permanent server-side redirects from each old URL to its closest new equivalent. Sending everything to the homepage instead can be treated as a soft 404. Our explainer on permanent redirects and SEO walks through the mapping. Remember that a redirect plugin cannot rescue broken rewriting: the Redirection plugin’s installation docs say it needs WordPress permalinks working first.

    When to stop and get help

    Stop clicking Save and hand the problem over when the host has to change server configuration you cannot reach, when the 404s keep coming back, when a plugin or theme conflict points into custom code, or when a migration may have corrupted the database. Several public support threads in each of these groups never reached a fix, even after the owner had tried a dozen things. Give your host or developer the failing URL, which kind of 404 page appears, whether ?p= URLs work, and what changed just before the problem started.

    If you would rather someone else does the diagnosis, SiteSelf can find and fix WordPress errors like this through chat. It needs hosting (SSH) access for server and .htaccess work, and it reports what it changed and what it checked.

    Frequently asked questions

    Where is the .htaccess file in WordPress?

    It sits in the WordPress root folder, the one that contains wp-admin, wp-includes and wp-content. Because the name starts with a dot, many file managers hide it until you turn on “show hidden files”. If your server runs Nginx, there is no .htaccess, and that is normal.

    Why does only the homepage work?

    The homepage URL needs no rewriting, so it loads even when the rewrite layer is broken. Every other pretty URL needs WordPress’s rules and the server’s routing to work together. Re-save permalinks first, then check the server.

    Should I switch to Plain permalinks to fix the 404s?

    Only as a short test. Plain URLs like ?p=123 work without rewriting, so they confirm the diagnosis, but they change every public URL on the site. Switch back and fix the rewriting rather than leaving the site on Plain.

    Why do my WooCommerce product attribute pages return 404?

    WooCommerce’s permalinks documentation says attribute archive URLs only work when archives are turned on for that attribute. Go to Products → Attributes, edit the attribute, tick “Enable archives?”, then re-save permalinks.

    Should I redirect every 404 my site reports?

    No. Redirect URLs that used to have content to the closest page that replaced them. A URL that never existed can stay a 404, and sending everything to the homepage can be treated as a soft 404.

    How do I check whether my server is Apache or Nginx?

    Look in your host’s control panel or ask support. In WordPress, Tools → Site Health → Info → Server usually lists the web server software. The bare 404 page often names the server at the bottom too.

  • 503 response code on WordPress and what it means

    Key takeaways

    • RFC 9110 defines 503 Service Unavailable as a temporary overload or maintenance condition. The server may send a Retry-After header, given either in seconds or as an HTTP date.
    • WordPress core returns its own 503 with Retry-After: 600 while an update runs. A leftover .maintenance file keeps that response going until someone deletes the file and runs the update again.
    • Check the status with curl or the browser’s Network panel while logged out. Logged-in admins skip maintenance pages, and a page can look like a maintenance screen while it returns 200.
    • Google’s Search Central guidance says a 503 is right for a short pause of a few days at most. For a longer closure, serve a 200 placeholder page, and don’t use robots.txt to shut the site down.
    • Retrying a page view is usually harmless. Retrying a checkout or form submission is not, because the server may have finished the action before something else returned the 503.

    A 503 is the one server error that is designed to be sent on purpose. It tells the browser, and Google, “not right now, try again later.” That is very different from “this page is broken” or “this page is gone.” It also says nothing about what caused it, which explains why people often fix the wrong thing.

    This article covers what the code means, how to read it, and how to work out which part of a WordPress setup sent it. If your site is down right now and you want the repair steps, our guide on how to fix a 503 error on WordPress goes through them in order.

    What does a 503 response code actually say?

    It says the server is temporarily unable to handle the request, usually because of overload or maintenance. Section 15.6.4 of RFC 9110, the HTTP semantics standard, defines it this way, and MDN’s 503 reference describes the server as “not ready to handle the request.”

    “Temporary” describes what the server intends. It doesn’t mean the problem will clear by itself. An overloaded server may recover when traffic drops. A maintenance setting someone forgot to switch off will keep returning 503 for weeks. The two produce the same number.

    The server may add a Retry-After header, given either as a number of seconds or as an HTTP date. When it’s there, the server is estimating how long you should wait. When it’s missing, nobody has given an estimate, and you should treat the 503 like any other server error you need to investigate.

    How do you read the 503 instead of the error page?

    Look at the response headers. The wording on the page is the least reliable evidence you have. A CDN can put its own branded page in front of an error from your host, and a maintenance plugin can show a friendly holding page that doesn’t return a 503 at all.

    In Chrome or Firefox, open Developer Tools, go to the Network tab, reload, and click the first request (the document itself, not an image). Under Headers, note the status code, any Retry-After value, any Server or CDN headers, and the time. From a terminal, this prints the headers of a real GET request:

    curl -s -o /dev/null -D - https://example.com/
    
    HTTP/2 503
    retry-after: 600
    content-type: text/html; charset=utf-8

    Plain curl -I also works, but it sends a HEAD request, and some caches and firewalls answer HEAD differently from GET. If the two disagree, trust the GET.

    Test while logged out, in a private window or with curl. WordPress maintenance plugins let logged-in administrators through, so the owner sees a normal site while every visitor gets the holding page.

    Which part of a WordPress site sent the 503?

    There are five usual sources. Where the 503 appears, and when, tells you more than the code does. A 503 on every URL points somewhere different from a 503 that only hits checkout or only appears while you save a post.

    SourceWhat you usually seeCheck first
    WordPress core, mid-update“Briefly unavailable for scheduled maintenance. Check back in a minute.” on every URLA .maintenance file in the WordPress root
    A maintenance or coming-soon pluginA branded holding page for visitors, a normal site for adminsThe plugin’s on/off setting, tested while logged out
    Hosting resource limitsCached pages load, while checkout, login, search and wp-admin fail, often at busy timesThe host’s CPU, memory, process and PHP worker graphs at the time of the error
    A security layerOne action fails, such as saving many product variations or connecting an accountThe firewall or ModSecurity log entry for that request
    A CDN or proxyA CDN-branded page, or an error that remains after the origin recoversThe same URL with the CDN bypassed

    Core maintenance is the easiest to recognise

    During an update, WordPress puts a .maintenance file in the site root. While that file exists, the core function wp_maintenance() answers every request with a 503 and Retry-After: 600, which asks clients to come back in ten minutes. If the update is interrupted, the file stays and so does the 503. WordPress.org’s troubleshooting FAQ says to delete the file and then run the update again. Deleting the file clears the message. It does not finish the update. Our article on why WordPress updating failed covers that second half.

    Resource limits are the most common cause, and the most misread

    Nobody publishes data on how often each cause occurs. In support threads, though, the cause reported most often is the host running out of capacity. On most hosts, PHP workers are the processes that build WordPress pages that aren’t cached. When every worker is busy, new requests wait in a queue, time out, and come back as 503s. Cached pages skip the workers completely. That’s why a store’s homepage can look fine while checkout fails, because checkout, cart, login and admin pages are never served from the page cache.

    A bigger plan or more memory only helps if you’ve confirmed that a limit is actually being hit. More workers need more RAM and send more simultaneous queries to the same database. If one slow query or plugin is holding workers, more capacity just postpones the next outage. In one WordPress.org WooCommerce support thread, the host said the site needed a VPS. The 503 actually went away when the owner replaced a product-category element on the home page.

    Security rules can return 503 to a single action

    WooCommerce’s documentation on large data not saving names servers running mod_security, along with PHP’s max_input_vars limit, as reasons why saves of product variations and tax rates fail. If the 503 only appears on one form or one admin action, look for the rule that matched that request. Don’t switch the firewall off. Ask the host for a targeted allow rule instead.

    A CDN usually relays the 503 rather than causing it

    If the error page carries a CDN’s logo or a request ID, that only proves the request went through the CDN. Most CDN-delivered 5xx errors start at the origin server. Bypass the CDN (most offer a development or pause mode) and request the same URL again. If the 503 disappears, the CDN is serving a cached error, and purging that URL fixes it. If it stays, the problem is at the origin.

    How is a 503 different from a 500, 502, 504 or 429?

    The other codes describe a fault, a broken handoff or a single client over its limit. A 503 describes a service that is unavailable for now. That changes what you do next.

    CodeWhat it meansWhat it suggests on WordPress
    500 Internal Server ErrorThe server failed and gave no reasonA PHP fatal error, a bad .htaccess rule or a memory error. See our guide to the 500 error
    502 Bad GatewayA proxy got an invalid response from the server behind itPHP crashed or the PHP-FPM socket is down behind Nginx or a CDN
    503 Service UnavailableTemporarily unable to handle the requestMaintenance, full worker pools or a deliberate block
    504 Gateway TimeoutA proxy gave up waiting for the server behind itA slow query, import or remote API call that ran past the proxy’s timeout
    429 Too Many RequestsThis client is over a rate limitA security plugin or host throttling one IP. The site is up for everyone else

    Hosts don’t always pick the textbook code. Some stacks turn a PHP crash into a 503 instead of a 502, so use the table to decide where to look first, not as proof of the cause. If the PHP error log shows a fatal error at the same timestamp, follow the log. Our WordPress fatal error guide shows how to read the file path it names. WordPress.org’s Recovery Mode documentation notes that Recovery Mode doesn’t activate for fatal errors in cron or background tasks, so a missing recovery email doesn’t mean nothing failed.

    When is it safe to retry a 503?

    When the request only reads something. Reloading a page or fetching an image is a GET request, and repeating it changes nothing. Under heavy load, though, every reload occupies a worker again, so wait for the Retry-After period if there is one. Refreshing again and again makes an overloaded server slower to recover.

    Checkouts, form submissions and cart updates are different. The server may have recorded the order or taken the payment before a proxy or a timeout sent the 503 back. Before anyone resubmits, check the WooCommerce orders list, the payment provider’s dashboard or the form plugin’s entries. A 503 on a POST tells you the response failed. It doesn’t tell you the action failed.

    For scripts and integrations that call your site, use bounded exponential backoff with jitter. That means waiting longer after each failure, adding a random offset so clients don’t retry in sync, capping the delay, and stopping after a fixed number of tries. Tight retry loops from monitors and integrations are a common way a brief overload turns into a long one.

    When should your site return a 503 on purpose?

    When you take it offline for a short, planned reason: a migration, a database restore, a pause in sales. Google’s guidance on temporarily pausing or disabling a website recommends a 503 page for brief shutdowns lasting a few days at most. The page should be lightweight, include a Retry-After header and tell visitors when you’ll be back or how to reach you. Google’s crawl-rate documentation puts the window at a couple of hours to one or two days. If the closure will run longer, serve a normal 200 placeholder page instead. A 503 that lasts weeks tells Google the site is unreliable.

    The same page warns against two shortcuts: blocking the site in robots.txt, and adding noindex to shut it down. Both are harder to undo than a status code.

    A few habits keep planned downtime honest:

    • Check the status, not the look. Run curl while logged out and confirm you get 503 and not 200. A maintenance page that returns 200 tells search engines the holding page is your content.
    • Prefer a server-level 503 for real work. A rule in .htaccess, Nginx or the CDN keeps working even when PHP or the database is the thing you’re working on. A plugin-based 503 needs WordPress to load before it can respond.
    • Clear every cache when you finish. The WordPress cache, the host’s server cache and the CDN each store their own copy. Visitors can keep seeing the holding page after you switch it off, or see the live site while the plugin still thinks it’s on.

    Our article on coming soon text in WordPress covers the visible side: what the holding page should say.

    What should you do with an unplanned 503?

    Write down the URL, the time with time zone, the status, the headers and which actions fail. Then match that against the table above before you touch a plugin. Disabling every plugin on a live store removes checkout, forms and security together. It often hides the evidence too, and it rarely helps when the real problem is a full worker pool. If the host’s graphs show a limit being hit at that timestamp, send them that evidence. If the PHP log names a file, start there. The step-by-step 503 fix covers plugin isolation over FTP, Health Check troubleshooting mode and the CDN purge.

    If you’d rather not dig through logs yourself, SiteSelf can find and fix the failing layer on request through chat. It needs hosting (SSH) access for log and file work, and it reports what it changed and what it checked.

    When the site is back, check the things a working homepage can hide. Load checkout and wp-admin while logged out and logged in. Reconcile any orders placed while the site was failing. Confirm that scheduled posts actually went out, because WP-Cron only runs when visitors load pages, and nobody got through during the outage.

    Frequently asked questions

    Do visitors need to clear their browser cache after a 503?

    Almost never. The 503 comes from the server, a cache layer or the CDN, not from the visitor’s browser. If people still see the error after the origin recovers, purge your page cache and the CDN entry for that URL.

    Does a 503 hurt SEO?

    Not when it’s short. A 503 is the signal Google asks for during brief downtime, and Googlebot comes back later to recrawl. A 503 lasting more than a few days, or a site that returns 503s on and off for weeks, can affect how the site appears in Search.

    Why does only wp-admin or checkout return 503?

    Those pages are never served from the page cache, so each request needs a PHP worker and usually several database queries. If workers are scarce, those pages fail first while cached pages keep loading. A firewall rule matching admin or checkout requests produces the same pattern.

    What does “a 503 Service Unavailable error was encountered while trying to use an ErrorDocument” mean?

    The server tried to show a custom error page, and fetching that page hit a 503 as well. It usually means the whole backend is unavailable rather than one URL. Look at the host’s status and resource graphs first.

    Is 503 the right status for a coming-soon page on a new site?

    Only for a short wait. A site that won’t launch for weeks is better off with a 200 placeholder page that says what’s coming. That fits Google’s advice to keep 503 to a few days at most.

  • CSS media queries for mobile on WordPress

    Key takeaways

    • Tools use different defaults: WordPress responsive styles treat 480px and below as mobile and go up to 782px for tablet, while Elementor uses 767px and 1024px. Match the tool you use, and add a breakpoint where your own layout breaks.
    • Put @media rules in the site-wide Additional CSS. The per-block Additional CSS field accepts declarations only, so a full media query pasted there does nothing.
    • If a rule works in preview but not on your phone, check stale CSS first. Regenerate builder files, then clear the plugin cache, the host or CDN cache and the browser cache, in that order.
    • Test at 320 CSS pixels. WCAG 1.4.10 Reflow expects no loss of content and no sideways scrolling at that width.
    • Additional CSS is stored per theme and is cleared when you switch themes, so keep a copy.

    A common snippet for mobile CSS is @media (max-width: 767px) { ... }. It applies its rules when the viewport is 767 CSS pixels wide or narrower. That includes a phone, and it also includes a laptop browser window dragged narrow. The number is a convention, not a standard.

    On WordPress sites, people usually notice this when a mobile fix looks right in the editor and wrong on their phone. Most of the time the media query is fine. Something else wins: a cached stylesheet, a builder setting, or a more specific selector. This guide covers how to write the query, where to put it, and how to find the actual cause when it doesn’t apply.

    What a mobile media query actually tests

    A media query is a condition. The browser checks it and applies the rules inside only when it is true. For layout, that condition is almost always the viewport width in CSS pixels. Elementor’s responsive editing docs make the same point: a breakpoint applies to any screen at that width, whatever the device.

    You can write the condition in two directions:

    /* Desktop-first: base styles are for wide screens, this overrides them on narrow ones */
    @media (max-width: 767px) {
      .site-columns { flex-direction: column; }
    }
    
    /* Mobile-first: base styles are for phones, this adds layout on wider screens */
    .site-columns { display: flex; flex-direction: column; }
    @media (min-width: 768px) {
      .site-columns { flex-direction: row; }
    }

    Use width, max-width and min-width. Avoid max-device-width. It measures the physical screen rather than the viewport the page is laid out in, so it can disagree with what visitors actually see. If you want the bigger picture of how themes and builders split layout control, start with how layout works on WordPress.

    Which breakpoint should you use for mobile?

    No single number is correct. Media queries test conditions, and the familiar values come from tool defaults:

    SourceMobileTablet
    WordPress responsive styles (block themes, WordPress 7.1+)480px and belowUp to 782px
    Elementor defaults767px1024px
    Common desktop-first CSSmax-width: 767pxVaries by theme

    MDN recommends adding a breakpoint where the layout starts to fail, not at a device size. Drag the browser narrower until something looks cramped, overlaps or overflows, and put the breakpoint just above that width. WordPress’s CSS Coding Standards say to test above and below every breakpoint you add.

    There is one practical exception. If the page is built in Elementor, or a block theme uses responsive styles, use that tool’s breakpoint for your custom CSS too. If your CSS switches at 600px and the builder switches at 767px, the layout spends 167 pixels half-converted.

    Check the viewport tag before anything else

    Without a viewport meta tag, mobile browsers can lay the page out on a wider virtual viewport and then shrink it to fit. The W3C CSS Viewport spec describes this older behaviour. When it happens, your max-width: 767px query never matches, and changing the number won’t fix it.

    Open the live page, view the source, and search for viewport. You want something like:

    <meta name="viewport" content="width=device-width, initial-scale=1">

    Almost every current theme outputs this already, so check before you add one. A duplicate tag won’t help. If the existing tag contains user-scalable=no or maximum-scale=1, it is stopping visitors from zooming. Fixing that belongs in the theme or a child theme, not in Additional CSS.

    How to add a mobile media query in WordPress

    You need an administrator login and a desktop browser with developer tools. Chrome, Firefox and Edge all work.

    1. Find the element and the rule that currently wins. Right-click the element and choose Inspect. Turn on the device toolbar (Ctrl+Shift+M, or Cmd+Shift+M on a Mac) and set a phone width. Note the element’s class and which rule is applied. Crossed-out rules have been overridden.
    2. Look for a setting before writing code. In a block theme on WordPress 7.1 or later, responsive styles let you set mobile and tablet values for a block. In Elementor, use the device switcher in the editor or Advanced > Responsive. If a setting does what you need, use it.
    3. Open the site-wide Additional CSS. On a classic theme it is under Appearance > Customize > Additional CSS. On a block theme, go to Appearance > Editor > Styles and open Additional CSS from the Styles panel’s menu.
    4. Write the rule using the selector you found. Put your override after any rule it needs to beat.
    5. Save, clear caches, and test at several widths. The test is described in the next section.

    Here is a real case. In a WooCommerce support thread, a store owner’s Add to Cart button looked fine on a laptop and wrong on phones. The fix was to wrap the button styles in a 600px query, which made the button full width with a smaller font. The owner replied “It worked perfectly.” The pattern looks like this:

    @media (max-width: 600px) {
      .single_add_to_cart_button.button.alt {
        display: block;
        width: 100%;
        font-size: 14px;
      }
    }

    Watch out for the second CSS field. Each block type in the Styles panel also has its own Additional CSS box, and WordPress’s Styles documentation says it takes declarations only, with no selectors and no braces. A full @media rule pasted there will not work. Also note that Additional CSS survives theme updates but is cleared when you switch themes. Keep a copy, and move anything substantial into a child theme. The guide to theme customization that survives updates covers which layer to choose.

    Patterns that cut down on breakpoints

    Many mobile problems are overflow, not layout. These rules fix a lot of them without a breakpoint:

    img, video, iframe { max-width: 100%; height: auto; }
    .entry-content { overflow-wrap: break-word; } /* long URLs */
    h1 { font-size: clamp(1.75rem, 5vw, 3rem); }  /* fluid heading */
    .card-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
    }

    Keep media queries for changes that are real layout shifts: switching the menu, stacking columns, reflowing a table, showing or hiding a secondary element. Use fluid sizing for everything else.

    What a correct result looks like

    The rule should apply at every width below your breakpoint and at none above it. Check it in the device toolbar at 320, 375 and 414 pixels, then just above and just below the breakpoint. At 320 CSS pixels, nothing should scroll sideways and nothing should be cut off. That width comes from WCAG 1.4.10 Reflow, which asks that vertically scrolling content keep all its information and functions at that width without two-dimensional scrolling.

    Then open the page on a real phone in a private tab. Builder device previews are not always a real viewport. A Stack Exchange question about Gutenberg’s preview describes it narrowing the container instead, so a rule can pass in preview and fail on the phone.

    Why mobile CSS works in preview but not on your phone

    These causes come up again and again in WordPress support threads. They are listed roughly from most to least often reported. This order comes from reading the threads, not from a survey.

    1. The phone is getting old CSS

    Page builders write CSS to files, and caching or optimization plugins combine and minify those files. Your edit saves, but the phone receives the previous version. In Elementor, go to Elementor > Editor > Tools and run Clear Files & Data. Then clear the caching plugin, then the host or CDN cache, then the browser cache. In one resolved LiteSpeed Cache thread, GeneratePress’s dynamic CSS kept being served stale on mobile until the affected files were excluded from CSS optimization. If a purge doesn’t stick, the guide to pages that won’t update walks through each cache layer.

    2. A builder or theme setting overrides it

    Elementor’s mobile troubleshooting guide lists the usual suspects. They are Advanced > Responsive > Hide On, widget-level Custom CSS, site-wide custom code, and theme or plugin conflicts. Some older themes and plugins also serve a separate mobile theme. Turn it off before you debug CSS that the phone never loads.

    3. The selector doesn’t match or loses

    Builders wrap each widget in several divs, so a selector copied from a tutorial often matches nothing. Copy the class from the live page in DevTools. If the selector matches but loses, put your rule after the base rule, or make it a little more specific. Add !important only when the rule you are overriding already uses it. If you add !important to everything, the next fix gets harder.

    4. The syntax is broken and fails silently

    CSS doesn’t show errors. A missing closing brace can swallow every rule after it. In one WordPress.com forum case, the query said screen2 instead of screen. Sydney theme support told another user that an invalid line in Additional CSS can stop the lines after it from working. Paste your CSS into a validator, or check that DevTools lists your rule at all.

    5. The CSS is in the wrong field or never loads

    Media queries in the per-block field, CSS inside a page’s content, or a stylesheet that isn’t enqueued on that template all look like “mobile CSS not working”. In DevTools, check that your rule is present in the Styles panel at a phone width.

    When to stop and get help

    Get help if you have ruled out all five and the rule still doesn’t apply. Builder plugins have their own bugs. Elementor Pro 3.24.5, for example, fixed responsive styles not loading in Apple’s WebKit. Some threads never find a root cause. Gather the page URL, the width where it breaks, the element and the winning rule from DevTools, and send them to the theme or plugin’s support. If you would rather describe the problem than track it down, SiteSelf can make theme-level design and mobile styling changes on request from chat, with hosting access. Pages owned by Elementor, Divi or Beaver Builder are refused, and you are told why.

    Be careful what you hide on mobile

    The easy mobile fix is display: none. It also removes the element for screen readers. Google indexes and ranks the mobile version of a page and advises against removing primary content there. Accordions and tabs are fine. Hiding a decorative image or a duplicate call to action is fine. Hiding prices, product details or the text that explains your offer is not.

    Frequently asked questions

    Should I use max-width or min-width?

    Follow the theme you have. Most themes are written desktop-first, so small fixes are easiest as max-width overrides. If you are building a new section from scratch, mobile-first with min-width keeps phone styles simple. The cost is resetting some of them on wider screens.

    Do I still need media queries if I use clamp() and CSS Grid?

    Fewer of them. Fluid type and auto-fit grids handle much of the resizing that used to need breakpoints. You still need queries for real layout changes, such as switching to a mobile menu or reflowing a table.

    How do I change the width where my mobile menu appears?

    It depends on the theme. Some themes have a setting for it. Others hard-code the breakpoint in their navigation CSS, so you have to override those rules at the width you want. Check your theme’s documentation or support forum before writing an override.

    What about container queries?

    Container queries style an element based on the size of its parent rather than the viewport. That suits blocks that appear in both sidebars and full-width areas. They are a reasonable choice for custom components you write yourself, but most WordPress themes still use viewport media queries.

    Why did my mobile fix also change the desktop layout?

    The rule probably sits outside any media query, or inside the wrong one. Wrap the declarations in the mobile query and check the closing braces. A rule with no query applies at every width.

  • How to fix WordPress issues without guessing

    Key takeaways

    • Read the evidence before you change anything: the Recovery Mode email, the host’s error log and wp-content/debug.log usually name the file and line.
    • A plugin, theme or update conflict is the cause people report most often. A 500 error can also come from .htaccess, memory, the database or the server, so don’t assume it’s a plugin.
    • Roll back the one component that broke rather than restoring the whole site. A full restore can wipe orders and posts created since the backup.
    • On a WooCommerce store, check Orders before anyone retries Place order. WooCommerce also advises against switching to classic checkout as a first fix.
    • Clearing a cache helps you diagnose. It doesn’t prove the fix worked. In one case WP Super Cache kept showing a database error to visitors after the server had recovered.

    A WordPress site is several layers stacked together: core, the theme, plugins, PHP, the web server, the database, and one or more caches. When something breaks, you usually see one of a few generic screens, no matter which layer actually failed. “There has been a critical error on this website” can mean a plugin crashed, the theme doesn’t work with your PHP version, or memory ran out.

    So the most common mistake isn’t a wrong fix. It’s treating the symptom as the diagnosis: assuming every 500 is a plugin conflict, every spinner is a caching problem, and a cleared cache means the problem is gone. This guide gives you the order of checks first, then the fix for each common symptom. If your site won’t load at all, our guide to why WordPress is not loading matches the exact message to its cause.

    What should you do before you touch anything?

    Write down the evidence, make a backup, then change one thing at a time. WordPress’s own handbook, WooCommerce’s docs and most hosts recommend the same order, because guessing destroys the clues you need.

    1. Record the exact message and when it appears. Note whether it shows on every page or one page, whether it shows logged in or logged out, and what changed just before it started. A plugin update, a PHP upgrade or a pasted snippet is usually the answer.
    2. Check the admin inbox. Since WordPress 5.2, Recovery Mode can email the site admin a link when a fatal error happens. The email names the plugin or theme that failed and lets you log in with it paused.
    3. Read the logs. Your hosting panel has a server error log, and often a separate PHP error log. Each can show a different problem. If WordPress debug logging is on, there is also wp-content/debug.log.
    4. Back up files and the database together. Do this even if the site is half broken. A backup of the broken state still lets you undo your own mistakes.
    5. Change one variable, then retest the action that failed. If you change three things and the site comes back, you still don’t know which change fixed it.

    If no log exists yet, turn on WordPress debug logging in wp-config.php. Keep on-screen display off on a live site so visitors never see file paths:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );

    Load the broken page again, then open debug.log. Look at the file path, not the wording. A path inside wp-content/plugins/some-plugin/ names your suspect. When you’re done, set WP_DEBUG back to false.

    Which WordPress issues come up most, and how do you fix each one?

    No public dataset ranks WordPress failures by how often they happen. The order below reflects how often each pattern comes up in WordPress.org support threads, WooCommerce documentation and hosting guidance. Plugin, theme and update conflicts top that list by a wide margin.

    A critical error or white screen right after an update

    This is usually a PHP fatal error in a plugin or theme. WordPress’s common-errors handbook lists plugin conflicts, an incompatible theme or PHP version, exhausted memory and corrupted files as the usual causes.

    Start with the Recovery Mode link if you got one, and deactivate the component it names. If you can’t reach wp-admin, connect by SFTP or the host’s file manager and rename only the suspect plugin’s folder in wp-content/plugins, for example to some-plugin-off. If the theme is the suspect, switch to a default theme. Our walkthrough on reading a WordPress fatal error covers each route in detail.

    Once you know which plugin broke, decide what to do about the version. If the update caused the crash, roll back to the previous release with a tool such as WP Rollback, which reverts WordPress.org plugins and themes to an earlier version. Report the bug to the developer too. A rollback is a workaround. The faulty release is still a problem until the developer ships a patched one.

    WordPress Recovery Mode email naming the plugin that caused a fatal error
    The automated recovery email pinpoints the exact theme or plugin responsible for the crash alongside a direct link to regain dashboard access. · Source: www.wpbeginner.com

    A 500 Internal Server Error

    A 500 has more possible causes than any other message on this list: .htaccess, a plugin or theme, PHP limits, file permissions, the database, corrupted core files or the server itself. Read the host’s error log first, because it often names the file and line.

    If the log suggests .htaccess, or says nothing useful, download a copy of the file, rename it to .htaccess-old and reload the site. If the site works again, go to Settings → Permalinks and click Save Changes to generate a clean file. Then add back any custom redirect or security rules one at a time from your copy. If the 500 doesn’t go away, the file wasn’t the cause, so put it back and continue with plugins, the theme and memory. Our server error 500 guide walks through the rest.

    “Allowed memory size exhausted”

    Match the fix to the log line. Raising WP_MEMORY_LIMIT in wp-config.php only asks for more memory. If the server sets a lower memory_limit, the server’s limit applies, and only your host can raise it. And if one plugin keeps using more memory after an update, extra memory just delays the next crash. Roll back that plugin or replace it.

    “Error establishing a database connection”

    WordPress’s handbook names three causes: wrong credentials in wp-config.php, problems with your web host such as a database server that is down or over quota, and, if neither explains it, a compromised site. Check the host’s status page first. If the database server is down, wait. Editing files while the host recovers only adds risk.

    If the host is fine, compare DB_NAME, DB_USER, DB_PASSWORD and DB_HOST with the database details in your hosting panel. A recent password change on the hosting account often explains the error.

    Your changes don’t show, or the error won’t go away

    Caches confuse diagnosis in both directions. They can show an old page after you edit it, and they can keep showing an error after it’s fixed. On one WordPress.org thread, WP Super Cache kept serving the “Error establishing a database connection” screen to logged-out visitors after a brief server problem. Logged-in users never saw it, and only clearing the cache fixed it.

    Check every layer: the browser, the cache plugin, the host’s server cache and any CDN. Then test in a private window while logged out. If the problem is still there after every layer is purged, the cache isn’t the cause, so troubleshoot the site itself. Our guide on a WordPress page not updating covers the save failures that look like caching.

    Posts and pages return 404 but exist in the admin

    The rewrite rules are broken. The content is still there. Go to Settings → Permalinks and click Save Changes without changing the structure. WordPress’s documentation explains that if .htaccess isn’t writable, WordPress shows you the rules to add yourself. In that case the save didn’t fix anything, even though the button worked.

    If saving doesn’t help, ask your host whether mod_rewrite is enabled on Apache. Also check for a page that shares its slug with a custom post type. Don’t change the permalink structure to fix a 404. Those URLs are meant to be permanent, and changing them breaks every existing link and search result.

    WordPress Settings Permalinks screen used to fix 404 errors on posts
    Clicking the Save Changes button at the bottom of the Permalink Settings screen prompts WordPress to rebuild its rewrite rules without altering your URL structure. · Source: kinsta.com

    WooCommerce checkout spins forever

    WooCommerce’s spinner documentation explains that the browser is usually waiting for a request, rejecting its response, or failing to finish the JavaScript that updates checkout. Open your browser’s DevTools, go to the Network tab, filter by Fetch/XHR and place a test order. Note the status code, how long the request took and the response. Then open WooCommerce’s logs at the same timestamp.

    Three warnings from those docs matter more than any fix. Check Orders before anyone retries Place order, because the first attempt may have gone through. Don’t switch from the Checkout block to classic checkout as a first step. It can hide the real problem, and extensions support the two differently. And remember that a staging copy can still send real emails and fire webhooks.

    Should you deactivate every plugin at once?

    Only when the site is already down, or when the test is invisible to visitors. Turning off every plugin is quick, but on a working store it also takes down checkout, forms and logins while you test.

    WooCommerce’s conflict test is the careful version. Switch to a default theme, deactivate everything except WooCommerce and the extension that misbehaves, then reactivate plugins one at a time, repeating the steps that triggered the problem after each one. Two plugins can each work fine alone and fail together, so test suspect pairs both ways.

    On a live site, run the test on a staging copy, or use the Troubleshooting mode in WordPress.org’s Health Check & Troubleshooting plugin. That mode disables plugins and switches the theme for your logged-in session only. It can’t disable must-use plugins, and it can’t reproduce a problem that only logged-out visitors see. Its directory listing also now warns that it hasn’t been tested with the latest three major WordPress releases. Test it on staging before you rely on it on a live site.

    When should you stop and get help?

    Stop when the evidence points to something you can’t change safely. Most failed self-fixes happen because the person kept going past one of these points:

    • The log names custom code or a theme file you didn’t write. Editing it on a live site can turn a broken page into a broken site.
    • A store is losing orders. The cost of each hour is now higher than the cost of help, and a wrong step can create duplicate orders.
    • You see signs of a hack: redirects you didn’t add, browser malware warnings, or a database error your credentials and host don’t explain. Cleanup means closing the way in, not just deleting files. Our guide to WordPress security issues explains how to tell the difference.
    • The fault is below WordPress. PHP versions, server limits and database outages belong to the host. Plugin, theme and custom-code faults usually go back to whoever maintains that code.

    Whoever takes it on, send them the exact error, what you were doing when it appeared, what changed recently, the relevant log lines, the affected URL, and what you expected compared with what happened. If you’d rather describe the problem in chat and have it handled, SiteSelf’s WordPress bug-fix work reads the error, makes the fix on your live site (code-level fixes need hosting access), and reports what changed and what it checked.

    Frequently asked questions

    I disabled all my plugins and the error is still there. What next?

    Switch to a default theme, then check .htaccess, then read the server error log. Look at memory, the database and the server before you go back to plugins. Also check for must-use plugins in wp-content/mu-plugins, because they keep running when you deactivate everything else.

    Should I restore a backup instead of fixing the problem?

    Usually not first. A full restore puts back every file and database row from the backup date, so you lose any orders, comments and posts created since then. If one change broke the site, undo that one change. Our guide to restoring WordPress from backup covers when a full restore is the right call.

    Can I stop updating plugins so nothing breaks?

    No. Skipped updates leave known security holes open, and a site that falls years behind ends up with one large, risky update instead of many small ones. Update one component at a time, with a fresh backup each time, and test login, forms and checkout after each update.

    Is it safe to turn on WP_DEBUG on a live site?

    Yes, as long as WP_DEBUG_DISPLAY is false, so errors go to the log file and not the screen. WordPress recommends doing your debugging on a staging or development copy where you can. Turn it off when you finish, because the log can grow large and it contains file paths.

    My site is stuck on “Briefly unavailable for scheduled maintenance”. What do I do?

    An update was interrupted and left a .maintenance file in the site root. Make sure no update is still running, delete the file by SFTP or the file manager, then run the update again. The interrupted update may have left a plugin half installed, so check that plugin too.

    Does advice for WordPress.com apply to my self-hosted site?

    Not always. WordPress.com and self-hosted WordPress from WordPress.org have different accounts, features and support channels. File access, error logs and PHP settings belong to your host on a self-hosted site, which is why most fixes in this guide mention the hosting panel.

  • How to restore a WordPress site from backup

    Key takeaways

    • If a plugin update broke the site, try renaming that plugin’s folder in wp-content/plugins first. A full restore also deletes every order, comment and edit made since the backup.
    • WordPress’s Advanced Administration Handbook says the files and the database are separate. Restore the files first, then import the database, then check DB_NAME, DB_USER, DB_PASSWORD and $table_prefix in wp-config.php.
    • WooCommerce Subscriptions warns that renewals processed after the backup can come back as Pending and charge customers twice. Cleaning that up is developer work.
    • Don’t rely on a restore route that needs wp-admin. A fresh WordPress install with the same backup plugin, the host panel, or SFTP plus phpMyAdmin all work when the dashboard is down.
    • If a restore says it finished but the site looks empty or stale, the usual causes are a table prefix mismatch, a cache, unsaved permalinks, or files and a database taken at different times.

    A plugin update went through, and now the site shows “There has been a critical error on this website.” Your host’s panel has a backup from last night, and the Restore button is right there. That button can get you back online in minutes. It can also delete this morning’s orders and bring back a version of the site that breaks in a new way.

    Restoring is not an undo. It is a deliberate overwrite, and it works when three things are true. The backup is complete. The route you use still works with the site down. You check the result afterwards. This guide covers all three, using host tools, backup plugins and a manual restore.

    Should you restore at all, or fix what broke?

    If one change broke the site, undo that change first. When an update causes a fatal error, WordPress usually sends a recovery-mode email that names the plugin. If wp-admin is down, connect over SFTP and rename the plugin’s folder, for example plugin-name to plugin-name-off. WordPress deactivates a plugin when it can’t find its files. Our guide to fixing a WordPress fatal error covers this step by step.

    This matters because a full restore replaces everything after the restore point: posts, comments, form entries, users, settings and orders. If someone just overwrote a paragraph, use that post’s revision history. Save the restore for damage that is spread across the site, or for when you can’t find the cause.

    What a usable backup has to contain

    A working restore needs files and a database taken at the same moment. WordPress’s Advanced Administration Handbook on backups treats them as two separate parts:

    • Files: WordPress core, themes, plugins, uploads, wp-config.php and .htaccess.
    • Database: posts, pages, users, settings, menus, orders and plugin data, usually saved as a .sql, .sql.gz or .zip file.

    If you restore only the files, you get the theme back but no content. If you restore only the database, you get pages and text without the theme, plugins or images. That second case comes up a lot in support threads: someone restores a database-only set and wonders why the design is gone. Mixing a database from one day with files from another causes quieter problems, such as missing images or settings pointing at plugins that aren’t there.

    Before you rely on a backup, open the archive and look inside. Check that a database file is there and isn’t 0 KB, and that wp-content includes plugins and themes, not only uploads. A file named “full-backup” proves nothing. Our explainer on what a backup plugin leaves out covers the common gaps.

    What to do before you press Restore

    1. Back up the broken site. Copy the current files and export the current database, and keep them apart from the backup you plan to restore. If the restore goes wrong, this is how you get back to where you started. It may also hold the only copy of today’s orders or uploads.
    2. Check what the host’s snapshot includes. Host tools vary. Kinsta’s documentation says its snapshots include files, the database, redirects, Nginx configuration and MyKinsta settings. It also says restoring an earlier backup can remove domains you added later. Read your host’s page before you confirm.
    3. Export anything newer than the restore point. That means orders, customers, form entries, new users and new posts, plus the media files they use. Plan how you’ll bring each one back, because a CSV export isn’t always ready to import.
    4. Treat subscription stores as a separate problem. WooCommerce’s guide to restoring backups with Subscriptions calls the time between the backup and the restore a “gap period.” Renewals already processed in that window can come back as Pending, and if they run again, customers get charged twice. WooCommerce describes the cleanup as developer-level work.
    5. Keep a copy off the server. Download the backup to your computer or to external storage. A backup kept on the same server is gone if the server or account is lost.
    6. Stop new changes. Turn on maintenance mode, tell editors to stop working, and pause checkout. Orders placed during a database restore create one more thing to sort out afterwards.

    How to restore with a host tool or backup plugin

    On most sites, the host panel is the quickest route. Open the backup list, check that you’re on the right site (agency accounts often list staging and production with similar names), pick the restore point and choose the scope. Pick files and database together unless you’re sure the current files match the older database. A plugin update can change database tables as well as files. Then let the restore finish without making other changes.

    Backup plugins work the same way while wp-admin is up. If the dashboard is down, you can’t reach a restore screen inside it. The usual workaround is to install a fresh copy of WordPress, install the same backup plugin, and point it at your remote storage or upload the archives. For UpdraftPlus, put the archive files in wp-content/updraft, then click Rescan local folder so the plugin finds them.

    If you can, restore into a fresh install or a staging copy rather than over the broken site. Restoring over an existing install can leave stray files and data behind. A staging copy also lets you test before you send live traffic to it.

    How to restore manually with SFTP and phpMyAdmin

    A manual restore needs file access (SFTP or the host’s file manager) and database access (phpMyAdmin, or SSH for the command line). Follow the handbook’s order: files first, then the database.

    1. Restore the files. Move the current web root aside, then upload or extract the backup in its place. Copying clean files over a compromised site leaves the attacker’s extra files where they are. After extracting, check you haven’t ended up with an extra nested folder such as public_html/public_html.
    2. Import the database. An empty database gives the most predictable result. In phpMyAdmin, select the site’s database in the left-hand panel before you open Import. Large files often time out in the browser, so import them from the command line instead.
    3. Match the configuration. In wp-config.php, check DB_NAME, DB_USER, DB_PASSWORD and DB_HOST. Then check that $table_prefix matches the restored table names. If the tables are named wp7x_posts and the config says wp_, WordPress acts as if nothing is installed.
    phpMyAdmin Import tab used for a WordPress database restore
    Selecting your site database in the left sidebar ensures the import tool targets the correct database before uploading your SQL backup. · Source: help.one.com

    The command-line versions, over SSH:

    mysql -u dbuser -p dbname < backup.sql
    # or, with WP-CLI
    wp db import backup.sql

    Why the restore failed, and what the log says

    Read the restore log before you try again. Running the same restore over and over seldom changes the result. UpdraftPlus’s documentation on restorations that don’t complete matches the common errors to their causes:

    Message in the logCauseWhat to do
    PCLZIP_ERR_BAD_FORMAT (-10)Corrupt or incomplete archiveDownload it again straight from storage, check it unzips, upload it and rescan. When you delete the bad local copy, leave the option to also delete it from remote storage unticked.
    “Allowed memory size … exhausted”PHP memory limitRaise WP_MEMORY_LIMIT. If it already equals the server’s limit, ask the host.
    “Disk quota exceeded”No free spaceDelete old backups or files, then retry.
    “Could not move the files into place”File permissionsAsk the host to fix ownership. Don’t set folders to 777.

    On large sites, restore one part at a time: database, then plugins, themes and uploads separately. Shared hosts often run out of resources on a single upload folder over 1 GB. If the plugin offers to continue an interrupted restore, use that option, then check the result. A half-finished restore can leave parts of the site from different dates.

    Old backups bring their own problem. WordPress’s upgrading handbook warns that rolling back can fail when an update changed the database structure. A theme from 2018 on today’s PHP can throw fatal errors even after a clean restore. To get it running, temporarily match the PHP version, or rename the incompatible plugin or theme folder.

    The restore finished but the site still looks wrong

    “Restore complete” means the tool finished. It doesn’t mean the site works. Check these in order:

    • Empty site or install screen: table prefix or database name mismatch in wp-config.php.
    • Old pages showing: clear the page cache, any server cache (such as LiteSpeed) and the CDN.
    • 404s on every page except the home page: go to Settings > Permalinks and click Save Changes without changing anything.
    • Broken images: wp-content/uploads didn’t transfer, or the server can’t read it.
    • Wrong content, or another site’s content: you restored the wrong set, or mixed files and a database from different backups.

    If you restored to a different domain, don’t run a find-and-replace on the SQL file. WordPress’s migration handbook warns that a plain replace breaks serialized data, the format themes and widgets use to store settings. Use a tool that understands it, and do a dry run first:

    wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run
    WordPress Permalinks settings screen after restoring a site from backup
    Clicking Save Changes on the WordPress permalink settings screen flushes rewrite rules to quickly resolve lingering 404 errors after a restore. · Source: kinsta.com

    How to check the restored site before reopening

    Run the structural checks first: wp db check for table errors and wp core verify-checksums for changed core files. Then test what the business depends on:

    • Log in to wp-admin as an existing user.
    • Load the home page and your main landing pages. Check the text, images and menus.
    • Submit a form and confirm the email arrives, not just the thank-you message.
    • Open a recent upload in the Media Library.
    • On a store, place a test order with sandbox payment details. Check recent orders, subscriptions and the scheduled actions under Tools > Scheduled Actions.

    If the restore followed a hack, the backup may already be infected, and the hole the attacker used is still open. Confirm the backup is from before the compromise. Then go through the admin users, plugins and scheduled tasks, update everything and change passwords. Our WordPress security issues guide covers the containment steps.

    When to stop and get help

    Stop when you’ve tried twice with the same error, when the log says the database is invalid, when subscription renewals fall in the gap period, or when you can’t tell whether the backup is clean. At that point, more attempts add risk without adding information. Ask your host for a newer copy, or ask the previous developer, before anyone quotes for a rebuild. Pages that look “missing” are sometimes sitting in a backup someone else holds.

    If you’d rather hand over the diagnosis, SiteSelf works on the live site through chat, using hosting access for file and database work. Before it changes anything, it says what it’s about to change and whether that can be undone, and afterwards it reports what it checked. Here is how SiteSelf handles broken sites.

    Frequently asked questions

    How long does a WordPress restore take?

    WP Engine’s support documentation says an automated restore takes “a few minutes to several hours,” depending on site size and file count. Small sites on a healthy host often finish in minutes. Large upload folders, big SQL files and repeated timeouts are what turn a restore into a day’s work.

    I only have the files, not the database. Can I recover the site?

    Partly. The files give you the theme, plugins and images, but not posts, pages, users or settings, because those live in the database. Ask your host whether they kept database backups before you start rebuilding content by hand.

    Should I restore a backup that is years old?

    Only after asking your host or previous developer for something newer. An old backup loses every change since it was taken, and its plugins and theme are more likely to break on current PHP and WordPress versions. If it’s all you have, restore it to staging first.

    Is restoring from backup enough to fix a hacked site?

    No. The backup may already contain the malware, and the vulnerability the attacker used is still there after the restore. Use a backup from before the compromise, then check users, plugins and scheduled tasks, and close the hole.

    Can I restore only part of a site?

    Many host tools and plugins let you restore just the database, just the plugins or just the uploads. That keeps newer data you’d otherwise lose. The risk is a mismatch, such as theme files that expect database settings from a different date, so check the site carefully afterwards.

  • Why WordPress is not loading and how to fix it

    Key takeaways

    • Test from a phone on mobile data before you touch the site. If the site loads there, the problem is your browser or network, and editing WordPress won’t help.
    • A blank page or ‘There has been a critical error’ usually means a PHP fatal error from a plugin, theme or custom code. Since version 5.2, WordPress’s Recovery Mode can email the administrator a login link that pauses the faulty component.
    • Renaming .htaccess, disabling plugins and rolling back an update are diagnostic tests. Leaving any of them in place can switch off features or reopen a security hole.
    • With Cloudflare’s Flexible SSL mode plus an HTTPS redirect on the origin, you get ERR_TOO_MANY_REDIRECTS. Cloudflare’s fix is Full or Full (strict) mode, or removing the duplicate redirect.
    • WooCommerce warns that the Health Check troubleshooting mode doesn’t put payment gateways into sandbox, so a test order can take a real payment.

    Say your homepage is white and a customer can’t place an order, but the login screen still opens. That detail matters. It means the server answers requests and at least part of WordPress runs, so turning off every plugin would be the wrong first move.

    “Not loading” covers at least eight different failures: a blank page, a critical error, a database error, a 5xx code, a stuck maintenance screen, a redirect loop, a domain that won’t resolve, and a checkout that spins forever. Each one lives in a different layer. Find the layer first and the fix is usually short.

    Is the site down for everyone or just you?

    Find that out before anything else. Open the site in a private window, then on your phone with Wi-Fi switched off. If it loads on mobile data, the fault is your browser, an extension, your router or your DNS resolver, not the site. Our guide to fixing DNS_PROBE_FINISHED_BAD_CONFIG errors covers that case.

    If the site fails on every network, check your host’s status page before you edit anything. On Reddit’s r/webdev, one owner was sure a new forms plugin had broken their site. It turned out to be a host outage. Changing a working site to “fix” someone else’s outage is how one incident becomes two.

    Clearing your browser cache only fixes your own browser. It does nothing for a server, database or DNS fault.

    Which layer does your symptom point to?

    Write down the exact message, the URL and the time it started. Then find it in this table.

    What you seeLikely layerFirst checkWho usually fixes it
    Blank white page, or “There has been a critical error on this website”PHP fatal error in a plugin, theme or custom codeRecovery Mode email, then the debug logYou or a developer
    500 Internal Server Error.htaccess, a plugin, the theme or memoryThe host’s error logYou, a developer or the host
    “Error establishing a database connection”Wrong credentials, or the database server is down or fullCompare wp-config.php with your host’s valuesUsually the host
    “Briefly unavailable for scheduled maintenance”An update left a .maintenance file behindIs the update still running?You
    ERR_TOO_MANY_REDIRECTSTwo redirect rules or the SSL mode disagreeSite URLs, .htaccess, CDN SSL modeYou or whoever controls the CDN
    502, 503, 504 or a timeoutHost capacity, resource limits or the databaseHost status page and logsThe host first
    “Site can’t be reached” or NXDOMAINDNS or nameserversDomain records at the registrarWhoever controls DNS
    Store loads, but checkout spinsJavaScript, caching or CDN optimisationBrowser Console and Network tabsYou or a developer

    Before you edit files, take a backup or a hosting snapshot, and include the broken state. You should know how to restore it without the WordPress dashboard.

    Why a blank page usually points at a plugin or theme

    A white screen or the “critical error” message almost always means PHP hit a fatal error. Practitioners most often find that a plugin, a theme or custom code caused it, usually right after an update or a PHP version change. That pattern comes from repeated reports, not from any measured failure rate.

    WordPress not loading with the critical error message in a browser
    The default critical error message indicates that a fatal PHP issue has abruptly halted WordPress execution, most commonly due to conflicting plugin or theme code. · Source: www.wpbeginner.com

    Start with the Recovery Mode email. WordPress added Recovery Mode in version 5.2. When a fatal error happens, it can email the administrator a login link. That link pauses the faulty plugin or theme for your session only. Visitors still get the error. Use the session to find out which component the email names, then deactivate or update it.

    The email doesn’t always arrive. WordPress’s documentation says Recovery Mode triggers only on fatal errors during normal page loads, not during cron or background tasks. Check spam. If nothing is there, use file access instead.

    Without the dashboard, connect over SFTP or your host’s file manager. Rename the folder of the suspect plugin inside wp-content/plugins. If you can’t tell which plugin is at fault, rename the whole plugins folder. If the theme is the problem, rename the active theme’s folder and WordPress falls back to a default theme, provided one is installed.

    Read the log before guessing. In wp-config.php, edit any existing debug lines rather than adding duplicates. Set them above the “stop editing” comment:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );

    Reload the failing page, then open wp-content/debug.log. Find the first fatal error with a matching timestamp. Its file path names the culprit. Later warnings are often side effects. WordPress’s debugging handbook covers these constants. Never show errors to visitors, and turn debugging off when you’re done, because the log can hold sensitive paths and data. Our guide to reading a WordPress fatal error goes through common messages one by one.

    What a 500 error usually means

    Check the host’s error log first. A 500 hides its cause from the browser, but the log usually names it. WordPress.org’s troubleshooting FAQ names a corrupted .htaccess as a likely cause. To test it, rename the file to .htaccess_old and reload the site. If the site comes back, go to Settings > Permalinks and click Save to create a clean file.

    WordPress Permalinks settings screen used to regenerate .htaccess
    Clicking the Save Changes button on the Permalink Settings screen immediately flushes and regenerates a clean set of WordPress rewrite rules. · Source: kinsta.com

    Keep the old file until you’ve compared the two. It may contain custom rules you still need, such as redirects or security directives. Security plugins sometimes leave rules behind that point to files that no longer exist, and those can cause a 500 on their own. If .htaccess wasn’t the cause, test plugins and the theme next. Our full guide to fixing a server error 500 covers the rest.

    Check database credentials before you change them

    “Error establishing a database connection” has two families of cause. The first is wrong values in wp-config.php: DB_NAME, DB_USER, DB_PASSWORD or DB_HOST. The second is on the host’s side: the database server is down, over its quota, or out of connections.

    Compare each value with what your hosting panel shows. Don’t assume DB_HOST is localhost, because many hosts use a separate database server. If every value matches, contact the host. Guessing new credentials doesn’t fix a stopped database server, and it adds a second fault you’ll have to undo later.

    Stuck on “Briefly unavailable for scheduled maintenance”

    WordPress creates a .maintenance file in the site root during updates and deletes it when they finish. If an update is interrupted, the file stays and the site keeps showing the notice. First make sure no update is still running. Then delete the file (turn on “show hidden files” in your file manager to see it) and rerun the update that failed. Deleting the file only removes the notice. An interrupted update can leave a plugin half-installed, so test that plugin too. Why WordPress updating failed covers that half.

    Redirect loops come from two rules that disagree

    ERR_TOO_MANY_REDIRECTS is a configuration conflict, not a crash. First check that the WordPress Address and Site Address (Settings > General, or WP_HOME and WP_SITEURL in wp-config.php) both use the scheme you intend. Then look for competing redirects in .htaccess, in an SSL plugin and at your CDN.

    Here’s a common version. Cloudflare is set to Flexible SSL, so it talks to your server over plain HTTP. Your server or WordPress redirects HTTP to HTTPS. Each side keeps sending the visitor back to the other. Cloudflare’s documentation recommends Full or Full (strict) mode when your server has a valid certificate, or removing the conflicting redirect.

    Cloudflare SSL mode setting that causes WordPress redirect loops
    Choosing Flexible encryption causes Cloudflare to reach the origin over plain HTTP, triggering an endless redirect loop when the origin server enforces HTTPS. · Source: community.cloudflare.com

    To see the loop instead of guessing, run curl -sIL https://example.com. It prints every Location header in the chain. Adding another force-HTTPS rule makes the loop worse, and clearing cookies won’t fix a loop that starts on the server.

    502, 503, 504 and timeouts belong to the host first

    These codes usually mean the server ran out of capacity or a timeout cut the request off. Note the code and the time, check the host’s status page, and send the host the log lines. Let them recommend memory or execution limits. Raising limits blindly can hide the problem or make it worse. Our guide to fixing a WordPress 503 error explains why.

    Moving to a bigger server can hide the cause too. On r/woocommerce, a store with about 50 plugins timed out for roughly two months. Disabling every plugin brought it back, but the timeouts returned on reactivation. Commenters warned that a dedicated server would only mask a slow plugin or query. Query Monitor, a plugin that shows which components and database queries are slow, is a better next step than a bigger plan.

    When the domain doesn’t resolve at all

    If the browser says the site can’t be reached, or a DNS lookup returns NXDOMAIN, the request never gets to WordPress. Check the A or CNAME records and the nameservers at your registrar or DNS provider against the values your host gives you. After a nameserver change, check that the old records were copied to the new provider. Then wait for the change to spread. Practitioners report waits of a few hours, and occasionally up to two or three days.

    The store loads, but the checkout spins

    On WooCommerce, start with the basics in WooCommerce’s pages-not-displaying guide. Check that the Cart, Checkout and My Account pages exist and are assigned under WooCommerce settings. Save Settings > Permalinks without changing anything. Make sure cart and checkout are excluded from every cache.

    For a spinning checkout, open the browser’s Console and Network tabs and find the first request that fails. Common blockers are JavaScript errors, optimisation plugins, a content security policy, consent tools, ad blockers and CDN features such as Cloudflare’s Rocket Loader and minification. A theme that leaves out wp_head() or wp_footer() can also stop payment scripts from loading.

    One warning before you test: WooCommerce’s Health Check guide says troubleshooting mode doesn’t put your payment gateway into sandbox mode. A test order can take a real payment.

    A test is not a fix

    Renaming .htaccess, disabling all plugins, letting Recovery Mode pause something and rolling back an update are all ways to find the cause. Each one also has a cost. With every plugin off, your forms, checkout and security plugin are off too. A rollback can bring back a vulnerability the update closed. Once you’ve found the culprit, turn everything else back on one at a time and replace or update the component that failed.

    Then confirm the site actually works, not just that a page appears. Log out and load the page that failed. Submit a form. On a store, check that an order record and payment status were created, not just that the confirmation screen showed. Purge the plugin, host and CDN caches so visitors stop seeing the broken copy.

    When to stop and get help

    Call your host if the database server is down, if 5xx errors keep coming back, if your account is suspended, or if you can’t reach a backup. Call whoever controls DNS or your CDN when the fault is in their system. Get a developer in these situations:

    • You have no file access, or you’re not comfortable editing wp-config.php.
    • The error comes back as soon as you reactivate plugins.
    • The log points to custom code or a PHP version mismatch.
    • Checkout is broken and money is at stake.

    Treat unfamiliar admin accounts, redirects to other sites or file changes nobody made as a security incident, not a loading problem.

    When you hand it over, include the failing URL, the timestamps, recent changes, the log excerpt and the tests you’ve already run. Remove passwords and customer data first. If you’d rather describe the symptom in chat and have the logs read and the fix applied for you, SiteSelf’s agent does that work on your site using hosting (SSH) access and reports what it changed and checked: see getting your WordPress site working again.

    Frequently asked questions

    Should I disable all plugins at once or one at a time?

    Do both, in that order. Disabling all of them tells you quickly whether plugins are involved at all. Reactivating them one by one tells you which plugin it is. On a live store, the Health Check & Troubleshooting plugin’s troubleshooting mode lets you run the test in your own session while visitors still see the normal site.

    The front end works but I can’t get into wp-admin. Is that the same problem?

    Usually not. A working front end with a broken login points to a login, cookie, security plugin or redirect issue, not a site-wide failure. Our guide to fixing WordPress login problems sorts those by symptom.

    Could a plugin update have caused this?

    Yes, and it’s the pattern practitioners report most often. Check the Recovery Mode email or the debug log for the plugin it names. Roll that plugin back only as a temporary measure, because the update may have fixed a security flaw.

    Does updating WordPress fix a PHP version problem?

    Not by itself. The PHP version is set by your host, and your plugins and theme need to support it. You can see the current version under Tools > Site Health > Info > Server. If the log shows errors about deprecated or removed functions, update the component named in the error or ask the host which PHP versions it offers.

    Is a slow site the same as a site that’s not loading?

    No. A site that loads slowly needs speed work: caching, fewer heavy plugins, better hosting. A site that returns an error needs repair. Mixing the two up leads to buying a bigger server for a broken plugin, or chasing errors that are really timeouts.

  • Why WordPress updating failed and how to fix it

    Key takeaways

    • A red ‘Updating failed’ notice in the editor is a failed save request, usually blocked by a host security rule or broken by plugin output. Failed software updates come from file ownership, update-server access, disk space, timeouts or conflicts.
    • Never fix ‘could not copy files’ with chmod 777. WordPress’s file-permissions guide says to keep permissions as restricted as possible, and the usual cause is ownership, which only the host can correct.
    • Delete .maintenance only after the update has clearly stopped. Removing it clears the message. It does not finish the update, so check Dashboard > Updates afterwards.
    • If an update breaks a store, roll back the one plugin before you restore a full backup. A full restore can wipe out orders placed since the backup was taken.
    • ‘Update successful’ only means the installer finished. Check the installed version, then place a test order and send a test form.

    WordPress uses the words “updating failed” for two failures that have nothing in common. One appears in the block editor when you click Update on a post or page. The other appears on Dashboard > Updates or the Plugins screen when WordPress could not install new software. The causes are different, the fixes are different, and a fix for one can damage the other.

    So start by working out which one you are looking at. Then read the full error message. “Updating failed” tells you something went wrong. The rest of the message tells you which part of the site failed.

    Which “updating failed” are you looking at?

    Look at where the message appeared and how it is worded. The table below covers the common versions.

    Where you saw itWhat it saysWhat failed
    Block editor, after Update, Publish or Save draft“Updating failed. The response is not a valid JSON response.” or “You are probably offline.”The save request to the REST API
    Dashboard > Updates or Plugins“Download failed”, “Could not create directory”, “Could not copy file”, or a prompt for FTP credentialsThe software update, before or while files were written
    The public site“Briefly unavailable for scheduled maintenance. Check back in a minute.”An update that stopped partway
    Admin email inbox“An automated WordPress update has failed to complete”A background core update that was interrupted
    The site after an “Update successful” noticeA critical error, a white screen, or a checkout that does nothingThe new code ran and something conflicted with it

    If it was the editor, the short version is below, and our guide to a WordPress page not updating goes through every cause. Everything after that section is about software updates.

    If the editor said it, look at the failed request first

    When you click Update, the block editor sends your post to the REST API and expects JSON back. “Updating failed” means it got something else: a firewall block page, a redirect, a login screen, a PHP warning, or stray output in front of the JSON. Until you see what actually came back, you are guessing.

    Open your browser’s developer tools, go to the Network tab and click Update again. Then click the failed request and check three things: the status code, the Content-Type and the start of the response body.

    • 403 Forbidden. A server security rule (ModSecurity, a web application firewall or a CDN) blocked the save. This is the cause people confirm most often in support threads. Ask your host to check the security log and whitelist that one rule. Don’t ask them to switch security off.
    • HTML or a PHP warning in the body. A plugin, theme or snippet is printing output. Reported cases include an incomplete AIOSEO 5.0 database upgrade and a Google Ads tag pasted into a Custom HTML block.
    • A redirect (301 or 302). Check that the WordPress Address and Site Address under Settings > General match, including https and www.

    Reload the post in a new tab before you retype anything. Also, don’t change your permalink format to see if it helps. In one WordPress.org thread, a site owner switched to the default format, broke every link shared on social media, and later found the real cause was a ModSecurity rule. If you want to try it, re-save the existing structure without changing it.

    Why plugin, theme and core updates fail

    For software updates, WordPress’s own documentation and support threads keep pointing to the same few causes. The order below follows how often they come up in reports. Nobody has measured it, so treat it as a rough order. Two places help you sort them fast: Tools > Site Health, which flags problems such as the site being unable to reach WordPress.org, and your host’s error log.

    WordPress Site Health status screen used to diagnose a failed update
    The Site Health Status screen alerts administrators to outdated software components and configuration issues that can prevent routine updates from succeeding. · Source: www.abrightclearweb.com

    “Could not create directory” or an FTP prompt usually means ownership

    WordPress writes update files as the web server’s user. If that user doesn’t own wp-content/plugins or wp-content/upgrade, the write fails, or WordPress asks you for FTP details. Ownership is which server user owns a file. Permissions control what that user can do with it. Changing permissions doesn’t fix the wrong owner.

    That’s why chmod 777 is the wrong fix. WordPress’s file permissions guide says to keep permissions as restricted as possible and warns about 777 specifically. On shared hosting, send the host the exact error and the folder it names, and ask them to correct ownership for that folder.

    “Download failed” means the site could not fetch the package

    The site either couldn’t reach WordPress.org or the vendor’s update server, or the server refused it. If Site Health says it cannot reach WordPress.org, the host needs to look at outbound connections. For paid plugins, check the licence before anything else. It may have expired, or it may be registered to an old domain or to the agency that built the site.

    For WooCommerce Marketplace extensions, WooCommerce’s subscription troubleshooting page covers the usual causes: an expired subscription, a store disconnected from WooCommerce.com, or an outdated WooCommerce.com Update Manager. Changing files won’t fix any of these.

    A full disk blocks updates that look like they would fit

    The updater needs working space as well as room for the finished plugin. It unpacks the package into wp-content/upgrade and may keep a temporary backup of the old version while it works. Check your quota in the hosting panel. To free space, delete old backups stored on the server, not files in wp-content you don’t recognise.

    Timeouts and memory limits leave a named line in the log

    Look in the PHP error log for “Allowed memory size exhausted” or “Maximum execution time exceeded”. If one of those lines matches the time of the update, ask the host to raise that specific limit. If it isn’t in the log, raising limits only hides the real cause.

    Conflicts and buggy releases

    Sometimes the update installs fine and the new code is the problem. A 2023 study by Lin, Sayagh and Hassan found that 497 of the 500 most frequently released WordPress.org plugins had shipped at least one urgent fix within 24 hours of an earlier release. That measures how often releases need patching, not how often updates fail on real sites. It’s still a good reason to read the changelog, and to wait a day before installing a major release on a store.

    To find a conflict without taking the site down, use Troubleshooting Mode in the Health Check & Troubleshooting plugin. The WordPress support handbook explains that it disables plugins and switches the theme for your logged-in session only, so visitors see the normal site. WooCommerce’s conflict-testing guide recommends the same approach, or a staging copy, rather than switching everything off on a live store.

    How to get out of “Briefly unavailable for scheduled maintenance”

    WordPress creates a file called .maintenance in the site root while an update runs and deletes it when the update finishes. If the update stopped partway, the file stays and visitors keep seeing the message. Fix it in this order:

    1. Wait a few minutes. A slow update may still be running, and deleting the file mid-update can leave you with half the files from each version.
    2. Once nothing has changed for a while, connect over SFTP or your host’s file manager. Turn on hidden files, because the name starts with a dot.
    3. Delete .maintenance from the folder that holds wp-config.php.
    4. Go to Dashboard > Updates and see what is still listed. Update the unfinished item on its own, one item at a time.
    5. Check the installed version on the Plugins screen or under Dashboard > Updates.

    The WordPress troubleshooting FAQ confirms that removing the file clears the message, and the same applies to “An automated WordPress update has failed to complete”. Clearing the message doesn’t prove the update finished. Step 4 is how you find out.

    The update worked and the site broke

    If the site shows “There has been a critical error” after an update, the new code is failing when it runs. WordPress usually emails the admin address with a recovery mode link that pauses the failing plugin or theme so you can log in. Our guide to fixing a WordPress fatal error shows how to read the file path in the error, which tells you which component failed.

    Roll back that one component before you consider restoring a full backup. On a WooCommerce store, a full restore brings back yesterday’s database, which means losing every order placed since. Install the previous version from the vendor’s archive or a rollback plugin, then test the page that broke.

    If wp-admin is locked, rename the plugin’s folder in wp-content/plugins (for example to plugin-name-off) and WordPress will deactivate it. If you don’t know which plugin it is, our guide to plugins that stop working walks through isolating it.

    How to update manually when the dashboard keeps failing

    A manual update gets around the updater itself. It does not get around wrong ownership, a full disk or a blocked network, so fix those first.

    • Plugins. Download the current ZIP from WordPress.org or the vendor. Rename the old folder over SFTP so you can go back to it, then upload the ZIP under Plugins > Add New Plugin > Upload Plugin. Deactivate the plugin if you need to, but don’t delete or uninstall it. Uninstalling can delete its settings.
    • Core. Follow WordPress.org’s manual update steps. Replace the core files, keep wp-config.php, and don’t delete the existing wp-content folder. That folder holds your uploads, themes and plugins.
    • Themes. The same idea applies. Our guide to updating a theme without losing work covers child themes and licence errors.

    What “Update successful” does not tell you

    The notice means the installer finished. It doesn’t mean checkout works, forms send, or the version you wanted actually installed. Even update reports can be wrong: Easy Updates Manager’s changelog records a November 2024 fix for emails that marked some failed updates as “success”.

    WordPress updating failed error shown under a plugin on the Plugins screen
    An inline error notification beneath the plugin row highlights the failure message before another update attempt is made. · Source: wpdatatables.com

    After every update, check the installed version, log out and back in, send a test form and look at a few key pages. On a store, WooCommerce’s update guide asks for more: a backup first, staging where you can, letting the update finish without refreshing, running any database update WooCommerce prompts for, and then testing products, cart, checkout, payment, shipping, tax and emails. Before any of that, make sure your backup can actually be restored, because a backup job that ran isn’t proof of that.

    If you’d rather hand the update cycle off, SiteSelf runs plugin updates on request using hosting access, fetches the changed pages afterwards and reports what it updated and what it checked; the page on plugin updates and maintenance explains how that works.

    When to stop and get help

    Contact your host when the save request returns a 403, when the error names a folder WordPress can’t write to, when the disk is full, or when the log shows a PHP limit. These are server settings, and on shared hosting only the host can change them. Contact the plugin vendor when a paid update won’t download and the licence looks valid. Bring a developer in when a fatal error points at custom code, or when checkout is down and a single rollback hasn’t brought it back.

    Whoever you contact, send evidence: the exact message, the time it happened, the plugin and version, the status code or log line, and what you’ve already tried. A vague “updating failed” ticket gets sent back to the forums. A ticket with the log line in it gets fixed.

    Frequently asked questions

    Did my post save even though the editor said updating failed?

    Sometimes. The error tells you the editor didn’t get the reply it expected. That doesn’t always mean nothing was written. Open the post in a new tab or check its revisions before you retype anything.

    Should I re-save my permalinks?

    Re-saving the structure you already have under Settings > Permalinks is low risk, and it regenerates the rewrite rules. Changing the format is a different matter. Every existing URL changes, so links shared elsewhere start returning 404s.

    Is it safe to set folders to 777 so updates work?

    No. It lets anyone on the server write to those files, and it usually leaves the real cause, wrong ownership, untouched. Ask the host to correct ownership on the specific folder named in the error.

    Can I disable all plugins to find the problem on a live store?

    You can, but customers will see a broken store while you test. Use Troubleshooting Mode in the Health Check plugin, which changes plugins only for your session, or test on a staging copy.

    Why do automatic updates fail when manual updates work?

    Background updates depend on scheduled tasks and on the site sending requests to itself. A plugin conflict or a host firewall, DNS, SSL or password-protection rule can block those requests. Site Health reports loopback and scheduled-event problems, so start there.

    Should I restore a full backup after a bad update?

    Only after a targeted rollback has failed. A full restore replaces the database too, so on a store you lose any orders and customer accounts created since the backup was taken.