Blog

  • Problems with WordPress today and how to fix them

    Key takeaways

    • Self-hosted WordPress has no central server that can go down. If your site fails, the cause is your site, your host, your domain or your network.
    • Plugin and theme incompatibility after an update is the most common trigger. Some conflicts only appear when two specific plugins are active together, so disabling everything at once can hide the cause.
    • Patchstack counted 11,334 new WordPress ecosystem vulnerabilities in 2025. 91% were in plugins and 46% had no developer fix at disclosure.
    • Read the error log before you raise the memory limit, change PHP or restore a backup. Each of those can hide the real cause or overwrite new orders.
    • On a stuck WooCommerce checkout, check WooCommerce > Orders before you retry, because the order may already exist. A staging copy can still charge real payments.

    When a WordPress site breaks today, WordPress itself is rarely the cause. The cause is usually one plugin, one theme, the PHP version, a cache or the host, and each of these fails in its own way. Patchstack’s report on 2025 found 91% of new WordPress vulnerabilities in plugins. Everyday breakage follows the same pattern: the trouble is in the layers around core.

    This matters because your first move decides how long the fix takes. Find the failing request or component before you change any settings. Our guide to fixing WordPress issues without guessing covers the method in depth. This page matches today’s common symptoms to the first safe step for each.

    Is WordPress down, or is it just your site?

    It is almost always just your site. Self-hosted WordPress has no central server that can go down for everyone. WordPress.com is a separate hosted service with its own status page, and that page tells you nothing about a site on your own hosting.

    Rule out the cheap explanations before you touch plugins:

    • Load the site on mobile data instead of your office Wi-Fi.
    • Confirm the domain hasn’t expired and the hosting bill is paid.
    • Check your host’s status page.

    Each of these can produce the same blank page or timeout as a broken plugin, and no amount of plugin testing will fix them.

    Which problems turn up most, and what to do first

    Nobody publishes a reliable count of which WordPress problems are most common. The table below follows the order that WordPress.org’s documentation, WooCommerce’s docs and the support forums consistently point to. Find your symptom before you change anything.

    SymptomUsual causeFirst safe step
    Something broke right after an updatePlugin or theme incompatibilityRoll back or disable that one component, on staging if you can
    “There has been a critical error on this website”PHP fatal error in a plugin, theme or custom codeRecovery Mode email, or the error log
    White screen or 500 errorPHP fatal error, .htaccess or memoryRead the error log
    “Allowed memory size … exhausted”The process named in the errorFix that process before you raise the limit
    Changes not showingA cache layer still serving the old copyPurge every layer and test in a private window
    Checkout stuck on a spinnerA failed background requestBrowser Network tab, then check Orders
    “Error establishing a database connection”Wrong wp-config.php details, or the database serverCheck the credentials, then ask the host
    Every post 404s, homepage loadsStale rewrite rulesSave Settings > Permalinks

    The site broke after an update

    This is the problem people hit most often. WordPress.org’s Recovery Mode documentation says fatal errors often come from an incompatible or faulty plugin, theme or custom code, and updates are when those incompatibilities show up. An update can break the whole site, only wp-admin, or a single feature such as checkout, a form or a layout.

    Start with what changed. If one plugin updated this morning and checkout broke this afternoon, roll back or deactivate that plugin first. If nothing obvious changed, run a conflict test the way WooCommerce documents it:

    1. Switch to a default theme.
    2. Disable all plugins.
    3. Turn them back on one at a time, and repeat the exact action that failed after each one.

    The common trap is disabling everything and calling the site fixed. Some conflicts only happen when two specific plugins run together. A blanket disable brings the site back but hides which pair caused the problem.

    One store owner on the WordPress.org forums handled this well. They updated a cookie consent plugin and a few others on staging, and guest checkout stopped working. Testing showed the consent plugin was blocking a WooCommerce script. A settings exception worked around it until the plugin’s author released a fix. The live store never saw the failure.

    If WordPress said the update itself failed, that’s a different problem. See why WordPress updating failed.

    “There has been a critical error” means PHP stopped

    This message means a PHP fatal error, almost always from a plugin, theme or code snippet. WordPress emails the admin address a Recovery Mode link, which pauses the failing component for your login session only. Visitors still see the error until you deactivate or fix that component. WordPress’s documentation calls deactivation a temporary fix, not the real one.

    The email often never arrives, especially when the admin address is an inbox nobody reads anymore. In that case, open your host’s file manager or connect over SFTP and rename the suspect plugin’s folder in wp-content/plugins. WordPress then treats that plugin as deactivated. The error log names the file that failed, which tells you which folder to rename. Our guide on how to fix a WordPress fatal error shows how to read that log.

    A white screen or a bare 500 is often the same failure with error display turned off. WordPress’s common-errors handbook lists .htaccess, plugins, the theme and memory limits as causes of a 500. The log tells you which one it is. See fixing a server error 500 on WordPress.

    Memory errors: fix the process, not the limit

    When the log shows “Allowed memory size of … bytes exhausted”, visitors usually see a critical error, a blank page or a 500. Kinsta’s documentation advises fixing the process named in the error rather than simply raising the limit. Raising WP_MEMORY_LIMIT in wp-config.php only helps when the limit really is the problem. Your host may also enforce a lower ceiling than WordPress requests, so the edit can do nothing at all.

    If the error names a plugin file, that plugin is your first suspect. Before you edit anything, ask your host what memory limit your plan actually allows.

    Changes not showing usually means a cache is still serving the old page

    A WordPress site can have five caches: a caching plugin, the host’s server cache, an object cache, a CDN and the browser. Clearing one doesn’t clear the others. Purge each layer you have, then check the page in a private window.

    Stores have a second cache problem. WooCommerce’s documentation says the Cart, Checkout and My Account pages usually need to be excluded from page caching because their content is specific to each shopper’s session. If they get cached, those pages can display incorrectly or stop working.

    A stuck checkout spinner means a request failed

    WooCommerce’s documentation says the spinner alone doesn’t tell you the cause. To find it:

    1. Open your browser’s developer tools and go to the Network tab.
    2. Filter by Fetch/XHR.
    3. Place a test order and find the request that failed.

    The failed request points to the layer at fault:

    • 403: a firewall, security rule or authorization check rejected the request.
    • 500: a PHP fatal error or server failure. Check the error log.
    • HTML or a redirect where JSON should be: a cache, security layer, proxy, redirect or PHP warning changed the response.

    The same document gives three warnings:

    • Check WooCommerce > Orders before you retry “Place order”. The order may already exist.
    • A staging copy can still charge real payments, send email and fire webhooks unless you turn those connections off.
    • Don’t switch between the Checkout block and classic checkout as a first step. The switch can hide the original incompatibility.

    “Error establishing a database connection”

    WordPress’s handbook gives two kinds of cause:

    • A wrong database name, user, password or host in wp-config.php.
    • A problem at the host, such as a database server that is down or over its quota.

    If you haven’t changed the credentials and the error comes and goes, suspect the database server.

    Extreme cases exist. One site on the WordPress.org forums had intermittent connection errors on shared hosting. Replies traced them to a wp_options table that had grown to about 32 GB, which caused table locking. The right fix in a case like that has three parts: find the plugin writing the data, back up, and have the host look at the database. A cleanup plugin that removes the data but leaves the plugin writing it only buys a few weeks.

    Every post 404s but the homepage loads

    This usually means the rewrite rules are stale. Go to Settings > Permalinks and click Save Changes without changing anything. That rebuilds the rules.

    If that doesn’t help, check two things. The server may not have Apache’s mod_rewrite module enabled, which WordPress.org’s troubleshooting FAQ lists as a cause. Or a page and a custom post type may share a slug. If you aren’t comfortable editing .htaccess, ask your host.

    Why the plugin security problem keeps getting bigger

    Patchstack counted 11,334 new vulnerabilities in the WordPress ecosystem in 2025, 42% more than in 2024:

    • 91% were in plugins and 9% in themes. Only six were in core, all low priority.
    • 46% had no fix from the developer by the time they were made public.

    Treat these numbers with care. Patchstack sells security products. Other security companies count vulnerabilities differently and get different totals. Some of the growth comes from more researchers looking. A vulnerability count is not a count of hacked sites. What every source agrees on is that the risk is in plugins, so an up-to-date core does not mean an up-to-date site.

    Site owners feel this too. In WordPress.org’s 2023 Annual Survey, the top frustration was “too many plugins (finding the right one)” at 18.6%. Security followed at 16.4%, slow performance at 16.2%, and maintenance and updates at 12.3%.

    The practical response is routine work:

    • Delete plugins you don’t use.
    • Keep the rest updated.
    • If a plugin has a publicly known flaw and no fix, deactivate or replace it.

    If you suspect a hack, WordPress security issues and how to fix them explains how to tell a compromise from an ordinary error.

    Which quick fixes make things worse

    Each of these feels like progress and often isn’t:

    • Raising the memory limit before reading the log. It hides a faulty plugin, and the host may ignore the new value anyway.
    • Clearing one cache and assuming the job is done. The CDN or server cache can still serve the old page.
    • Disabling the security plugin to see if it helps. Confirm that it blocked the request first. Otherwise you have removed protection and learned nothing.
    • Disabling plugins on a live store at a busy hour. Customers lose the features those plugins provide while you test.
    • Changing PHP because the site is slow. A PHP change is a compatibility project, not a speed fix. Test it on staging.
    • Restoring a full backup first. A restore overwrites every order, form entry and edit made since the backup was taken. Rolling back one plugin keeps them. If you do need a restore, how to restore a WordPress site from backup covers what to protect first.
    • Changing several things at once. If the site comes back, you won’t know which change fixed it.

    When to stop and get help

    Stop doing it yourself in any of these situations:

    • You are locked out of both wp-admin and your hosting files.
    • A live checkout is failing and you have no staging copy you can safely test payments on.
    • There are signs of a compromise: redirects you didn’t add, admin users you don’t recognise, or browser warnings.
    • Database errors continue even though the credentials are correct.

    Whoever takes the job needs the same information either way:

    • the URL;
    • the exact action that fails;
    • when it last worked;
    • what changed in between;
    • the relevant lines from the error log.

    Get the scope and any extra charges in writing before work starts. “Investigation” means different things to different providers.

    If you’d rather describe the symptom in chat than trace it yourself, SiteSelf’s agent can do WordPress troubleshooting and bug fixes on your existing site, using hosting access for file and code work, and reports what it changed and checked.

    Frequently asked questions

    How do I find which plugin is causing the problem?

    Disable all plugins, then turn them back on one at a time, repeating the exact action that failed after each one. Switch to a default theme too if the problem survives. Do this on staging for a store, because disabling plugins on the live site removes features customers rely on.

    Does updating WordPress fix every security issue?

    No. Core updates cover core. Plugins and themes update separately. PHP is updated on the server by your host. A dashboard that says everything is up to date tells you nothing about the PHP version running your site.

    Should I turn on automatic plugin updates?

    For well-maintained plugins on a simple site, auto-updates close security holes faster than you would by hand. On stores and sites with custom layouts, an update can break checkout or a template without warning, so test those updates on staging first. Either way, keep a backup you know you can restore.

    Why did my site suddenly slow down?

    “Slow” is a symptom with several possible causes: a plugin, large images, the host, caching, the theme, external scripts or the database. Measure the page with PageSpeed Insights before you change anything or pay for optimisation. Turning plugins off doesn’t always reveal the cause.

    Can two plugins that work fine on their own break the site together?

    Yes. Some conflicts only appear when two specific plugins, or a plugin and a theme, are active at the same time. That’s why the conflict test turns plugins back on one at a time instead of judging each plugin alone.

    Can my host fix it?

    Hosts handle server problems: database outages, memory ceilings, PHP versions and missing server modules. Most won’t debug a plugin conflict, and some charge for investigation. Ask your host to confirm your account’s limits and check the server logs, then take that information to whoever fixes the site.

  • Creating landing pages on WordPress, step by step

    Key takeaways

    • Build on Pages > Add New. Elementor’s separate Landing Page feature is deprecated as of Elementor Pro 3.27, and those legacy pages can’t be picked as the homepage.
    • Pick the layout on purpose. Elementor’s Canvas removes the header, footer and sidebars, and Full Width keeps the header and footer. Editing a shared template changes every page that uses it.
    • A form passes only when a test entry reaches the inbox. Every field needs a visible label whose for value matches the input’s id, as the W3C’s accessibility tutorials describe.
    • Unbounce’s 6.6% median conversion rate covers many platforms and industries. Compare against your own baseline, split by device and traffic source.
    • Near-identical pages for each city or keyword can fall under Google’s doorway abuse policy. Each page needs its own reason to exist.

    WordPress has no landing-page content type. A landing page is an ordinary Page with one job: get a visitor from an ad, an email or a post to take one action. You don’t need a special plugin, and you shouldn’t use the special feature some older tutorials describe. Elementor’s separate Landing Page feature is deprecated as of Elementor Pro 3.27.

    The build is the easy part. Practitioners on Reddit and the WordPress.org forums keep naming the same hard parts: the copy, the scope, mobile behaviour, testing the form, and keeping the page in step with the offer once it’s live. This guide covers the whole job, from the goal to the launch checks. If you’re still choosing a tool, our guide to building a landing page in WordPress compares the block editor with page builders.

    What should you decide before opening the editor?

    Decide on one action and write it down in a single sentence. For example: “This page helps homeowners in our area request an interior painting quote.” If you can’t write that sentence, the page will try to do three things and none of them well.

    Add three facts to the sentence. Where do visitors come from? What does the ad or email promise? What does your team need from the visitor to reply properly? Those answers decide the headline, the form fields and the slug.

    Also decide what counts as a good result. A quote request from outside your service area is still a completed form, but it isn’t work. Track qualified enquiries next to raw submissions. Otherwise a page can look successful while it fills your inbox with leads you can’t serve.

    What do you need before you start?

    • Access: an Editor or Administrator account. To set the page as the homepage, change a template or install a form plugin, you need Administrator.
    • Copy: a headline, three or four benefits, one or two pieces of real proof, and answers to the questions that hold buyers back. Write the copy before you build. Writing it during the build is what turns a three-hour page into a three-day page.
    • Images: one hero photo of real work, sized for the web.
    • A form tool your site already uses, if it has one.

    How to create the landing page

    1. Create the page. Go to Pages, then Add New. Give the page a title and set a short slug that uses the words from the ad, such as interior-painting-quote. If you change the slug after the campaign starts, every link already sent out breaks unless you add a redirect.
    2. Choose the layout for this page only. This is the setting behind most “my menu disappeared” and “why is the header still there” questions, and it depends on your theme:
      • In a block theme, assign a custom template (Learn WordPress builds one without header navigation).
      • In a classic theme, pick the blank or full-width template if the theme provides one.
      • In Elementor, open Page Settings, then Page Layout. Canvas removes the header, footer and sidebars. Full Width keeps the header and footer. Elementor’s Single Page templates apply only to pages on the Default layout.
      Don’t edit a shared template to change one page. The WordPress Theme Handbook warns that a template change affects every page that uses it.
    3. Write the hero to match the ad. An ad about interior painting should land on a headline about interior painting, not “Transform your space.” Say who the page is for, what they get and what to do next. Put the button beside that text. Use the same button wording (“Get a quote”) here and on the form’s submit button.
    4. Add benefits, proof and objections. The Learn WordPress landing page lesson lists a hero with a call to action, benefits and social proof as the core sections. Place proof near the button, not three screens below it. A named review that mentions the type of job beats an anonymous compliment. Add an FAQ only for real hesitations, and put another button after it.
    5. Build a short, accessible form. For every field, ask whether it changes what your team does next. If it doesn’t, cut it. Give every field a visible label. Placeholder text alone disappears as soon as someone types. The W3C’s guidance on labeling form controls says an explicit label’s for value must match the input’s id. Error messages should say what to fix. Our guide to adding a contact form in WordPress covers the plugin side.
    6. Prepare the images. Compress the hero and check how it crops on a phone. Give informative images short alt text that says what they show. Give decorative images an empty alt="". Don’t leave the attribute out.
    7. Publish, then decide about the homepage. A campaign page can live at its own URL. If it really should replace the homepage, go to Settings, then Reading, choose “A static page” and select it as the Homepage. The Homepage and the Posts page can’t be the same page. In a block theme, check Appearance, then Editor, then Templates, because a Front Page template there can override the Reading setting.

    Selling one product? On a WooCommerce store, add the Single Product block to the page and choose the product. WooCommerce’s documentation says the block displays the product’s image, title, price and add-to-cart controls. A page that only looks like a product page can’t take payment. Keep Cart, Checkout and My Account as separate assigned pages. WooCommerce warns that combining them breaks redirects and payment gateways.

    What does a correct result look like?

    Test the live URL, not the editor preview, while logged out and on a real phone. Logged-in views often skip the cache, so you may see a version your visitors don’t. The page passes when:

    • The first screen shows the offer and the button without zooming, and no popup or cookie banner covers them.
    • The button scrolls to the form, and nothing sticky, such as a header or chat widget, hides the form after the jump.
    • A test submission shows a confirmation and arrives in the right inbox. A success message on screen isn’t proof the email was delivered.
    • Submitting with a required field left empty shows an error that says what to fix.
    • The browser tab shows your real site name, not the default “My WordPress Blog” that practitioners on X keep finding on launch day.
    • The exact URL from the ad, tracking parameters included, opens the page.

    What to do if it did not work

    Most broken landing pages are a setting, not a bug. Start with the symptom:

    SymptomUsual causeFix
    New page shows a 404A cached 404, or rewrite rules that need refreshingPurge every cache layer: plugin, host and CDN. If all pages 404 but the homepage loads, open Settings, then Permalinks, and click Save Changes without changing anything.
    Visitors see an old versionOnly one cache layer was clearedPurge every layer and check in a private window. See why a WordPress page isn’t updating.
    Menu missing, or header still showingWrong layout (Canvas or Full Width)Change the layout on this page only.
    Homepage still shows postsReading setting not saved, or a block theme Front Page templateCheck both.
    Page missing from the Homepage dropdownIt was built with Elementor’s legacy Landing Page typeSave the design as a template, insert it into a regular Page, then assign that Page.
    Elementor editor won’t loadPlugin conflict or PHP memoryTry Elementor’s Safe Mode, deactivate plugins one at a time, and check the memory limit (Elementor recommends at least 256 MB).

    Don’t change the site-wide permalink structure to fix one page. WP Engine’s support docs warn that this can cause 404s across an established site. If the editor error is misleading, check the PHP error log as well as the browser console. In one WordPress.org support thread, “elementor is not defined” turned out to be the host’s 128 MB memory cap. When a fix needs server access or the cause stays hidden after these steps, ask your host or a developer.

    Should you make a version for every city or keyword?

    Only if each version has something real to offer that the others don’t. Google’s spam policies describe doorway abuse as pages that are substantially similar, target similar queries or locations, and funnel users to one destination. Swapping the city name in an otherwise identical page fits that description. One commenter on r/marketing gave a sensible rule: reuse a template when the use cases really are alike, and write separate pages when they differ.

    Paid-traffic variants are different. Pages for an ad test are usually kept out of search anyway. If you run two near-copies, point a rel="canonical" at the main one or redirect the loser when the test ends.

    How do you tell if the page is working?

    Use your own numbers first. Unbounce reports a 6.6% median conversion rate from its Q4 2024 data across about 41,000 pages. That covers many industries and builders, and none of the data is specific to WordPress. A quote request, a sign-up and a purchase are different decisions, so a benchmark is context, not a target.

    Record visits, form starts, submissions and qualified enquiries, split by device and by traffic source. Mobile falling while desktop holds points to layout, overlays or loading. People starting the form and not finishing points to fields or errors. Lots of traffic from one source with weak leads points to the ad’s promise. Change one thing at a time. On a low-traffic site, fix confirmed faults and clear confusing copy, and call untested tweaks guesses.

    Then keep the page current. Practitioners on X describe the same decline: the demo gets imported and the text swapped, and then the price goes stale, nobody tests the form again, and the mobile layout slowly breaks as people add sections. Put a date in the calendar to re-test the form and check the offer. If you’d rather describe each change in chat and have it made and checked on your existing site, that’s what SiteSelf’s page and copy edits cover, though pages owned by Elementor, Divi or Beaver Builder are refused, with the reason.

    Frequently asked questions

    Can I create a landing page without a plugin?

    Yes. A regular Page, the block editor and a blank or custom template are enough. Builders save time with templates and ready-made widgets. They also add weight and make it harder to switch tools later.

    Should a landing page hide the site navigation?

    No controlled evidence settles this. A page for paid traffic with one action usually works best without the menu. A page that people find through search, or that needs to build trust, often benefits from keeping it. Match the page to the traffic source and test.

    How long does creating a landing page take?

    Reports on r/Wordpress range from an hour or two to several days. One developer estimated three to four hours for a simple one-pager. Having the copy and images ready matters more than which tool you pick.

    Does a fast landing page rank better?

    Speed helps visitors, especially on phones, but it is one consideration among many. A well-built page still competes with established pages that have links and history. Treat speed as a requirement for the people who arrive, not as a ranking strategy.

    Can I keep my old Elementor landing pages?

    Elementor says existing landing pages are not affected, but it recommends against using the feature going forward. There’s no rush to migrate. Rebuild a legacy page as a regular Page when you next need to change it, or when it has to become the homepage.

  • 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.