Author: RunCloud Team

  • How to Add Expires Headers in WordPress

    How to Add Expires Headers in WordPress

    Is your WordPress site failing performance audits like Google PageSpeed Insights or GTmetrix? One of the most common (yet easiest to fix) reasons for a low score is the “Add Expires Headers” warning.

    When this is missing, your server fails to tell visitors’ browsers which files (like images, CSS, and fonts) should be saved locally, forcing them to re-download your entire design every single time they visit a new page. This not only destroys your page speed but also eats up your bandwidth and hurts your SEO rankings.

    In this guide, we will break down exactly how “Expires Headers” work and why they are essential for a fast, responsive WordPress site. You will learn the differences between Expires and Cache-Control, how to implement these settings on NGINX and Apache servers, and how to troubleshoot common issues such as CDN conflicts or files that won’t update after a deployment.

    What Are “Expires Headers” and Why Do They Matter?

    “Expires Headers” are instructions sent by your web server to a visitor’s browser that define how long the browser should keep a file in its local cache.

    When an audit flags this as an issue, it means your server is telling the browser to check for new files too frequently, or to cache them not at all. Resolving this allows the browser to load your design elements directly from the user’s computer, dramatically increasing page speed.

    Expires vs. Cache-Control: What’s the Difference?

    While they sound similar, they are two different methods for managing how long files stay in a browser’s memory:

    • Cache-Control: This is the modern, preferred standard. It uses “max-age” to define a duration (e.g., “cache this for 30 days”).
    • Expires: This is an older method that requires you to set a specific calendar date and time.

    You can use both at the same time. This ensures maximum compatibility; modern browsers will prioritize the newer Cache-Control header, while older browsers will reliably fall back to the Expires header.

    Suggested Read: How to Easily Fix the Leverage Browser Caching Warning in WordPress

    Caching Reference Table for Novices

    Not all files are created equal when it comes to caching. Setting a one-year expiration for your main HTML file would be disastrous, as your visitors would rarely see new content. Conversely, caching an image for only an hour is a massive waste of bandwidth.

    Before we dive into the technical steps for adding headers, it’s important to understand which expiration durations are appropriate for different file types. The table below outlines recommended caching lengths for common website assets.

    File TypeRecommended DurationWhy?
    CSS & JS1 YearThese rarely change; cache busting handles updates.
    Images (JPG, PNG)1 YearImages are heavy; caching them saves massive bandwidth.
    Fonts (WOFF, TTF)1 YearFonts don’t change and are essential for rendering design.
    HTML Files0 to 12 HoursHTML changes often; you want users to see new content quickly.
    Favicon1 WeekA small file that rarely changes but is safe to update occasionally.
    Third-Party ScriptsN/AYou cannot control external scripts (e.g., Google Analytics).

    Suggested Read: Server Cache vs. Browser Cache vs. Site Cache: What’s the Difference?

    How to Add Expires Headers in WordPress

    Adding Expires headers is a simple way to speed up your site, but it requires modifying your server settings. If you aren’t sure which web server you use (Apache or NGINX), ask your hosting support team before proceeding.

    Step 1: Check what your server is sending right now

    Before you change anything, see if your site already has these headers.

    1. Open your website in Chrome or Firefox.
    2. Right-click anywhere on the page and select Inspect.
    3. Go to the Network tab at the top of the window that pops up.
    4. Refresh your webpage (F5).
    5. Click on any file in the list (like a .jpg or .css file).
    6. Look for a sub-tab called Headers and scroll down to Response Headers. If you see Cache-Control or Expires, your site is already configured.

    Suggested Read: How To Use NGINX FastCGI Cache (RunCache) To Speed Up Your WordPress Performance

    Step 2: How to add Expires headers on NGINX for static assets

    NGINX handles headers through server configuration blocks rather than a simple file edit, which makes it very fast but slightly more technical to set up.

    Note: If you are using RunCloud, you can apply HTTP headers in just a couple of clicks directly through the RunCloud dashboard (no SSH or command-line experience required).

    If you are configuring this manually, follow these steps:

    1. Log in to your server: Use an SSH client (like PuTTY on Windows, or the built-in Terminal on macOS/Linux) and connect to your server.
    2. Locate your NGINX configuration file: It is usually found within your site’s NGINX configuration block (located at /etc/nginx/sites-available/). You will need administrative access to your server to edit these files.
    3. Identify the correct server block: Open the configuration file for your specific domain. Ensure you are editing the file that handles your primary website traffic.
    4. Define the cache duration for file types: Inside your server block, create location rules for the specific file types you want to cache. For example, to cache images for one year, you would add:
    location ~* \.(jpg|jpeg|png|gif|ico|svg)$ {
        expires 365d;
        access_log off;
    }
    1. Add rules for CSS and JavaScript: In the same way, add a separate block for your static code files to ensure they are also cached for the long term:
    location ~* \.(css|js)$ {
        expires 365d;
        access_log off;
    }
    1. Test your configuration: Before saving and restarting, always run nginx -t in your terminal to ensure there are no syntax errors that could take your site offline.
    2. Reload NGINX: Once the configuration is verified as valid, reload NGINX using sudo service nginx reload to apply the new headers globally.
    how to add expires headers

    Step 3: How to add Expires headers on Apache using .htaccess

    If your WordPress site is hosted on Apache, you can manage your site’s performance headers by modifying the .htaccess file. Follow these steps to safely update your headers:

    1. Locate the .htaccess file: Log in to your hosting provider’s File Manager (or use an FTP client like FileZilla). Navigate to your WordPress “root” directory (this is the folder that contains your wp-config.php and wp-content folders). If you do not see a file named .htaccess, ensure your File Manager is set to “Show Hidden Files.”
    2. Create the file (if necessary): If you truly do not have an .htaccess file, create a new text file in the root directory and name it exactly .htaccess (ensure there is no .txt extension).
    3. Backup your current file: Before making any changes, right-click your existing .htaccess file and download it to your local computer. If you accidentally make a mistake and your site displays a “500 Internal Server Error,” you can simply upload the original file to instantly restore your site.
    4. Edit the file: Right-click the .htaccess file on your server and select Edit or Code Editor.
    5. Insert the Expires code: Scroll to the very top of the file. Paste the following configuration snippet. 

    Important: If you see any existing text that starts with # or looks like a comment (such as the default WordPress rewrite rules), do not delete it; place your new code above or below the existing blocks.

    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresDefault "access plus 1 month"
        
        # Cache static assets for 1 year
        ExpiresByType image/jpg "access plus 1 year"
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/gif "access plus 1 year"
        ExpiresByType image/png "access plus 1 year"
        ExpiresByType text/css "access plus 1 year"
        ExpiresByType text/javascript "access plus 1 year"
        ExpiresByType application/javascript "access plus 1 year"
        ExpiresByType application/x-javascript "access plus 1 year"
        ExpiresByType application/font-woff2 "access plus 1 year"
    </IfModule>
    1. Save and Verify: Save your changes and visit your website. Refresh your page a few times. If the site loads normally, your headers are now active. If you see an error page, delete your changes and restore the backup file you created in Step 3.
    expires headers in HTTP

    Troubleshooting Expire Headers

    Even after following the setup steps, you might find that your browser isn’t picking up the changes. This is usually due to an intermediary service or a configuration conflict. Here is how to troubleshoot the most common sticking points.

    Expires headers not showing in DevTools or curl

    If you added the code but don’t see the headers, your server might not have loaded the new configuration yet.

    • For Apache users, ensure the mod_expires module is actually enabled in your server settings.
    • For NGINX, you must reload the service (e.g., nginx -s reload) for changes to take effect.
    • If you are using a caching plugin, clear its cache entirely, as it may be serving old, cached versions of your pages that do not include the new header instructions.

    Suggested Read: NGINX Caching for WordPress – Complete Guide & Tutorial

    Cache-Control is overriding Expires 

    It is common for these two headers to “compete.” By web standards, Cache-Control (specifically max-age) takes precedence over the Expires date. If your server is configured to set both, but they conflict, the browser will ignore the Expires header entirely. To resolve this, ensure your configuration rules are consistent so that both headers dictate the same expiration duration.

    CDN is rewriting or stripping headers

    If you use a Content Delivery Network (like Cloudflare or BunnyCDN), the headers you set on your server might be ignored or overwritten by the CDN’s own settings. Check your CDN dashboard’s “Caching” or “Rules” section; it often includes its own “Browser Cache TTL” settings that act as a global override. You may need to adjust the CDN panel settings to match your desired expiration policies.

    Suggested Read: Scaling RAM & CPU Cores – How They Affect WordPress Performance

    Third-party resources still failing the audit

    Tools like PageSpeed Insights will always flag third-party scripts (such as Facebook Pixels or Google Analytics) because you do not have permission to modify headers on external servers. This is expected behavior; you cannot fix it, and it generally does not significantly affect your site’s actual performance score to warrant concern. Focus only on the files hosted on your own domain.

    Changes apply, but files do not update after deploy

    A long cache expiration value is good for performance, but can lead to deployment headaches. If you update a cached file, such as a CSS stylesheet or JavaScript script, a user’s browser will continue to display the “broken” or outdated version until its expiration date.

    This occurs because the browser trusts the long-term header instruction and loads the file from local storage rather than checking the server for an updated copy. As a result, users will not see your latest design or functionality changes.

    To overcome this caching conflict without reducing your expiration times, you can use a technique called “cache busting.” You can do this by appending a unique version parameter to the file URL in your theme’s code (e.g., changing style.css to style.css?ver=1.1).

    When the file is updated, you simply change this version number. The browser interprets the new URL as a completely different file, forcing it to bypass the old, long-term cache and download your latest changes immediately, ensuring all users see the correct, up-to-date content.

    Suggested Read: How To Use Redis Object Cache To Speed Up A Dynamic WordPress Site

    Wrapping Up

    By correctly setting expiration rules for your static assets, we can ensure that returning visitors experience lightning-fast load times, as their browsers won’t need to re-download elements like CSS, images, and fonts.

    To remove the manual guesswork from this process, we highly recommend using RunCloud to effortlessly manage your NGINX configurations.

    By centralizing your server management through RunCloud, you can easily apply, reload, and manage your HTTP headers without worrying about complex syntax errors.

    For an even smoother experience, pair this with the RunCache plugin to automatically implement the best caching rules for your WordPress site. Together, these tools ensure your site follows modern best practices, allowing you to focus on your content while your server handles the speed optimization automatically.

    Start using RunCloud today.

    FAQs on Expires Headers

    Is the Expires Header the same as the Cache-Control header?

    No, they are different methods for controlling browser caching. Cache-Control is the modern standard that uses duration (e.g., “cache for 30 days”), while Expires is an older method that requires a specific calendar date and time.

    What is a good Expires value for CSS, JS, images, and fonts?

    For these static assets, it is best to set an expiration date for one year in the future. Because these files rarely change, a long duration significantly improves load speeds for returning visitors.

    Why do I still see “Add Expires Headers” after setting them?

    You may still see this warning because your web server configuration (like NGINX or Apache) is not correctly applying the rules, or your caching plugin needs to be cleared. Additionally, some tools flag the headers even if they are present but set for a shorter duration than their specific performance policy requires.

    Can I set Expires headers for Google Fonts or analytics scripts?

    You can set headers for Google Fonts if you host them locally on your own server. However, for files hosted on third-party servers, such as Google or analytics providers, you cannot control their headers because those settings are managed exclusively by the external service.

    Should I use both Expires and Cache-Control?

    Generally, no. Since Cache-Control is the modern, preferred standard, you typically only need to set that one. However, there is no harm in including both Cache-Control and Expires. Modern browsers will use Cache-Control and ignore Expires, but including Expires provides a fallback for very old browsers that may not support Cache-Control.

    Will Expires Headers break updates after plugin/theme changes?

    They can cause issues because the browser will continue to load the old version of the file until the expiration date passes. To fix this, developers use “versioning” or “cache busting” (adding a query string like style.css?ver=1.1 to the file name) to force the browser to download the updated version immediately.

  • How to Preload Fonts in WordPress to Reduce CLS and Improve LCP

    How to Preload Fonts in WordPress to Reduce CLS and Improve LCP

    Is your WordPress site failing Core Web Vitals checks despite having optimized images and minified code?

    In some cases, slow typography loading can delay Largest Contentful Paint and cause visual instability known as Cumulative Layout Shift – but only when fonts are part of the critical rendering path.

    In this guide, you will learn exactly how to preload fonts in WordPress to remove render-blocking delays and make your text appear instantly.

    We will walk you through identifying the correct font files, adding the precise code snippets to your theme, and avoiding common mistakes that can actually slow your site down.

    When This Guide Will Not Help

    This guide will not improve your Core Web Vitals if your Largest Contentful Paint element is an image, background video, or slider. In those cases, font loading is not the bottleneck, and preloading fonts will have little or no measurable impact.

    Before continuing, confirm that text (such as an H1 or hero heading) is identified as the LCP element in PageSpeed Insights or Lighthouse.

    If fonts are not flagged under “Preload key requests”, this guide is not the correct fix.

    Why Font Loading Causes CLS and LCP Issues in WordPress

    Fonts are often the “heaviest” assets on a page after images, but browsers handle them differently than other files. In WordPress, themes frequently enqueue fonts via external requests (such as Google Fonts) or bury them deep within CSS files. This creates a “chain of delays” where the browser downloads the HTML, then the CSS, and only then realizes it needs to download a font file.

    This delay exposes your site to slow server responses. If your hosting environment has a high Time to First Byte (TTFB), the browser waits even longer before starting the font download. 

    How Late Font Loading Triggers Layout Shift 

    Cumulative Layout Shift (CLS) occurs when elements on a page unexpectedly move. It happens in three parts:

    • When a browser loads a page, it may initially display a “system font” (like Arial) while the custom font is downloading. System fonts and custom fonts rarely have identical character widths.
    • Once the custom font finishes downloading, the browser swaps it in. If the new font is wider or taller, the text block expands, pushing buttons, images, and other content down the page. This movement penalizes your CLS score.
    • If your server is slow to deliver the font file due to poor caching or lack of compression, the user sees the system font for longer, making the eventual shift more noticeable and jarring.

    Suggested read: How to Make Fewer HTTP Requests on WordPress & Speed Up Your Site

    How Font Discovery Delays Render and Impacts LCP

    Largest Contentful Paint (LCP) measures how long it takes for the main content to become visible. Font preloading only helps when that element is text, such as an H1 or hero heading. If the LCP element is an image or background asset, preloading fonts will not improve this metric.

    This happens in the following manner:

    • Browsers are lazy by design; they won’t download a font until they build the “Render Tree” and confirm the font is actually used on the page. This means the browser parses HTML, downloads CSS, parses CSS, and then requests the font.
    • Many modern browsers will hide text completely until the font file is ready. If your H1 headline is waiting on a font, the screen stays blank. Since the H1 is often the LCP element, your LCP time increases by the exact amount of time it takes the font to download.

    Suggested read: How to Easily Fix Leverage Browser Caching Warning in WordPress

    When Preloading Fonts Helps vs. When It Makes Things Worse

    Preloading is a manual override that forces the browser to download the font immediately, skipping the “discovery chain.” However, it is a double-edged sword.

    • When it Helps: Preloading is excellent for the single primary font used in your LCP element (e.g., the H1 font). It ensures the text appears instantly, stabilizing LCP.
    • When it Hurts: If you preload too many files (e.g., body text, bold versions, icon fonts), you create network congestion. The browser has limited bandwidth; if it is busy downloading 5 font files, it cannot download your hero image or critical CSS. This actually worsens your page speed.

    Suggested read: How To Use NGINX FastCGI Cache (RunCache) To Speed Up Your WordPress Performance

    How to Preload Fonts in WordPress (Step-by-Step)

    Preloading fonts is a powerful way to tell browsers to prioritize typography assets and improve Core Web Vitals. However, frontend optimizations like this work best when backed by a high-performance server environment.

    Before you begin, remember that modifying site headers requires precise caching management. RunCloud’s server-level caching keeps your site fast, but you must clear the cache after applying these changes so visitors see the improvements immediately.

    Step 1: Confirm Fonts Are The Problem in PageSpeed Insights and Lighthouse

    Before adding code, verify that fonts are actually delaying your render time. Run a test on PageSpeed Insights or Google Lighthouse and look at the “Opportunities” section. If you see a warning labeled “Preload key requests,” expanding it will usually list specific font files that are delaying rendering.

    If your fonts are not listed under “Preload key requests”, stop here. Font preloading will not improve your results; focus on server response time, image optimization, or render-blocking scripts instead.

    At that point, ensure you are utilizing RunCloud’s optimized NGINX/Apache configurations.

    RunCloud helps reduce Time to First Byte (TTFB) so that when the browser finally requests the font, the server delivers it instantly without lag.

    preload font warning

    Preloading changes the order in which files load, but it does not make the files smaller or the server faster.

    Step 2: Identify the Exact Font File Used Above the Fold in DevTools

    You should never preload every font on your site, only the ones used immediately on the screen (above the fold). To find these, open your website in Chrome, right-click, and select Inspect to open DevTools. Navigate to the Network tab, reload the page, and click the Font filter. Look for the font files that load first and are critical for your main headings or navigation.

    Hover over the file name to see the full URL. You are specifically looking for .woff2 files, as these are the modern standard for compression and performance. Copy the URL of the font file you want to preload. 

    Step 3: Add The Preload Tag 

    Once you have the URL, you need to construct the HTML tag. The syntax for this HTML tag must be correct, or the browser will ignore it. The tag should look like this:

    <link rel="preload" href="/fonts/your-font-file.woff2" as="font" type="font/woff2" crossorigin>

    In the above tag, replace /fonts/your-font-file.woff2 with the path of the font that you noted down earlier. In addition to the path, make sure you include the crossorigin attribute. Even if the font is hosted on your own domain, the browser fetches it in anonymous mode. If you omit crossorigin, the browser may treat it as a different file request. 

    Suggested read: NGINX Caching for WordPress – Complete Guide & Tutorial

    Step 4: Implement it in WordPress (theme header or wp_head hook)

    There are two ways to add this tag to your WordPress site. The first method requires editing your header.php file in a child theme and pasting the line between the <head> tags. 

    The second approach is safer and more manageable. It requires adding a code snippet to your functions.php file, using the wp_head hook, to dynamically inject the link.

    Here is the code snippet to add a tag to your site header using the functions.php file and the wp_head hook. You should add this code to your child theme’s functions.php file or use a code snippet plugin.

    function add_custom_code_to_head() {
        ?>
    <link rel="preload" href="/fonts/your-font-file.woff2" as="font" type="font/woff2" crossorigin>
        <?php
    }
    add_action( 'wp_head', 'add_custom_code_to_head' );

    If you prefer not to use a plugin, you must access the functions.php file through your hosting provider, as the WordPress dashboard for Block Themes often does not allow this.

    1. Log in to your RunCloud dashboard and open the File Manager.
    2. Navigate to the folder wp-content/themes/your-active-theme-name/.
    3. Locate the functions.php file, then click it to edit it.
    4. Paste the code at the bottom of the file and save.

    After saving the file, it will automatically be included in the HTML head of your WordPress site. You can verify it by opening the devtools and searching for the tag that you noted in the previous step.

    Warning: After adding this code, you might notice that the changes appear when you are logged in but not when you inspect the site as a visitor. This happens because the server page cache is serving old HTML. Instead of hoping a browser cache clear fixes it, go to your RunCloud dashboard and purge the RunCloud server cache. This ensures the new preloading headers are served to all users immediately.

    Step 5: If using Google Fonts, add Required Preconnect Hints

    If you are not self-hosting fonts and rely on Google Fonts, true font preloading is not possible because the file URLs change dynamically.

    In this case, preconnect is only a partial mitigation, not an equivalent replacement for preloading. It helps reduce connection setup time, but it does not remove third-party latency entirely.

    Add these lines to your header:

    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    While this helps, reliance on external servers introduces latency you cannot control. A better long-term strategy for performance is using RunCloud’s Redis full-page caching. By efficiently caching the rest of your database content on your own server, you give the browser more time to handle external third-party connections without affecting the user’s perceived load speed.

    Suggested read: How to Create Custom NGINX Configuration Easily Using RunCloud

    Step 6: Fix Common Mistakes 

    After implementing the above steps, watch out for “double downloads” in your Waterfall chart, where the font loads once as a preload and again via CSS. This is almost always a cross-origin mismatch.

    Another common issue is CORS errors, where the font refuses to load entirely. This is frequently a server configuration issue regarding Access-Control-Allow-Origin headers.

    If you see “Cache TTL” warnings, you can fix them by using the RunCache plugin for WordPress. It uses intelligent caching rules to speed up a WordPress website without requiring code changes. If purging cache to fix these errors causes load spikes, use RunCloud’s monitoring to correlate the purges with CPU pressure and adjust your settings accordingly.

    Step 7: Re-test and Verify Improvements 

    Finally, return to PageSpeed Insights and WebPageTest. Look for the specific metrics: Largest Contentful Paint (LCP) should be faster, and Cumulative Layout Shift (CLS) should decrease because the text renders immediately rather than swapping fonts later.

    If you still see inconsistent results where some visitors get fast speeds and others don’t, your edge caching or object caching might be fragmented.

    This is where RunCache shines.

    RunCache combines page, object, and edge caching into one dashboard with auto-purging logic. If you are tired of manually debugging caching layers, create a test site to experience RunCache and see how a unified caching strategy stabilizes your font loading and overall performance.

    Suggested read: How To Use Redis Full-Page Caching To Speed Up WordPress

    Troubleshooting: What if Preloading Doesn’t Improve CLS or LCP?

    If you have implemented preloading tags but your Largest Contentful Paint and Cumulative Layout Shift scores haven’t changed, the issue is likely related to the total weight of your page or server response times.

    Minimize Font Variants to Reduce File Size and Load Time

    One of the most common reasons for slow LCP is loading too many font weights and styles (e.g., loading Light, Regular, Semi-Bold, Bold, and Extra Bold in both italics and normal). Each variation is a separate file that the browser must download, and preloading five or six files will clog your network bandwidth, blocking other critical assets like your logo or hero image.

    • Audit your typography: Check your CSS to see which weights are actually being used on the site.
    • Remove unused variants: If your specific theme only uses “Regular (400)” and “Bold (700),” remove all other weights from your request.
    • Update the preload tags: Ensure you preload only the single most important variant (usually the body text or main heading weight), not the entire family.

    Implement ‘font-display’ Strategies to Prevent Layout Shifts

    If your LCP is good but your CLS is poor, it is likely because the text is “swapping” and changing size after the font loads. You can control this behavior using the font-display property in your CSS @font-face declaration.

    • Use font-display: swap: This tells the browser to display a fallback system font immediately (improving LCP) and swap to your custom font once it downloads. This prevents the “invisible text” phenomenon.
    • Use font-display: optional: For maximum speed, this setting tells the browser to use the custom font only if it is already cached or loads instantly. If it takes too long, the browser sticks with the system font for that page view, resulting in zero layout shift.

    Suggested read: Cloudflare DNS for RunCloud (Security & Performance)

    Self-Host Fonts to Eliminate Third-Party Latency

    Relying on Google Fonts or Adobe Fonts introduces external variables you cannot control, such as DNS lookups and connection latency to their servers. If their server is slow, your site is slow. Self-hosting the font files (uploading them to your own /wp-content/uploads/ folder) places the control back in your hands.

    When you self-host, you benefit directly from RunCloud’s high-performance NGINX/Apache configurations. RunCloud ensures that static assets hosted on your server are served with optimized compression standards. By removing the external “round trip” to Google’s servers, you stabilize your LCP scores and ensure consistent site performance regardless of external network conditions.

    Wrapping Up

    While preloading fonts can improve perceived load speed when fonts are the bottleneck, it is only one part of a broader performance strategy.

    If fonts are not delaying your render path, preloading will not change your Core Web Vitals scores.

    RunCloud helps you manage server-level caching, including Redis and optimized NGINX configurations, ensuring your site loads instantly even if a user has a stale browser cache.

    RunCache is a completely free, vendor-independent caching solution that works on any hosting provider. It lets you unify page, object, and edge caching without migrating your site or changing hosts.

    If font preloading alone does not stabilize your Core Web Vitals, RunCache gives you a practical next step without committing to new infrastructure.

    Create a test site to experience RunCache.

    FAQs on Preloading Fonts in WordPress

    Should I preload fonts on every page or only key templates?

    You should preload only the fonts used immediately “above the fold” across your entire site, such as your main navigation and heading fonts. 

    How many font files should I preload?

    You should limit preloading to only one or two critical font files (typically in WOFF2 format) to avoid blocking the main thread and slowing down your Largest Contentful Paint. If you preload too many files, you risk congesting the network, which negates the benefits of preloading.

    Why are fonts downloading twice after I add preload?

    This usually occurs if the crossorigin attribute is missing from your preload code, causing the browser to treat the request as two separate assets. 

    Does preconnect help with Google Fonts?

    Yes, using preconnect establishes an early network handshake with Google’s servers, significantly reducing the delay before the font file starts downloading. This works best when paired with RunCache Redis object caching, ensuring that while the external connection is being built, your database content is served without delay.

    Should I self-host Google Fonts to improve Core Web Vitals?

    Self-hosting is generally better for Core Web Vitals because it eliminates external DNS lookups and prevents layout shifts caused by slow third-party connections. 

  • How to Clear Browser Cache & Cookies (Chrome, Firefox, Edge, Safari)

    How to Clear Browser Cache & Cookies (Chrome, Firefox, Edge, Safari)

    “Browser cache” and “cookies” can be confusing terms. If you have ever built a website, updated a page, and still seen the old data, you know the frustration. 

    If you search the internet, you will hear about hard refreshes, incognito mode, and temporary files. But all of this is overwhelming, especially when you just want to run your business and ensure your customers see your latest content, not a broken layout.

    In this post, we will help you identify why changes are not showing and fix the right problem.

    In some cases, clearing browser data is enough. In others, it will never work. Before jumping into step-by-step fixes, you need to know which situation you are dealing with.

    Bonus: If you are a site owner, sticking with manual fixes isn’t efficient. At the end of this post, we will share the best solution for speeding up WordPress sites without any additional hassle, including a one-click purge feature that ensures your visitors always see the freshest version of your site.

    Let’s get started!

    What are Browser Cache & Cookies?

    If you spend any time on the internet, you’ve likely heard the advice to “clear your cache and cookies” whenever something goes wrong. But what exactly are these things, and why is your browser storing them in the first place?

    To understand them, think of your web browser (like Chrome, Safari, or Edge) as a very organized backpack that helps make your trip across the internet easier.

    This guide covers two very different situations.

    • You are a visitor, and the website looks broken or outdated
    • You own or manage a website, and changes are not showing for users

    If you are fixing a one-off display issue, clearing browser data can help.

    If this keeps happening on your site, the problem is not the browser. It is server-side caching.

    This guide explains both situations and how to identify the real cause.

    Before you clear anything, answer these questions:

    1. Does the issue affect only you, or multiple users?
    2. Does the issue disappear in Incognito or Private mode?
    3. Did you recently update content, CSS, or a plugin?

    If the problem affects only you, browser cache is likely the cause. If multiple users see old content, browser cache is not the issue, and clearing it will not fix the problem.

    What is Browser Cache?

    Cache is your browser’s short-term memory. When you visit a website, your computer has to download many assets to display it properly. For example, a modern website usually needs logos, background images, fonts, and large code files.

    If you had to re-download every single logo and image every time you clicked a new page on the same site, browsing would be painfully slow. Instead, your browser saves (caches) these files on your hard drive. The next time you visit that site, the browser says, “I already have these images!” and loads them instantly from your computer rather than downloading them again. This significantly reduces load times and saves data.

    Suggested read: How to Easily Fix Leverage Browser Caching Warning in WordPress 

    What are Browser Cookies?

    Cookies are small text files that websites save to your browser to remember you. Without cookies, the internet would have no memory. If you logged into Facebook and then refreshed the page, you’d be logged out immediately because the site wouldn’t recognize you. While cache only saves the data to speed up the site, cookies provide several useful functionalities, such as:

    • Authentication: Keeping you logged in as you move from page to page.
    • Preferences: Remembering that you prefer “Dark Mode” or English language settings.
    • Shopping Carts: Remembering what you put in your basket while you continue shopping.

    Suggested read: Server Cache vs. Browser Cache vs. Site Cache: What’s the Difference? 

    Why Clearing Cache & Cookies Is Useful

    Since cache speeds things up and cookies make things more convenient, it might seem counterintuitive to delete them. Over time, these files can become outdated or corrupted, or simply accumulate, until they interfere with your browsing experience.

    Here are some of the common problems an individual user can fix by clearing browser cache and cookies:

    1. Fix “Glitchy” Websites

    Developers are constantly updating websites. If a website owner changes a photo or a piece of code, but your browser loads an outdated local copy, the site might look broken for you even though it is correct for everyone else. Buttons might be missing, or formatting might look weird. Clearing the cache forces your browser to download the newest, correct version of the site.

    1. Protect Your Privacy

    Cookies are often used for tracking. Have you ever looked at a pair of shoes online, and then seen ads for those exact shoes on every other website you visit for a week? That is the work of third-party tracking cookies. Clearing your cookies removes these trackers, preventing advertisers from tracking your digital footprint across the web.

    1. It Resolves Login Conflicts

    If you recently changed your password but your browser is still holding an old cookie with your old credentials, you might get stuck in a “login loop” where the site refuses to let you in. Clearing cookies removes that outdated “ID badge,” forcing the site to issue you a new, working session.

    1. It Speeds Up Your Computer

    While cache is designed to speed up browsing, having gigabytes of old files stored on your hard drive can eventually slow down your browser itself. It’s like a filing cabinet that is too full; it takes longer to find what you need. 

    Suggested read: How To Use Redis Full-Page Caching To Speed Up WordPress 

    How to Clear Cache & Cookies in Major Browsers

    Clearing your browser data is one of the most effective ways to troubleshoot website errors, but the process varies slightly depending on the browser and device you use. Here are the steps for the three most popular web browsers.

    How to Clear Cache & Cookies in Google Chrome (Desktop + Mobile)

    On Desktop (Windows/Mac):

    1. Open the Menu: Click the three vertical dots in the top-right corner of the browser window and select Delete browsing data. You can also press Ctrl + Shift + Delete (Windows) or Cmd + Shift + Delete (Mac) on your keyboard.

    Suggested read: How to Reduce Cache Misses & Avoid Them: Proven Tips [FIXED] 

    1. Choose Your Settings: A pop-up window will appear.
      • Time range: Select “All time” to ensure a complete cleanup.
      • Checkboxes: Ensure “Cookies and other site data” and “Cached images and files” are selected.
    1. Finish: Click Delete from this device.

    On Mobile (Android/iOS):

    1. Open the Chrome app and tap the Menu (three dots).
    2. Tap History, then select Delete browsing data.
    3. Choose your time range (usually “All time”) and make sure “Cookies” and “Cached images” are checked.
    4. Tap Delete data.

    Suggested read: The Best WordPress Caching Plugins To Speed Up Your Site 

    How to Clear Cache & Cookies in Mozilla Firefox (Desktop + Mobile)

    On Desktop:

    1. Open Settings: Click the hamburger menu (three horizontal lines) in the top-right corner, then select Settings.
    1. Privacy & Security: On the left sidebar, click Privacy & Security. Find the section labeled Cookies and Site Data and click the Clear Browsing Data button.
    1. Select & Clear: Check both boxes (“Cookies and Site Data” and “Temporary cached files and pages”) and click Clear.

    On Mobile:

    1. Tap the Menu button (three lines or dots, depending on your device placement).
    2. Tap Settings and scroll down to Privacy.
    3. Tap Delete browsing data (on Android) or Data Management (on iOS).
    4. Toggle the switches for Cache and Cookies, then tap the delete button.

    How to Clear Cache & Cookies in Safari (Mac + iOS)

    On Mac:

    1. Top Menu: In the menu bar at the very top of your screen, click the word Safari.
    2. Clear History: Select Clear History… from the dropdown menu.
    3. Confirm: A pop-up will ask for a timeframe. Select “all history” and click Clear History.
    clear browser cache and cookies

    On iOS (iPhone/iPad):
    Note: You do not do this inside the Safari app itself.

    1. Open your device’s main Settings app (the gear icon).
    2. Scroll down and tap on Safari.
    3. Scroll down again and tap the blue text that says Clear History and Website Data.
    4. Confirm your choice. This will refresh Safari and log you out of websites.

    Suggested read: How to Flush DNS Cache on Windows, Mac, and Linux 

    Hard Refresh vs Full Cache Clear – What’s the Difference?

    When a support agent or a developer asks you to “refresh” a page, it can be confusing to know exactly what they mean. There is a big difference between a standard reload, a hard refresh, and a full cache clear.

    FeatureHard Refresh Full Cache Clear 
    What it isIt is a command that tells the browser to ignore the cache for the current page only.It is a browser setting that permanently wipes temporary files and data from all websites.
    ScopeAffects only the single URL you are currently viewing.Affects your entire browsing history and every site you have visited.
    Impact on LoginSafe: You stay logged in. It does not delete cookies.Destructive: You will be signed out of most accounts (Gmail, Facebook, etc.) if you clear your cookies.
    When to useWhen a page looks “broken,” formatting is weird, or new content isn’t showing up.When a hard refresh fails, you have privacy concerns (tracking), or multiple sites are acting up.
    How to do it (Win)Ctrl + F5Ctrl + Shift + Delete (opens settings)
    How to do it (Mac)Cmd + Shift + RCmd + Shift + Delete (opens settings)

    Why CDN Cache Often Causes Confusion

    At this point, many people assume the browser is still responsible. In reality, the browser is often the last place the problem exists.

    Content Delivery Networks sit between your server and the browser. They cache full pages and assets at edge locations around the world.

    This means:

    • Clearing the browser cache may do nothing
    • Hard refresh may still show old content
    • Only purging the CDN cache fixes the issue

    If your site uses a CDN, outdated content is rarely a browser problem. It is almost always a cache purge issue upstream.

    💡 Pro Tip for Site Owners:
    Do your visitors constantly have to perform a Hard Refresh to see your latest content? That is a sign of server-side cache configuration issues, not user error.

    RunCloud solves this by managing server-side caching (like NGINX and Redis) for you. With RunCache, you can ensure updates appear instantly for everyone, saving your users the hassle of troubleshooting your site.

    Suggested read: Everything You Need To Know About WordPress Object Caching 

    The Correct Cache Clearing Order

    When changes are not showing, clear the cache in this order:

    1. Server cache
    2. CDN or edge cache
    3. Application or plugin cache
    4. Browser cache

    Clearing the browser cache first treats the symptom, not the cause. If the issue is server-side, it will persist no matter how many times users refresh.

    Wrapping Up

    Understanding the mechanics of browser cache and cookies is important for anyone using the web. For the average internet user, these troubleshooting steps are helpful tricks to keep in their back pocket. But if you are a website owner or developer, relying on your visitors to clear their cache is a bad strategy.

    If your users regularly need hard refreshes or cache clears, something is wrong. Well-configured server caching removes that burden entirely.

    Visitors should never need to troubleshoot your site for you.

    Instead of expecting visitors to troubleshoot your site, you can eliminate the problem at the source with RunCache by RunCloud.

    RunCache eliminates the need for disjointed plugins and manual configuration by offering a unified approach to Page, Object, and Edge caching. It ensures that when you update your content, your server intelligently purges the old versions instantly.

    Create a test site with RunCache in less than 3 seconds (no credit card required).

    FAQs on Cache & Cookies

    Does clearing the cache delete passwords or saved logins?

    No, clearing your browser cache removes temporary files like images and scripts, but it does not delete saved passwords or login credentials unless you specifically select the “Passwords” checkbox. 

    Will I lose browsing history if I clear the cache?

    You will not lose your list of visited websites when you clear the cache, as browsing history is stored separately from temporary cached files. 

    How often should I clear cache & cookies?

    It is generally recommended to clear cache and cookies only when you encounter page formatting errors or login issues, rather than as part of a set routine. 

    Does clearing cookies affect site preferences or saved settings?

    Yes, clearing cookies will sign you out of most websites and reset user-specific preferences, such as language settings or shopping cart items. 

    Is there a shortcut to clear the cache?

    Most major browsers let you quickly access the Clear Data menu by pressing Ctrl + Shift + Delete (Windows) or Cmd + Shift + Delete (Mac). Just as these shortcuts save users time for local troubleshooting, RunCloud offers the RunCloud Hub to clear server-side cache instantly with a single click from the WordPress dashboard.

    What’s the difference between cache and cookies?

    Cache consists of temporary files (such as images and HTML) stored to speed up page loading, whereas cookies are small text files that store user data, such as login status and tracking preferences. 

    Does using private/incognito mode avoid caching issues?

    Yes, using Incognito or Private mode prevents the browser from saving local cache or cookies, allowing you to view a website as if you were a new visitor. This is a great way to debug issues, but for a permanent fix, RunCloud allows you to manage and purge server-level cache to ensure all users see the correct version of your site without needing private windows.

  • WordPress Changes Not Showing? Here’s How to Fix the Problem

    WordPress Changes Not Showing? Here’s How to Fix the Problem

    You publish an update, refresh the page, and nothing changes for your visitors.

    If your WordPress changes are not showing after an update, then you are in the right place. In this cache troubleshooting guide, we will move past the basic advice of “have you tried turning it off and on again?” We will dive deep into why your logged-out view differs from what you see as an admin, and how to verify whether you are hitting the page cache or the Redis object cache.

    This guide explains why those failures happen and shows you how to fix them in the correct order, without guessing.

    How to Identify Which Cache Is Causing the Problem

    Before clearing anything, use the quick checks below to identify which cache layer is actually blocking your update.

    • Changes are visible when logged in, but not logged out
      • Server-level page cache or CDN cache is serving stale HTML
      • Skip to Step 3 and Step 5
    • Content updates show, but CSS or layout does not
      • Browser, CDN, or server is caching static assets
      • Skip to “How to Handle Real-Time Updates with Stale Cached Assets”
    • Dynamic elements are wrong – cart counts, menus, widgets
      • Object cache or transients are stale
      • Skip to Step 4
    • Code changes to the theme or plugin are not reflected
      • PHP opcode cache or object cache issue
      • See “Clear PHP OPcache” and “Clear Object Cache”
    • Nothing updates anywhere
      • Multiple cache layers active
      • Follow all steps in order

    Why WordPress Changes Are Not Showing After an Update

    If your WordPress website is not showing changes after an update, caching is the most common cause.

    Caching is the process of storing commonly accessed information on the server. To make your site load faster, browsers, plugins, servers, and CDNs show visitors a “snapshot” instead of rebuilding the page from scratch every time. This works well in most scenarios, but the problem arises when you update the site, and the cache keeps showing the old snapshot.

    Most WordPress setups rely on disjointed tools, one plugin for page cache, another for object cache, and a separate dashboard for your CDN. This makes it hard to know which layer is holding onto the old data. With RunCache, server-level NGINX configuration and full-page caching are managed from a single dashboard, which reduces overlap between cache layers.

    How to Fix WordPress Changes That Are Not Showing 

    When troubleshooting a website, we should start with the easiest fix (your browser) and work our way back to the server. 

    Step 1: Hard Refresh the Page and Verify 

    Before changing any settings, force your browser to reload the page. On Windows, press Ctrl + F5, or Cmd + Shift + R on Mac. Alternatively, you can open the URL in an Incognito/Private window.

    If the Incognito window still shows the old version, the issue is not your browser and must be upstream.

    Suggested read: How To Use NGINX FastCGI Cache (RunCache) To Speed Up Your WordPress Performance

    Step 2: Purge the WordPress Cache Plugin

    If you are using a third-party caching plugin, clear its cache once before moving on. If this does not resolve the issue, do not keep purging here.

    Cache troubleshooting guide

    If you find yourself constantly modifying plugin settings, consider RunCache. It combines page, object, and edge caching into a single dashboard, which eliminates the need for complex plugins that don’t effectively communicate with your server.

    Suggested read: How To Use Redis Full-Page Caching To Speed Up WordPress

    Clear Theme and Page Builder Caches

    This step is often skipped, which is why many cache purges appear to do nothing.

    Many modern WordPress themes and page builders generate compiled CSS and layout files that sit outside standard page caching.

    Common examples include Elementor, Divi, Oxygen, and block-based themes using theme.json.

    If you are using a page builder or a performance-focused theme, you must clear its internal cache before touching the server.

    Typical actions include:

    • Elementor – Tools → Regenerate Files and Data
    • Divi – Theme Options → Builder → Advanced → Clear Cache
    • Oxygen – Settings → Library → Clear Cache
    • Block themes – re-save global styles or theme settings

    If these files are stale, server purging will have no effect because WordPress is still outputting old asset references.

    Only proceed to server-level cache clearing after completing this step.

    Step 3: Purge Server Page Cache (FastCGI / NGINX cache)

    Even if you disable the caching plugin on your WordPress website, your server (NGINX/FastCGI) might still be holding a cached version of your HTML to speed up load times.

    If you need to clear the NGINX FastCGI cache manually, delete the temporary files NGINX has created, then reload the service. Here is how to do it safely.

    1. Locate the Cache Path

    First, you need to find out where NGINX stores the cache. This is defined in your NGINX.conf or sites-available files under the directive fastcgi_cache_path.

    Run this command to find the path:

    sudo grep -r "fastcgi_cache_path" /etc/nginx/
    • Standard Install: Usually /var/cache/nginx or /var/run/nginx-cache.
    • RunCloud Server: located at /var/cache/nginx-rc/ 

    In the above example, the cache is stored in a folder located at /var/cache/nginx-rc

    Suggested read: How To Use Redis Object Cache To Speed Up Dynamic WordPress Site

    2. Delete the Cache Files

    Once you have the path, you can remove the cache files. Be extremely careful with the rm -rf command. A single mistake can delete critical system files.

    Option A: Clear Everything (Root/Sudo)

    Run the following command to clear all the cache created by NGINX:

    sudo rm -rf /var/run/nginx-cache/*

    Option B: Clear for a Specific Site (If separated by folder)

    If your configuration separates caches by folder, then you can delete only a part of the cache without changing anything else. To do this, first run the following command to see a list of all the available folders in the Nginx cache:

    sudo ls -lah /path/to/cache

    In the above example, remember to replace /path/to/cache with the path identified in the previous step.

    In the above example, we can see there are two different folders present on the server. You can delete the folder you want to clear the cache from. For example, if you want to clear the cache for runcloud-hub-fastcgi-app-auer, run the following command:

    sudo rm -rf /var/cache/nginx-rc/runcloud-hub-fastcgi-app-auer/*

    3. Reload NGINX

    After deleting the files, you must reload the NGINX configuration to ensure it stops serving any lingering pointers to deleted files.

    sudo systemctl reload nginx
    # OR
    sudo service nginx reload

    Note: If you are using RunCloud, then you don’t need to touch the command line for this. Simply log in to your RunCloud Dashboard and navigate to the RunCloud Hub settings page for your web application. On this page, click the Purge button. This clears the cached HTML immediately, even without SSH access.

    Suggested read: How to Easily Fix Leverage Browser Caching Warning in WordPress

    Step 4: Clear Object Cache 

    When parts of your site that update automatically (like a “Recent Posts” widget, shopping cart count, or user login status) remain stuck, the issue is likely within your Object Cache (typically Redis).

    This caching layer stores the results of database queries in memory to speed up PHP execution, but it can sometimes hold onto stale data even after the content has changed. If you only clear your page cache (HTML), these database-driven elements will persist because the server continues to retrieve the old query results from memory instead of the database.

    To resolve this via the command line, you will need to SSH into your server and interact with the Redis instance directly. You can run redis-cli flushall to remove all keys from the Redis database, forcing all applications using that instance to rebuild their cache from scratch.

    However, if you only want to flush the cache for a particular WordPress site, navigate to your WordPress root directory and run the wp cache flush command. This will clear the object cache for that site specifically, without risking data loss for other applications sharing the same Redis instance.

    RunCloud offers a much simpler solution that eliminates the need for SSH access or complex commands. You can manage Redis directly from the WordPress Dashboard by navigating to your RunCache settings and clicking the Clear Redis Object Cache button.

    Suggested read: How to Create Custom NGINX Configuration Easily Using RunCloud

    Object cache issues can also originate from WordPress transients stored in the database. Themes and plugins commonly use these for time-based data such as menus, pricing, or scheduled updates.

    If clearing Redis does not resolve the issue, temporarily disable the object cache and reload the page to confirm whether a transient is responsible.

    If the issue disappears, the problem is application logic, not caching.

    Clear PHP OPcache After Code Changes

    If theme or plugin code changes do not appear, PHP’s opcode cache may still be serving an older compiled version.

    This is common after:

    • Theme file edits
    • Plugin updates
    • Custom PHP changes

    On most servers, OPcache persists until PHP-FPM is reloaded.

    On RunCloud servers, PHP-FPM reloads are handled automatically through the dashboard and do not require manual intervention.

    If you are not using RunCloud, reload PHP-FPM to force OPcache to rebuild.

    This step is not required for content edits but is critical for code-level changes.

    Step 5: Purge CDN Cache 

    Since every Content Delivery Network (CDN) operates differently, the exact steps here will vary depending on whether you use Cloudflare, BunnyCDN, or Fastly.

    However, the process is generally the same: log in to your CDN provider’s dashboard, navigate to the Cache or Purge section, and look for the option to clear the cache. You should always select Purge by URL (or “Custom Purge”) and enter the specific link that is stuck, rather than clearing the entire cache.

    Warning: Avoid the “Purge Everything” or “Purge All” button if you can. This forces the origin server to rebuild the entire cache at once, which can cause CPU spikes and slow site-wide performance.

    RunCache supports smart purging. It handles edge caching logic for you, ensuring that when you update content, the specific URL is automatically cleared from the CDN. This keeps your site fast and your server happy, without you ever needing to log in to a separate CDN dashboard.

    Suggested read: Server Cache vs. Browser Cache vs. Site Cache: What’s the Difference?

    How to Confirm Which Cache Layer Is Responding

    Guessing wastes time. Confirm the cache status before making any changes.

    Open your browser’s developer tools and reload the page with the Network tab visible. Click the main HTML request and inspect the response headers. Look for indicators such as:

    • X-Cache or X-RunCache – server page cache
    • cf-cache-status – Cloudflare edge cache
    • Status 304 – browser or intermediary cache revalidation

    A cached response confirms that the issue is not WordPress itself but an upstream cache layer.

    If the response is a fresh 200 but the content is still wrong, the issue lies inside WordPress logic or asset generation.

    How to Handle Real-Time Updates with Stale Cached Assets

    Sometimes, even after clearing every cache, the old design still appears. This usually happens not because the server is broken, but because the browser thinks it already has the correct file and refuses to ask for a new one. This is common with CSS (styles) and JS (functionality) files. 

    Step 1: Fix CSS/JS Cache Busting With File Versioning

    The most reliable mechanism to force a browser to discard stale data and retrieve a fresh asset is not by manually renaming the file on the server, but by implementing versioning query strings (such as requesting style.css?ver=2.1), which instantly tells the browser that the underlying content has been modified. By appending this unique identifier to the resource URL, you can bypass local browser caches and CDN edges.

    RunCloud allows you to control exactly how the server handles these dynamic parameters through its advanced NGINX caching rules:

    • Include cache based on matching query string: This setting lets you specify parameters that trigger the creation of a unique cache file, ensuring that visitors viewing ?currency=USD see a different cached version than those viewing ?currency=EUR without slowing the page.
    • Exclude cache based on matching query string: Conversely, this option lets you define specific query strings that will force the server to bypass the page cache entirely whenever they are present, ensuring that dynamic or sensitive URLs are always served live from the backend.

    Step 2: Confirm the Browser is Requesting the New CSS/JS URL (Not a Cached URL)

    Before you assume the server is broken, you need to determine if WordPress is actually telling the browser to fetch the new file. This diagnostic step determines whether the failure occurs within the WordPress application logic or at the server/network level.

    Here is how you can do this:

    • Open a Fresh Session: Open your website in an Incognito (Chrome) or Private (Firefox/Safari) window to ensure your local browser history isn’t interfering with the test.
    • Access the Source Code: Right-click anywhere on the page background and select “View Page Source” (or press Ctrl + U on Windows / Cmd + Option + U on Mac). Do not use “Inspect Element” for this, as the DOM can sometimes differ from the raw source delivered by the server.
    • Locate the Specific File: Press Ctrl + F (or Cmd + F) to open the search bar. Type in the name of the file you modified, such as style.css, main.js, or the specific plugin stylesheet handle.
    • Analyze the Query String: Focus on the filename’s ending. You are looking for a version parameter, which typically looks like ?ver=1.2.3 or ?ver=time_stamp. Compare this number to the version you expect (e.g., if you just updated a plugin from version 2.0 to 2.1, the tag should read plugin.css?ver=2.1).

    How to interpret the results and fix the issue:

    • Scenario A: The Version Number Has Not Changed

    If the source code still shows the old version, the issue is not the server cache. The issue lies within WordPress itself. Your caching plugin might be serving a stale HTML page that contains the old link tags, or your theme might be “hardcoding” the version number instead of using the dynamic wp_enqueue_style function.

    To fix this, you need to clear the cache of your WordPress page cache plugin first. If that fails, check your functions.php file to ensure you are updating the version number on your enqueued scripts.

    • Scenario B: The URL Has Changed, But the Style is Old

    If the source code shows the new version, but the site still looks wrong, you are facing a “Hard Cache” issue on the server or CDN. The browser is requesting the new file, but an intermediate layer (such as NGINX or Cloudflare) has aggressively cached that path and is ignoring the query string. To fix this, you need to update the caching rules of your server and CDN.

    Step 3: Stop Caching HTML Too Long (Cache-Control Header)

    Incorrectly configuring the Cache-Control headers can create persistent caching issues. This HTTP header instructs the user’s browser: “Save this file locally and do not check the server for updates for X days.”

    It is recommended to set a 1-year expiration for static assets (such as images and fonts) for optimal performance.

    However, applying those same rules to your dynamic HTML pages is disastrous. If you accidentally instruct browsers to cache your homepage HTML for 30 days, no amount of server-side purging will resolve the issue. The visitor’s browser will simply stop requesting the page from your server entirely, relying on its local copy until the timer expires.

    RunCloud’s NGINX templates come preconfigured with safe, industry-standard Cache-Control policies. Our stack is tuned to aggressively cache static assets for maximum speed while ensuring dynamic HTML remains fresh and revalidates frequently. This built-in logic prevents “configuration drift” and safeguards you from accidentally locking your users onto an obsolete version of your site.

    Special Considerations for WordPress Multisite

    WordPress Multisite environments often share Redis instances, PHP workers, and cache directories across multiple sites. Flushing object cache or Redis globally may affect other sites on the network.

    If you are running Multisite, prefer site-specific cache purging through WordPress or RunCloud tools rather than command-line flushes.

    Always confirm whether Redis databases or FastCGI cache folders are isolated per site before manually clearing them.

    Wrapping Up

    Debugging a WordPress site that refuses to update is one of the most tedious parts of development, but it doesn’t have to be a mystery. As we’ve discussed, the “invisible wall” preventing your changes from showing up is usually a result of multiple caching layers (browser, server, object, and CDN) working a little too well.

    By following the workflow we outlined, you can stop guessing and start resolving issues systematically. 

    However, the best way to handle caching is to use a platform that simplifies it.

    Managing NGINX rules, Redis instances, and CDN purges separately is a recipe for frustration. RunCloud RunCache solves this by integrating server-side page caching, object caching, and edge caching into a single, intuitive dashboard. You get the raw speed of a custom-tuned server with the ease of use of a simple plugin.

    If you want consistent performance and a “Clear Cache” button that actually works,create a new test site today to experience RunCache. 

    FAQs on WordPress Changes Not Showing After Update

    Why do changes show when I’m logged in but not when I’m logged out?

    This occurs because WordPress typically bypasses caching for logged-in users, while logged-out visitors are served a static HTML copy stored in the server’s page cache. To resolve this, you need to purge the server-level cache (FastCGI/RunCache) via the RunCloud dashboard, which clears the stale HTML without affecting your browser settings.

    What cache should I clear first: browser, plugin, server, or CDN?

    Always start by clearing the server-level cache, as this is the most common source of “stuck” content for dynamic sites. RunCloud lets you safely clear server and Redis object caches from a single dashboard, ensuring fresh content is served before you need to troubleshoot downstream layers like the CDN or the local browser cache.

    Why is CSS not updating even after clearing the cache?

    If CSS remains stale, the asset URL likely hasn’t changed, so browsers and CDNs continue serving the file based on previous expiration headers. While you should implement versioning for your assets, you can also check your RunCloud NGINX configuration to ensure headers are set correctly and purge the specific file path from the server.

    Should I purge Cloudflare by URL or purge everything?

    You should purge by URL whenever possible to avoid “cache rebuild” storms that can overwhelm your PHP/MySQL resources with sudden traffic spikes. RunCache simplifies this process by unifying edge and server caching, offering auto-purging capabilities that target specific content changes so you don’t have to wipe the entire cache.

    How do I confirm a page is cached (HIT vs MISS)?

    Inspect the HTTP response headers in your browser’s developer tools (Network tab) and look for headers such as X-Cache, X-RunCache, or cf-cache-status that indicate a HIT. 

    Can Cache-Control cause WordPress pages to stay stuck on an old version?

    Yes, if Cache-Control headers set a long Time-To-Live (TTL) without validation, browsers will refuse to request new versions until the timer expires. RunCloud lets you standardize these rules at the NGINX layer, preventing config drift and ensuring users across all devices receive the latest updates.

  • Headless WordPress: The Easiest & Best Way To Set Up A Decoupled Site

    Headless WordPress: The Easiest & Best Way To Set Up A Decoupled Site

    There is a pervasive myth in the web development community: “WordPress is for novices. Real developers build custom apps.”

    If you’re a developer who loves the clean workflow of Git, the component architecture of React, or the speed of static sites, you might look at WordPress with disdain. You might picture bloated plugins, spaghetti PHP code, and ongoing security concerns.

    But if you ignore WordPress, you are ignoring a tool that powers over 60% of all websites using a CMS.

    That market dominance isn’t an accident, and it isn’t just because it’s “easy” for beginners. It’s because WordPress solved the hardest problem in web development: Content Management.

    As technical experts, we need to stop looking at WordPress as a “website builder” and start seeing it for what it truly is: a highly accessible, open-source, API-driven Content Database.

    Whether you are using a sophisticated Roots.io stack with Git integration or going fully Headless, WordPress gives you complete freedom to manipulate the frontend while empowering your non-technical team.

    However, the allure of “simplifying” the stack often leads developers to swing the pendulum too far in the opposite direction. In an effort to escape database management and PHP, many technical teams migrate to pure Static Site Generators (SSGs), relying solely on Markdown files.

    While this initially feels like a developer’s utopia, offering total control and zero maintenance, it often turns into an operational nightmare for the rest of the organization.

    Who This Architecture Is For

    This approach is not aimed at hobby sites or solo blogs. It is designed for teams where developers and content editors have different needs.

    If you are working with:

    • A marketing or content team that needs editorial autonomy
    • Developers who prefer modern JavaScript frameworks
    • A product or SaaS site where performance and security matter

    Headless WordPress becomes a practical architectural choice rather than an experiment.

    Why You Shouldn’t Use Static Site Generators

    Many teams migrate to Static Site Generators (SSGs) for faster page load times and simpler hosting requirements, as Markdown files power them. On the surface, the idea sounds utopian as it is “Just a bunch of HTML files! No database! Easy deployment!“

    Using a static file-based solution would mean you now need a PR for every update to a blog post. Let’s look at the reality of that workflow in a mid-sized company:

    • A marketing manager spots a typo in a blog post.
    • They can’t fix it. They have to ask a developer. The developer must create a branch, fix the typo, commit, push, open a Pull Request (PR), wait for the CI/CD, and then merge.
    • Your highly paid engineers are spending time fixing typos instead of shipping product.

    We cannot expect marketing teams to learn Git or write perfectly formatted Markdown. We need to empower them with a CMS while retaining our own developer freedom.

    Classic vs. Headless WordPress

    For advanced development teams, the biggest friction point with WordPress isn’t the dashboard; it’s the templating engine.

    You might already have a sophisticated corporate identity, a component library built in React, or a legacy styling setup that your team loves. Trying to shoehorn that existing frontend architecture into the standard WordPress PHP template hierarchy (single.php, header.php, the Loop) can feel like forcing a square peg into a round hole.

    You often end up fighting the CMS rather than leveraging it, translating modern frontend patterns into WordPress-specific PHP themes. This adds complexity, slows iteration, and ties your frontend decisions to the WordPress render cycle.

    This is where the distinction between Classic and Headless WordPress changes the game.

    The Classic WordPress

    In the Classic WordPress model, the backend (admin interface/database) and the frontend (what the user sees) are tightly coupled. They live on the same server and share the same codebase. When a user visits your site, WordPress dynamically generates the HTML based on your active theme.

    For many projects, this is fine (even preferred). But for a technical team that wants to iterate on the frontend independently of the content engine, this monolithic structure can be a bottleneck.

    Developers often try to add their modern components within a custom PHP theme or build complex custom plugins to manage data, aiming to make the WordPress editor feel more like a modern frontend experience.

    While this can offer temporary relief, it often leads to a more complex, heavier application. You are still ultimately constrained by the limitations of the WordPress render cycle and the PHP environment, and you’re forced to maintain a custom codebase that may be difficult for new developers to onboard to. 

    The Headless Revolution

    Headless WordPress decouples this relationship entirely. Think of it as performing surgery: you keep the “Body” (the robust content management, user roles, and database) because WordPress does that better than almost anyone else. However, you sever the “Head” (the frontend display layer).

    In this architecture, WordPress becomes a data source. It sits quietly in the background, waiting for instructions. You then use the WordPress REST API or WPGraphQL to fetch that content and inject it into a completely separate frontend application.

    This shift from “Website Builder” to “Content API” unlocks three massive advantages for technical teams:

    • You are no longer bound by PHP. You can build your frontend in React, Vue, Svelte, Angular, Next.js, Gatsby, or even plain HTML/JS. If your team is already proficient in React, they can build the site using the tools they know and love, simply treating WordPress as a JSON endpoint. You stop hacking themes and start building applications.
    • In a classic setup, your content is trapped in the website’s HTML. In a headless setup, your content is portable data. You can publish a case study once in WordPress and have it instantly available via API to your marketing website, your native iOS/Android app, an internal intranet dashboard, and even a smartwatch interface simultaneously.
    • Because your frontend is physically separated from your backend (often hosted on entirely different servers or CDNs), your database is not directly exposed to user traffic. Even if your frontend site experiences a large traffic spike or an attack, your WordPress installation is far less exposed, since it is not directly serving public traffic and can be further protected behind the API layer.

    If you want to combine the SEO benefits of static sites with the dynamic power of a CMS, pairing WordPress with a framework like Gatsby is a good choice.

    Gatsby pulls your data from WordPress via GraphQL, generates static HTML at build time, and deploys it to the edge. This results in extremely fast page loads that are difficult for traditional PHP-rendered sites to match at scale. If you want to learn more about this architecture, then we recommend reading why Gatsby chose headless WordPress for its blog.

    How To Set Up Headless WordPress with Gatsby

    For this guide, we will use RunCloud to manage our infrastructure. RunCloud offers an excellent balance of server control and ease of use. While a production workflow usually involves local development pushed to a Git repository with CI/CD pipelines (Atomic Deployment), we will perform this setup directly on the server to demonstrate the architecture clearly.

    Here is how you connect the dots between your WordPress backend and your Gatsby frontend.

    Step 1: Set Up the WordPress Backend (The “Body”)

    First, we need the source of truth for your content.

    1. Create the App: Log in to your RunCloud dashboard and create a new Web Application. This will host your WordPress installation.
    2. Install WordPress: Use the RunCloud “One-Click Install” feature (or your preferred installation method) to get WordPress running.

    Important Note: For this WordPress Backend step, do not use your final, public-facing domain (e.g., www.example.com). Use a subdomain dedicated to the backend, such as backend.example.com or internal.example.com. Your final domain will be assigned to the Gatsby Frontend application in Step 2.

    1. Configure Permalinks: This is a crucial step! Go to Settings > Permalinks in your WordPress dashboard. Set it to “Post name” or a custom structure. The default “Plain” setting (?p=123) can sometimes cause issues with GraphQL routing.
    2. Install Essential Plugins: Go to Plugins > Add New and install the following two plugins:
      • WPGraphQL: This exposes your WordPress data via a GraphQL API.
      • WPGatsby: This optimizes communication between WordPress and Gatsby, handling tasks such as cache invalidation and delta updates.

    Your marketing team will log in here to publish content. To them, it appears to be a standard WordPress site.

    Step 2: Prepare the Frontend Environment

    Now, we need a place for the Gatsby application to live.

    1. Create a New Web App: Back in RunCloud, create a second Web Application.
    2. Select Stack: Choose an Empty Web App stack (since Gatsby is a React-based framework running on Node).
    3. Domain: Assign your public-facing domain to this application (e.g., www.example.com).
    create a site on runcloud

    In a production environment, you would develop locally, push to Git, and use RunCloud’s Git deployment feature. For this tutorial, we will initialize the app directly on the server to give you an immediate overview of the file structure.

    Step 3: Install Gatsby via SSH

    Connect to your server via SSH using the system user attached to your Frontend Web Application. Before moving ahead, ensure the Gatsby CLI is installed globally on the server by running the following command:

    npm install -g gatsby-cli

    Navigate to the root directory of your new application (/home/username/webapps/appname). In this folder, you will need to delete the default index.html file by running the following command.

    rm index.html

    Once the directory is empty, run the following command to generate the site skeleton using a WordPress-specific starter:

    gatsby new . https://github.com/gatsbyjs/gatsby-starter-wordpress-blog 

    This command pulls down a pre-configured Gatsby site optimized for fetching data from WordPress.

    You have now initialized the core files for your Gatsby frontend in this folder. You can update the React components, styling, and general structure as you like.

    Step 4: Connect Frontend to Backend

    You need to tell Gatsby where your WordPress API lives. Open the configuration file using your preferred editor (nano or vim):

    nano gatsby-config.js

    Locate the configuration options for gatsby-source-wordpress and update the url setting to point to your backend’s GraphQL endpoint. After editing, it will look like this:

    Configure headless wordpress

    Save and exit the file by pressing Ctrl + O, Enter, and Ctrl + X. 

    For a deep dive into advanced configuration, schema customization, and troubleshooting, we highly recommend reading the official documentation: Gatsby Source WordPress Documentation

    Step 5: Build and Deploy

    Now, we will need to generate the static files that will be displayed on the internet.

    Handle SSL (Optional): If your backend is on a staging server using a self-signed certificate, Gatsby might refuse to connect. You can bypass this temporarily by running:

    export NODE_TLS_REJECT_UNAUTHORIZED=0

    Build the Site: Run the build commands to fetch the data from WordPress and generate the HTML/CSS/JS files in your Gatsby environment:

    gatsby clean
    gatsby build

    Update Public Path: By default, RunCloud points the web server to the root of your application. However, Gatsby compiles your static site into a folder named “public”. Therefore, we will update the public path of the Gatsby web application in the RunCloud dashboard. Please note that we don’t need to modify this setting for the WordPress backend.

    1. Go to your RunCloud Dashboard > Web Application > Settings.
    2. Change the Public Path to /public.
    3. Save settings by clicking the Update Stack button.

    After updating the public path, your website will be immediately accessible on the internet. 

    Suggested Read: What is WordPress Object Caching

    Next Steps and Considerations

    With your Headless WordPress architecture now fully deployed, here are a few things to consider for ongoing maintenance and optimization:

    Continuous Deployment for Content Changes

    Currently, every time your marketing team publishes a new post or makes an edit in the WordPress dashboard (Step 1), you still need to manually run gatsby build on your server (Step 5) to see the changes on the live site. To automate this process, you need to implement Webhooks and CI/CD.

    • Configure Webhooks: The WPGatsby plugin you installed in Step 1 can be configured to automatically send a signal (a webhook) to an external service every time content is saved or published.
    • Trigger a Build: Set up your deployment pipeline (e.g., using RunCloud’s Git deployment feature or a dedicated service like Netlify/Vercel) to listen for this webhook. When the signal is received, the pipeline automatically triggers a new Gatsby build, fetching only the updated content (delta changes) and deploying the new static files.
    • Benefit: This creates a zero-touch content workflow, where the content team publishes content, and the live site updates automatically in minutes, without requiring developer intervention.

    Scaling and Optimization

    Since your frontend is static, hosting it on a global Content Delivery Network (CDN) will drastically reduce load times for international users. Services like Cloudflare or AWS CloudFront can be easily configured to sit in front of your Gatsby application.

    Maintaining Security

    The separation of your backend and frontend inherently improves security, but proactive measures are still essential for the WordPress installation:

    • Regular Updates: Ensure your WordPress core, themes (even those unused for templating), and all plugins (especially WPGraphQL and WPGatsby) are kept up to date. We strongly recommend using Patchstack for this step, as it secures your website from vulnerabilities by using RapidMitigate technology, which protects your website even if the plugin developers haven’t released an update.
    • Firewall Rules: Use the firewall features to restrict access to the WordPress dashboard (e.g., only allow specific IP addresses or VPN ranges) since it’s an internal-only application.

    This decentralized approach gives you the ultimate control to tune and scale each component independently, ensuring both performance and editorial freedom.

    WordPress is a Power-Up, Not a Compromise

    For too long, developers have viewed WordPress as a “necessary evil”, something you tolerate because the client demanded it. It’s time to retire that mindset.

    When you pair WordPress with a modern architecture, such as a Headless setup, it stops being a compromise and becomes a massive workflow accelerator. It solves the content problem instantly, allowing your team to focus on what actually moves the needle: building high-performance user interfaces, optimizing conversion funnels, and shipping code.

    You get the stability of a CMS that powers over 60% of the web, combined with the bleeding-edge speed of a React frontend. 

    You Don’t Need to Be a Linux Expert

    Perhaps the biggest hesitation remaining is the infrastructure. “If I go Headless, don’t I need to manage multiple servers? Do I need to be a Linux sysadmin to keep this secure?”

    This is where RunCloud bridges the gap.

    Powerful architecture shouldn’t require you to spend your time managing low-level server configuration. RunCloud does all the heavy lifting for you. We automate the provisioning, security patching, and server management so you can deploy a WordPress backend and a Node.js frontend in minutes, not days.

    But unlike “Managed Hosting” that locks you in a black box, RunCloud respects your expertise.

    • We handle the tedious tasks: SSL installation, backups, and service monitoring occur automatically.
    • You retain control: You maintain full root access to your server. Want to tweak a custom NGINX config? Go ahead. Need to install a specific server-side library? You have the keys.

    You get the convenience of a managed dashboard with the raw power of a VPS.

    Ready to Build Your Headless Stack?

    Don’t let infrastructure headaches stop you from building the best version of your website. Join developers and agencies using RunCloud to deploy faster, secure their infrastructure, and scale with confidence.

    Sign up for RunCloud today and start building your next project with the freedom you deserve.

    Frequently Asked Questions

    Is Headless WordPress too complex for a small development team?

    While the initial setup requires more architecture than a standard install, it often simplifies long-term maintenance by separating the frontend code from the content database. This separation enables your developers to work with modern frameworks, such as React, without compromising the content editing experience for the marketing team.

    Does using a Headless architecture hurt my SEO rankings?

    On the contrary, a Headless setup often improves SEO by using Static Site Generation (SSG) via tools like Gatsby or Next.js. These frameworks generate pre-rendered HTML that loads instantly and achieves high Core Web Vitals scores, which are a major ranking factor for Google.

    Do I need to be a Linux system administrator to use RunCloud?

    No, RunCloud is designed to eliminate the need for command-line expertise by providing a visual dashboard for server management. We handle the heavy lifting (such as configuring NGINX, firewalls, and SSL certificates) so you can focus on your application, while still providing root access if you ever need it.

    Why use RunCloud instead of traditional “Managed WordPress” hosting?

    Traditional managed hosting often locks you into a “black box” environment where you cannot change server configurations or install custom software. RunCloud offers the best of both worlds: the automated convenience of managed hosting, combined with the flexibility and cost-effectiveness of owning your own VPS infrastructure.

    Will my existing WordPress plugins be compatible with a Headless setup?

    Backend plugins that manage structured data, such as Advanced Custom Fields (ACF), work well by exposing their data via the API. SEO plugins, such as Yoast, can still be used as data sources but require explicit integration in the frontend to render metadata correctly. However, frontend-specific plugins, such as visual page builders or sliders, will not work, as you are replacing the WordPress theme layer with your own custom frontend code.

    Is WordPress secure enough to be used as an enterprise backend?

    WordPress is highly secure when maintained correctly, and a Headless architecture makes it even more secure by decoupling the database from the user-facing site. Since the frontend consists of static files or a separate Node.js app, your actual WordPress database remains hidden from direct public traffic and potential attacks.

    Why not just use a pure file-based CMS instead of WordPress?

    File-based systems (using Markdown) often struggle to scale when multiple non-technical users need to edit content simultaneously. WordPress provides a robust, multi-user database with granular permissions and a user-friendly interface that file-based systems simply cannot match for team collaboration.

    Does running two separate applications (Frontend and Backend) double my hosting costs?

    Not necessarily, because the WordPress backend in a Headless setup requires fewer resources since it isn’t serving public traffic. Furthermore, using RunCloud allows you to host multiple web applications (both your WordPress backend and Node.js frontend) on a single server, keeping your infrastructure costs efficient.

    What happens if my server goes down? Does RunCloud fix it?

    RunCloud provides tools to monitor your server’s health and automatically restart services (such as NGINX or PHP) if they crash. While we manage the software layer and configuration to prevent downtime, you retain full control and ownership of your relationship with your cloud infrastructure provider (like AWS, UpCloud, or DigitalOcean).

  • Fix “This Site Can’t Be Reached” Error (5+ Reliable Solutions That Actually Work)

    Fix “This Site Can’t Be Reached” Error (5+ Reliable Solutions That Actually Work)

    Are you seeing the “This site can’t be reached” error on your site?

    This error is frustrating and can have multiple underlying causes, which makes troubleshooting harder. In this guide, we break those causes down and show you how to fix them.

    By the end of this guide, you’ll know how to flush DNS cache, troubleshoot local issues, and diagnose common server-side problems.

    Let’s get started!

    What Does “This Site Can’t Be Reached” Error Mean?

    When you see the “This site can’t be reached” error, your browser is telling you that the website you tried to load has failed. In simple terms, the browser cannot establish a connection with the server.

    This happens when the connection between your computer (the client) and the website’s server is severed or was never established in the first place. 

    For everyday users, this is a momentary annoyance. However, if you are a website owner or developer, then you cannot ignore this error. If you see this on your site, it means that either your web server (Apache/NGINX) or your DNS records are misconfigured.

    This is where a server management platform helps. While manual configuration is possible, tools like RunCloud automatically monitor key services and connections. RunCloud ensures that services like NGINX or PHP are actually running, so your visitors never see a dead screen.

    Suggested read: How to Flush DNS Cache on Windows, Mac, and Linux

    Why You’re Seeing the “This Site Can’t Be Reached” Error

    The internet is a complex network of connections, which is why this error can originate from your local computer, your internet service provider, or the website’s server. To fix it, you first need to understand which part of the chain is broken.

    Here are the most common reasons this error occurs:

    1. Domain Name System (DNS) Failures

    This is the most common cause of failure, and it triggers the DNS_PROBE_FINISHED_NXDOMAIN error code. This can happen if the domain has expired, or if you recently migrated your site and the DNS propagation hasn’t finished yet. It can also occur if the A Record or CNAME in your DNS settings points to the wrong IP address.

    Pro Tip: Manual DNS changes are prone to typos. RunCloud’s DNS integrations help ensure records are mapped correctly, reducing the risk of NXDOMAIN errors.

    2. Connection Timeouts and Refusals

    Sometimes the website address is found, but the web server is unavailable. You will likely see ERR_CONNECTION_TIMED_OUT or ERR_CONNECTION_REFUSED. This can happen due to several reasons:

    • Server Downtime: The physical server hosting the website may be offline or undergoing a reboot.
    • Server Misconfiguration: If the web server (like NGINX or Apache) crashes due to a syntax error, it cannot accept new visitors.
    • Firewall Blocking: Your Firewall software might be identifying the site as a threat and blocking access. If you are using RunCloud, you can easily edit your Firewall rules from your RunCloud dashboard. If you want to learn more, read our guide on using ModSecurity as a web application firewall.
    • Overload: If a server lacks resources (RAM/CPU), it may stop responding. 

    3. Local Cache Issues

    Your computer saves time by storing old data. This is referred to as a DNS cache or Browser cache. If a website moves to a new server but your computer remembers the old IP address, the connection will fail.

    You can easily fix this by flushing your DNS cache. Read our dedicated blog post titled “How to Fix DNS Server Not Responding (Windows & Mac)” to learn more about it.

    4. SSL and Security Protocol Errors

    If you encounter the ERR_SSL_PROTOCOL_ERROR or ERR_CONNECTION_RESET, you can be certain that the issue is related to security. If the website’s security certificate is out of date, modern browsers will terminate the connection to protect your data.

    If you are a site owner, then you would know that dealing with SSL expiry is a major headache. RunCloud users avoid this entirely because the platform handles automatic SSL renewal (via Let’s Encrypt), ensuring your HTTPS configuration never breaks.

    5. Network Restrictions (VPN/Proxy)

    When you use a proxy or VPN, your internet traffic is routed through a middleman. If that middleman disconnects or malfunctions, you will lose access to the web. 

    Suggested read: How to Fix DNS_PROBE_FINISHED_NXDOMAIN Error

    How to Fix The “This Site Can’t Be Reached” Error 

    Now that we have discussed the common culprits, let’s explore the solutions to get your connection back on track. We’ll start with the quickest fixes and then move on to more technical server-side diagnostics.

    Step 1: Identify the Exact Error Code

    Before you can fix the problem, you need to know exactly what conversation your browser failed to have. The “This site can’t be reached” message is a generic wrapper, but looking at the small gray text code below it reveals the specific root cause.

    fix This Site Can’t Be Reached error

    Suggested read: How to Fix the HTTP Error 503 Service Unavailable in 2025 [SOLVED]

    Step 2: Check Domain Status and DNS Configuration

    If you are seeing the DNS_PROBE_FINISHED_NXDOMAIN error, the issue is almost certainly in the DNS records. This occurs when the DNS resolution chain is interrupted.

    If you are the site owner, then you must verify your A Record (which points your domain to an IP address) and your CNAME records. You can use command-line tools like nslookup or dig to see where your domain is pointing. Read our blog post to learn how to search DNS records.

    If you recently moved your website to a new host, you may be waiting for DNS propagation to complete. This is the time it takes for servers worldwide to update their records based on your Time To Live (TTL) settings. Read our guide on How To Speed Up DNS Propagation to learn more about this.

    Pro Tip: RunCloud’s Cloudflare DNS integration reduces manual errors and helps prevent misconfigured records.

    Step 3: Flush DNS Cache and Browser Resolver Data

    Sometimes the internet is working fine, but your computer is “remembering” broken information. Your operating system stores a DNS cache to load websites faster. If a website moves to a new server IP but your computer tries to connect to the old one, the site will be unreachable.

    To fix this, you need to force your computer to look up the address from scratch. Read our guide on How to Flush DNS Cache on Windows, Mac, and Linux to learn how to fix this. 

    Step 4: Change DNS Resolvers to Rule Out ISP Issues

    If flushing DNS didn’t work, your Internet Service Provider (ISP) might be the problem. ISPs often have slow or outdated DNS servers. If their directory is down, you won’t be able to reach websites even if your internet connection is technically active.

    You can bypass your ISP by changing your network adapter settings to use public, high-speed DNS servers:

    • Google DNS: Set your Primary DNS to 8.8.8.8 and your secondary DNS to 8.8.4.4.
    • Cloudflare DNS: Set your Primary DNS to 1.1.1.1.

    If the site loads after switching to Google DNS, the fault lies with your ISP’s configuration.

    Suggested read: How to Check Linux CPU Usage or Utilization (5 Ways)

    Step 5: Check Server Availability & Web Server Health

    When the “This site can’t be reached” error isn’t caused by your internet connection or a DNS glitch, the problem usually lies within the server itself. Traditionally, diagnosing a crashed web server requires logging in via SSH and running complex command-line queries.

    RunCloud completely changes this dynamic by offering a visual interface to diagnose, fix, and even automatically prevent these crashes. RunCloud includes a powerful Auto-Healing feature that minimizes downtime without requiring manual intervention. If a service crashes or becomes unresponsive, RunCloud detects the failure immediately and automatically attempts to restart it to restore connectivity.

    If you are not using a managed platform like RunCloud, fixing an ERR_CONNECTION_REFUSED requires connecting to your server via SSH (Secure Shell) and manually running command-line utilities to check the server status. For example, to restart the NGINX or Apache services, you would need to execute commands like:

    sudo systemctl restart nginx
    sudo systemctl restart apache2

    This manual process requires technical knowledge of Linux command-line tools and can be time-consuming, especially during unexpected downtime.

    Step 6: Check Web & Server Logs

    Identifying the cause of a site crash helps prevent repeat outages. Usually, this requires digging through confusing text files on the server’s log directory (/var/log/). However, if you are using RunCloud, then you can access the NGINX and Apache logs directly from the web interface.

    Step 7: Check SSL, HTTPS Configuration, and Firewall Rules

    Finally, aggressive security settings can block connections, leading to ERR_CONNECTION_RESET or ERR_SSL_PROTOCOL_ERROR.

    If you are running local security software (such as a third-party antivirus suite, a software firewall, or a VPN client), try temporarily disabling it. These tools can sometimes aggressively intercept or block legitimate web traffic, resulting in a “Connection Refused” or “Site Can’t Be Reached” error, even when the server is healthy. If the site loads after disabling the software, you’ll need to adjust that program’s settings to allow traffic to the website.

    Final Thoughts

    Throughout this guide, we’ve explained different ways to decode and fix errors on your site. Whether the culprit was a simple internet hiccup, an aggressive firewall, or a complex DNS propagation delay, you now know how to trace the connection and find exactly what needs fixing.

    However, if you are a website owner or developer, you know that fixing the error is only half the battle. Preventing it is where the real value lies. Why waste hours debugging command-line errors when you could automate the health of your infrastructure?

    This is why many developers choose RunCloud.

    RunCloud eliminates the guesswork by providing a visual dashboard for all your server needs. RunCloud covers the essentials:

    • Automatic SSL: Never see an expired certificate error again.
    • One-Click Service Restarts: Fix crashed web servers instantly without touching a terminal.
    • Painless DNS & Domain Management: Map domains correctly every time, reducing NXDOMAIN errors.

    Sign up for RunCloud and discover how painless server management can be.

    FAQ on This Site Can’t Be Reached Error

    Why does Chrome say “This site can’t be reached” only on my computer?

    This is usually caused by a corrupted local DNS cache or a firewall blocking the connection. If the website is running, simply flushing your computer’s DNS cache should resolve the glitch.

    How do I resolve a website that is unreachable after DNS changes?

    This error often means your local network is still using the old IP address, so try flushing your DNS or accessing the site via a different network.

    Why is every website showing “This site can’t be reached”?

    You should restart your router and try changing your network adapter settings to use a public DNS, such as Google’s 8.8.8.8. However, if your internet works but all your hosted sites are down, check your cloud provider’s site to confirm if they are experiencing an outage.

    How long does DNS propagation take?

    While global propagation can technically take up to 48 hours, modern setups usually resolve within minutes. You can significantly speed up this process by lowering your TTL settings or utilizing RunCloud’s Cloudflare integration to ensure that your SSL and DNS changes deploy instantly. 

  • How to Make Fewer HTTP Requests on WordPress & Speed Up Your Site

    How to Make Fewer HTTP Requests on WordPress & Speed Up Your Site

    A slow WordPress site isn’t just frustrating – it drives visitors away and hurts your SEO.

    In most cases, the cause is simple: too many HTTP requests.

    Every script, image, and font file your browser fetches adds another delay, which hurts your WordPress website performance and Core Web Vitals

    This guide shows you how to cut those requests at the source – and make your site load noticeably faster. You’ll learn how to configure your WordPress site to:

    • Dequeue unnecessary assets properly
    • Combine images using CSS sprites
    • Disable WordPress emojis.

    Let’s get started!

    What are HTTP Requests on a WordPress Website?

    Let’s try to understand this with the help of an example. You can think of your web browser as a personal shopper with a list of things it needs to build the webpage you want to see.

    An HTTP request is a single trip your shopper (the browser) makes to a server to pick up one item on that list. For a WordPress site, this list is long and includes trips to different “stores” (servers):

    • Your Server: It needs to get the logo, background images, the main text content, and theme files (CSS for styling, JavaScript for interactivity).
    • Google’s Servers: It might need to fetch custom fonts (Google Fonts).
    • Facebook’s Servers: It might need to grab a tracking pixel or a “Like” button script.
    • Other Servers: It may need to get a video from YouTube or an icon from a font library.

    Each one of these “trips” is an individual HTTP request. A modern website can easily make 50-100 of these requests just to load a single page, and a slow or disorganized shopping trip makes for a frustratingly slow website.

    Benefits of Making Fewer HTTP Requests in WordPress

    Reducing the number of “shopping trips” your browser has to make provides immediate and significant benefits.

    1. Firstly, it dramatically improves page load speed and creates a much better experience for your visitors.
    2. Secondly, this speed boost directly impacts your SEO and Core Web Vitals, as search engines like Google reward fast, responsive websites with better rankings.
    3. Finally, fewer requests mean less work for your server. This allows it to handle more traffic without slowing down, which is important for growing your business.

    Suggested read: How To Use NGINX FastCGI Cache (RunCache) To Speed Up Your WordPress Performance

    Measuring HTTP Requests with Waterfall Analysis

    The best way to see all these HTTP requests is with a waterfall analysis, which you can find in tools like GTmetrix or your browser’s developer tools (F12 > Network). A waterfall chart gives you a visual breakdown of every single file your browser requests to build the page. It looks like a cascading series of bars, showing:

    • What was requested: Every image, script, and stylesheet.
    • Where it came from: Your server, a CDN, or an external site.
    • How long it took: Long bars are performance bottlenecks.
    http requests in browser

    By analyzing this chart, you can pinpoint exactly what is slowing your site down: too many files, large images, or slow external services.

    Suggested read: How To Use Redis Full-Page Caching To Speed Up WordPress

    How Reducing HTTP Requests Works on a WordPress Site

    As we already discussed, every element on a WordPress site, each image, stylesheet (CSS file), script (JavaScript file), and font, requires the browser to make a separate request to a server to download it. And if a web browser has to perform more tasks, it would take longer.

    If we reduce the number of requests, we can speed up the entire loading process:

    Remove or Replace Heavy Plugins and Themes That Load Excessive Assets

    The single biggest source of unnecessary HTTP requests in WordPress comes from poorly coded or feature-heavy plugins and themes. A complex theme or a “do-it-all” plugin might load dozens of its own CSS and JavaScript files on every single page, even if the feature isn’t being used.

    Auditing and replacing these heavy assets with lightweight, modular alternatives is a high-impact first step toward a leaner, faster website.

    1. Use a tool like GTmetrix or open the “Network” tab in your browser’s DevTools to run a waterfall analysis. Look for clusters of .css and .js files being loaded from specific plugin or theme directories (/wp-content/plugins/plugin-name/).
    2. For each heavy plugin, ask: “Is this functionality critical?” and “Can it be achieved more simply?” For example, a heavy social sharing plugin might be replaceable with simple HTML links or a lighter plugin.
    3. Research plugins and themes that are specifically marketed as “lightweight,” “performant,” or “modular.” Look for options that allow you to disable features (and their associated assets) that you are not using.
    4. Deactivate the heavy plugin on a staging site, install the lighter alternative, and run the waterfall analysis again to measure the reduction in requests.

    Suggested read: The Complete WordPress Speed Optimization Guide

    Load Assets Conditionally and Dequeue Unused CSS/JS Per Page

    Many plugins load their assets globally. For example, the scripts for your contact form are also loading on your homepage and blog posts, where there is no form. Conditional loading is the practice of preventing assets from loading on pages where they are not needed.

    This approach ensures that each page only loads the absolute minimum number of files required for it to function correctly. If you prefer a code-based approach, you can use WordPress functions wp_dequeue_style() and wp_dequeue_script() in your theme’s functions.php file. Wrap them in conditional tags to target specific pages.

    Example: To disable a contact form script everywhere except the “Contact” page:

    add_action( 'wp_enqueue_scripts', 'my_dequeue_scripts', 100 );
    function my_dequeue_scripts() {
        if ( ! is_page( 'contact' ) ) {
            wp_dequeue_script( 'contact-form-7' ); // Use the script's handle
            wp_dequeue_style( 'contact-form-7' );  // Use the style's handle
        }
    }

    Suggested read: How to Reduce Cache Misses & Avoid Them: Proven Tips [FIXED]

    Minify and Combine CSS/JS

    Minification removes unnecessary characters (like whitespace and comments) from code to reduce file size. And after minification, you can bundle multiple CSS or JavaScript files into a single file to reduce the number of HTTP requests.

    However, this strategy is most effective for older HTTP/1.1 servers. Modern servers using HTTP/2 and HTTP/3 can handle many small requests in parallel very efficiently, so combining files can sometimes be counterproductive.

    1. For HTTP/1.1: Use a caching plugin like WP Rocket or W3 Total Cache to enable minification and file combination for both CSS and JS.
    2. For HTTP/2 and HTTP/3: You can enable minification, but be cautious with the combination setting. It’s often faster to load multiple small, minified files that are deferred or loaded asynchronously than one large, combined file that could block rendering. You should test your load times with the combination enabled and disabled to see what works best for your specific site.

    Optimize Fonts (Self-Host, Subset, Preload, Use font-display: swap)

    Web fonts, especially those loaded from external services, can introduce multiple HTTP requests and DNS lookups that slow down rendering. By taking full control of your fonts, you can eliminate these external requests and ensure they are delivered as efficiently as possible from your own optimized server.

    1. Host Fonts Locally: Use a plugin like OMGF (Optimize My Google Fonts) to automatically find the Google Fonts your site uses, download them, and serve them directly from your own server. This eliminates the external request to fonts.googleapis.com.
    2. Subset Your Fonts: Subsetting removes all the characters and weights you don’t use from a font file, and this drastically reduces its size. Many local font generation tools offer this as an option.
    3. Use font-display: swap;: Add this CSS property to your @font-face declaration. It tells the browser to display a fallback system font immediately while the custom font is loading. This prevents a blank text flash (Flash of Invisible Text).
    4. Preload Critical Fonts: Identify the one or two font files needed to render the “above-the-fold” content. Preload them by adding a <link> tag to your site’s <head> to tell the browser to download them with high priority.
      • Example: <link rel="preload" href="/wp-content/fonts/my-font.woff2" as="font" type="font/woff2" crossorigin>

    Suggested read: Server Cache vs. Browser Cache vs. Site Cache: What’s the Difference?

    Reduce External Requests (Fonts, Analytics, Chat Widgets, Ads) or Host Locally

    Every third-party service you add, analytics, heatmaps, live chat widgets, ad networks, and social media feeds, adds external HTTP requests. These requests can significantly slow down your site because your server has no control over the speed and reliability of the third-party server. Minimizing or locally hosting these scripts where possible is key to reclaiming performance.

    1. Use your waterfall chart to identify all requests going to domains that are not your own.
    2. For each external service, decide if its value outweighs its performance cost. Can you remove it?
    1. For services like Google Analytics, plugins like Perfmatters allow you to host the analytics.js script locally on your server. This gives you full caching control and eliminates an external DNS lookup. A server managed by RunCloud will serve this local file with incredible speed.
    2. For non-critical scripts like chat widgets or ad scripts, use a script manager to delay their loading until a user interacts with the page (e.g., scrolls or clicks).

    Suggested read: How to Easily Optimize Your WordPress Website With RunCloud Hub

    Optimize Images (Next-Gen Formats, Lazy Loading, SVG Sprites for Icons)

    Images are often the heaviest assets on a page, and a site with many unoptimized images will generate a huge number of HTTP requests. Modern image optimization techniques focus on reducing file size, deferring loads, and combining multiple small image requests into one.

    1. Convert your JPEGs and PNGs to modern formats like WebP or AVIF. These formats offer superior compression and smaller file sizes with no visible quality loss. We recommend reading this excellent article on Best WordPress Image Optimization Plugins by Patchstack to learn more about image compression.
    2. Lazy loading prevents images and iframes that are “below the fold” from loading until the user scrolls them into view. This drastically reduces the number of initial HTTP requests. This is a native feature in WordPress 5.5+, but many WordPress plugins also offer more advanced control.
    3. For simple graphics, logos, and icons, you should use Scalable Vector Graphics (SVGs). They are incredibly small in file size and scale perfectly without losing quality.

    Suggested read: 8 Best GTmetrix Alternatives for Website Performance Testing (Includes Free)

    Use Resource Hints (preload, preconnect, dns-prefetch, fetchpriority) for Critical Files

    Resource hints are instructions that you can place in your site’s HTML <head> to give the browser a “heads-up” about resources it will need soon. This allows the browser to start fetching critical files or establishing connections early, which can shave valuable milliseconds off your load time by optimizing the request-and-response cycle.

    1. dns-prefetch: You can use this for third-party domains your site needs to connect to, like Google Fonts or Google Analytics. It tells the browser to perform the DNS lookup in the background.
      • Example: <link rel="dns-prefetch" href="//fonts.googleapis.com">
    2. preconnect: This goes a step further than dns-prefetch. It completes the DNS lookup, TCP handshake, and TLS negotiation. Use this for critical third-party domains from which you know the site will fetch resources.
      • Example: <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    3. preload: Use this for a specific, critical file on your own server (like a font file or CSS file) that is needed for the initial render but might be discovered late by the browser.
      • Example: <link rel="preload" as="style" href="/wp-content/themes/my-theme/critical.css">
    4. fetchpriority=”high”: A newer hint you can add to critical <img> or <link> tags (like your LCP image) to signal its importance to the browser.
      • Example: <img src="lcp-image.webp" fetchpriority="high">

    Suggested read: The Best WordPress Caching Plugins To Speed Up Your Site (2025)

    Enable a CDN and HTTP/3 with QUIC to Reduce Latency on Many Small Requests

    A Content Delivery Network (CDN) reduces latency by storing copies of your assets on servers around the world and serving them from the location physically closest to the user. Enabling CDN can dramatically speed up your website.

    HTTP/3 is the latest web protocol, built on QUIC, and designed to be faster and more reliable, especially on mobile or unstable networks. It excels at handling many small, parallel requests without the “head-of-line blocking” that could slow down HTTP/2.

    1. Integrate a CDN: Sign up for a CDN service like Cloudflare, BunnyCDN, or KeyCDN. For a service like BunnyCDN, you’ll get a unique URL to which to point your assets. Alternatively, you can also use RunCloud’s built-in feature to enable Cloudflare Proxy with the flip of a switch.
    1. Enable HTTP/3: This is a server-level configuration and might require you to modify server settings via CLI. However, with RunCloud, enabling HTTP/3 is as simple as flipping a switch in your web application’s settings. This ensures your site is using the most advanced protocol for handling requests efficiently.

    Disable WordPress Emojis, Embeds, and Other Non-Essential Features That Trigger Requests

    By default, WordPress loads a small JavaScript file (wp-emoji-release.min.js) on every single page to convert text emoticons into emojis. It also loads scripts for oEmbeds, which allow you to embed content from sites like YouTube easily. If you don’t use these features, they are just extra, unnecessary HTTP requests.

    1. The easiest way to get rid of them is to use a plugin like Perfmatters or Asset CleanUp, which have simple toggles to disable emojis, embeds, and other WordPress core features like XML-RPC and jQuery Migrate.
    2. Use Code Snippets: If you prefer not to use a plugin, you can add the following code to your theme’s functions.php file to disable these features manually:
    // Disable emojis
    remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
    remove_action( 'wp_print_styles', 'print_emoji_styles' );
    // Disable oEmbeds
    remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
    remove_action( 'wp_head', 'wp_oembed_add_host_js' );

    Create SVG Sprite Sheets or Icon Sets to Consolidate Multiple Small Assets

    If your site uses multiple small icons (e.g., for social media links, user interface elements), each one is often a separate HTTP request. An SVG sprite sheet is a technique where you combine all of your SVG icons into a single, large SVG file. You can then display any individual icon from that single file using a simple CSS reference, consolidating dozens of potential requests into just one.

    Instructions:

    1. Gather Your SVGs: Collect all the individual SVG icons you use on your site.
    2. Generate a Sprite Sheet: Use an online tool like SVGOMG or a build tool like Webpack to combine your SVGs into a single sprite file. The tool will give you one .svg file and the corresponding HTML/CSS markup.
    3. Load the Sprite: You can either include the SVG sprite inline in your theme’s header.php or footer.php file (best for performance) or load it via JavaScript.
    4. Display an Icon: Use an SVG use element to reference the ID of the icon you want to display from the sprite.
      • Example: <svg class="icon"><use xlink:href="#icon-twitter"></use></svg>

    Implement Critical CSS and Defer/Async Non-Critical JavaScript

    By default, CSS and JavaScript files are “render-blocking”, which means that the browser has to download and parse them completely before it can display the page. Critical CSS is a technique where you extract the absolute minimum CSS needed to style the “above-the-fold” content and place it inline in the HTML <head>.

    You then load the rest of the stylesheet asynchronously. Similarly, you should defer or async non-critical JavaScript so it doesn’t block the initial page paint.

    1. Use a tool like the Critical Path CSS Generator or a service like criticalcss.com to generate the critical CSS for your key pages (homepage, blog post, etc.).
    2. Implement in WordPress:
      • Plugin Method: Caching plugins like WP Rocket have a feature that automatically generates and applies critical CSS for you with a single click. This is the recommended and easiest method.
      • Manual Method: If doing it manually, you would inline the generated CSS in a <style> tag in your site’s <head>.
    3. Load Full CSS Asynchronously: Load the main stylesheet using a non-blocking method.
      • Example: <link rel="stylesheet" href="styles.css" media="print" onload="this.media='all'">
    4. Defer/Async JavaScript: Go through your enqueued scripts and add the defer or async attribute. The defer tag executes the script after the document has been parsed, while async executes it as soon as it’s downloaded. For most scripts, defer is the safer option. You can do this with plugins or programmatically using the script_loader_tag filter in WordPress.

    Wrapping Up: Why You Should Reduce HTTP Requests for Your WordPress Websites

    In this post, we’ve covered a wide array of powerful techniques to reduce the number of web requests for your website. While any single change provides a small benefit, their combined effect can turn a slow, bloated website into a streamlined, fast, and efficient website.

    But why is this so critical? Reducing HTTP requests isn’t just about numbers. Some people even go as far as to create a website which is less than 14KB in size to reduce the number of web requests.

    Finally, a leaner site puts less strain on your server, making it more stable and capable of handling more traffic without slowing down.

    These optimizations only go so far without a fast, reliable server.

    RunCloud takes care of the heavy lifting – managing caching, HTTP/3, and CDN configuration – so your site can load faster and handle more visitors effortlessly.

    Start your free RunCloud trial today and see how quickly your WordPress site can perform when every HTTP request is optimized by default.

    FAQs on Reducing HTTP Requests in WordPress

    How do I reduce CSS and JS files in WordPress?

    Use a caching or asset optimization plugin like WP Rocket or Perfmatters to minify and combine CSS and JavaScript files into fewer, smaller files.

    What plugins help cut down external requests?

    Plugins like Perfmatters and Asset CleanUp are excellent for selectively disabling scripts on pages where they aren’t needed, which stops requests to external services. Additionally, by managing your server with RunCloud, you ensure the remaining essential requests are handled with maximum efficiency by a finely-tuned stack.

    Should I combine or defer JavaScript files?

    On modern servers, you should prioritize deferring JavaScript over combining it, as this prevents scripts from blocking page rendering.

    How do CDNs improve page speed?

    A Content Delivery Network (CDN) stores copies of your assets on servers worldwide, delivering them to users from the closest geographical location to reduce latency. Integrating a CDN like Cloudflare is straightforward with RunCloud, which simplifies the server configuration needed to work in perfect sync for maximum global speed.

    What tools show how many requests a site makes?

    Web performance tools like GTmetrix, Pingdom, and the Network tab in Google Chrome’s DevTools provide a detailed waterfall chart of every HTTP request. Use these to measure the direct performance gains from both your on-site optimizations and the efficiency of a server managed by RunCloud.

    How do I optimize icons with SVG sprites?

    You can combine multiple SVG icons into a single “sprite” file, which is loaded just once and referenced with CSS. This drastically reduces individual HTTP requests.

    Is HTTP/2 or HTTP/3 better for performance?

    HTTP/3 is the newer, faster protocol, but HTTP/2 is still a massive improvement over its predecessor and has wider support. RunCloud takes the complexity out of server management, allowing you to easily switch from HTTP/2 to HTTP/3 with just a few clicks to ensure your site is using the best technology.

  • How & Why You Should Remove Unused WordPress Plugins

    How & Why You Should Remove Unused WordPress Plugins

    Unused WordPress plugins can slow your site down and weaken your security, even when they’re deactivated.

    This guide explains why they cause problems and shows you how to safely remove them.

    Why You Should Remove Unused Plugins

    Leaving inactive or unused plugins on your WordPress installation is a significant liability. Here’s why you should clean them up:

    Enhanced Security

    Inactive plugins still leave their files on your server. If a vulnerability is found, attackers can target those files directly. Removing unused plugins closes those entry points.

    Improved Performance

    Many plugins add files and database entries that remain after deactivation. They increase backup sizes and sometimes still load assets. Removing them reduces bloat and can help your site load faster.

    Simplified Maintenance

    A shorter list of plugins makes your life easier. It simplifies troubleshooting when issues arise and reduces the time you spend on updates. With fewer plugins to manage, you can focus on the ones that are essential for your site’s functionality.

    Reduced Bloat

    Over time, unused plugins can contribute to database bloat. Even after deactivation, some plugins leave behind tables and rows in your database. This unnecessary data can slow down your database queries and negatively impact your overall site performance.

    Why Deactivation Isn’t Enough

    Many WordPress site owners believe that if a plugin is deactivated, it’s harmless. While it’s true that deactivating a plugin prevents it from actively running on your site, this is only a half-measure that creates a false sense of security. The reality is that the plugin’s files are still sitting on your server.

    Think of it this way: even if the plugin isn’t “on,” its code is still present and accessible. Hackers and malicious bots are constantly scanning the web, not just for active vulnerabilities, but for the mere presence of specific plugin files known to have security flaws. If a known vulnerability exists in a deactivated plugin, its files can still be scanned and exploited. Removing the plugin avoids this risk entirely.

    remove wordpress plugins

    How to Identify and Remove Unused Plugins

    Follow these simple steps to clean up your WordPress installation.

    Step 1: Identify Unused Plugins

    Go to Plugins in the WordPress dashboard and review each installed plugin. For each one, check whether you still use it and whether the functionality is truly needed.

    • What function does this plugin perform?
    • Is this functionality still necessary for my website?
    • Is there a better way to achieve this without a plugin?
    • When was the last time I used this plugin’s features?

    If you’re unsure about a plugin, try deactivating it and checking your website to see if any issues arise. This can help you determine if it’s safe to remove.

    Suggested read: How to Block WordPress Spam Comment Bots With Fail2ban Rate Limiting

    Step 2: Deactivate the Plugin

    Once you’ve identified a plugin that is no longer needed, click “Deactivate” under its name. This will disable the plugin, but its files will still be on your server.

    Step 3: Delete the Plugin

    After deactivating the plugin, a “Delete” option will appear. Click on it. WordPress will ask for confirmation before permanently removing the plugin’s files. Confirm the deletion.

    delete wordpress plugins

    By following these steps, you are actively enhancing your website’s security and performance. A clean WordPress installation is a crucial component of a well-maintained website, enabling you to use your hosting resources to their fullest potential.

    Suggested Read: How to Easily Change Your WordPress Site URL

    Test Plugin Changes Safely with RunCloud

    As we’ve seen, keeping your WordPress site free of unused plugins is a powerful step towards a faster, more secure, and easier-to-manage website. By removing unnecessary plugins, you can eliminate security vulnerabilities and reduce performance-draining code.

    Cleaning up unused plugins is easier when you can test changes safely and securely.

    RunCloud provides a simple and reliable way to manage WordPress sites, featuring one-click staging, automated backups, and performance-focused server setups.

    You can test plugin removals in staging, confirm everything works, and deploy changes with confidence.

    Take the risk out of managing WordPress. Use RunCloud to create a staging site, test plugin changes safely, and run your site on a fast, secure server setup.

    Create your free RunCloud account and start managing WordPress the easy way.

    Frequently Asked Questions About Removing Unused Plugins

    How does removing unused plugins help my website’s SEO?

    Search engines like Google favor websites that are fast and secure. By removing unused plugins, you reduce code bloat and potential security vulnerabilities, which improves your site’s loading speed and overall health. This sends positive signals to search engines that can boost your rankings.

    Is deactivating a plugin the same as deleting it?

    No, they are not the same. Deactivating a plugin simply turns it off, but its files remain on your server, posing a potential security risk. Deleting the plugin completely removes its files, which is the recommended practice for better security and performance.

    How often should I perform a plugin cleanup?

    It’s a good practice to review your installed plugins every three to six months. This regular audit helps ensure that you are only keeping the plugins that are necessary, up to date, and beneficial for your site’s functionality.

    Could I break my site by deleting a plugin?

    Yes, if the plugin provides essential functionality. To avoid this, always deactivate the plugin first and thoroughly test your website’s key features to ensure everything still works as expected before proceeding with deletion.

    What if I need a deleted plugin in the future?

    If you think you might need a plugin again, you can simply reinstall it from the WordPress plugin repository. However, for plugins you are certain you won’t use, complete removal is the best way to keep your site lean and secure.

  • How to Install Docker on Windows Server 2016, 2019 & 2022

    How to Install Docker on Windows Server 2016, 2019 & 2022

    Although Linux remains the easier and more efficient platform for most containers, Windows Server still plays a major role in many production environments. If your applications, tooling, or infrastructure tie you to Windows, mastering Docker on Windows Server becomes a practical requirement.

    You might be working with Windows containers because:

    • Legacy .NET Framework apps: Older ASP.NET MVC sites, WCF services, or Windows Services that can’t run in Linux containers.
    • Your Application Has Windows-Specific Dependencies: Some applications are deeply woven into the Windows operating system. If your code calls on technologies like Microsoft Message Queue (MSMQ), COM+, relies on assemblies in the Global Assembly Cache (GAC), or interacts directly with the Windows Registry in complex ways, then you will need a Windows environment to function.
    • Your Company Runs on Windows: Corporate policy and existing infrastructure are powerful forces. If all your servers are Windows-based, then your monitoring tools would be optimized for it, your security policies would be built around Active Directory, and your entire team’s expertise would lie in managing a Windows environment. In this scenario, introducing a few Linux servers adds significant operational overhead.
    • You need a Windows CI/CD Build Agent: A Windows environment is required to build and package Windows applications. You cannot compile a WPF desktop application, run MSBuild for a full .NET solution, or create a Windows Installer (.msi) package on a Linux build agent. A containerized Windows build agent gives you a clean, repeatable, and isolated environment for every single build.

    In this guide, we’ll explain how to install Docker on Windows Server. By the end of this article, you will be able to install it and run containers without any help.

    If you’re using Windows Server only because Linux feels unfamiliar, you don’t need to avoid it. RunCloud provides an intuitive dashboard for managing fast and secure Linux servers without requiring complex command-line knowledge.

    Explore How RunCloud Simplifies Linux Hosting →

    Prerequisites and Requirements For Docker on Windows

    A good DevOps engineer knows that a successful deployment is 90% preparation. Before you type a single installation command, verify that your environment is properly set up.

    Section 1: System Requirements & Hypervisor Check

    Check that you’re running a supported 64-bit Windows Server version (2016, 2019, or 2022). Then confirm CPU virtualization is enabled. How you check this depends on whether you are on bare metal or a virtual machine.

    If Your Server is a Physical Machine:

    You need to verify that virtualization support (often referred to as Intel VT-x or AMD-V) is enabled in the server’s BIOS or UEFI. The easiest way to check this from within Windows is to run a simple PowerShell command.

    Open an elevated PowerShell prompt and run the following command:

    systeminfo | findstr "Virtualization"

    Look at the output. You need to see Hyper-V – Virtualization Enabled in Firmware: Yes. If it says “No,” you must reboot the server, enter the BIOS/UEFI settings, and enable the feature.

    If Your Server is a Virtual Machine (VM):

    If your server runs inside a VM, you must enable nested virtualization on the host. Docker cannot run inside a VM without it.

    This setting is not configured inside your Windows Server VM. You must configure it from the management interface of the host hypervisor that is running your VM.

    • For VMware ESXi/vSphere: Shut down the VM. Edit the VM’s settings, expand the CPU section, and check the box for “Expose hardware-assisted virtualization to the guest OS.”
    • For Microsoft Hyper-V: Shut down the VM. Open a PowerShell prompt on the Hyper-V host (not the guest VM) and run the command: Set-VMProcessor -VMName “Your-VM-Name” -ExposeVirtualizationExtensions $true.

    Section 2: Install Latest Windows Updates

    Unlike a simple application, the Docker Engine integrates deeply with the Windows kernel. Microsoft regularly releases critical bug fixes, performance improvements, and even new container features directly through Windows Updates. By skipping updates, you are likely to encounter strange bugs, networking issues, or outright installation failures that the Windows engineering teams have already resolved.

    Prepare your server for a successful installation by getting it completely up to date.

    1. Open the Start Menu, type “Check for updates,” and open the System Settings panel.
    2. Click the “Check for updates” button and let Windows scan for all necessary updates.
    1. After the updates are installed, you will be prompted to restart your device. Do it. Rebooting your computer ensures that all changes are fully applied to the operating system before you proceed.

    Section 3: Understanding Windows vs. Linux Containers

    Windows Server can run both Windows and Linux containers, but you must choose the right one for your app. Pick Windows containers for .NET Framework or Windows-specific APIs. Use Linux containers for standard web stacks like NGINX, Node.js, Python, and databases.

    When Should You Use Windows Containers?

    These are native Windows containers. They run directly on your server, sharing the host’s Windows kernel, which makes them highly efficient and start quickly. Think of them as highly isolated Windows processes that have their own filesystem and registry, but fundamentally speak “Windows.”

    • Common Base Images: When you build a Windows container, you’ll start from a base image provided by Microsoft, such as:
      • Windows Server Core: This is the most common choice. It offers the best compatibility for older applications, as it includes a large subset of Windows APIs and services, such as IIS.
      • Nano Server: This is an incredibly lightweight, stripped-down version of Windows. You use it for modern, self-contained .NET Core/5/6+ applications to create the smallest possible image size.
    • When to use them: You must use a Windows container if your application is:
      • Built on the .NET Framework (e.g., version 4.8 or earlier).
      • An IIS-hosted website (ASP.NET, classic ASP).
      • A Windows Service.
      • Dependent on Windows-specific technologies like MSMQ, COM+, or the GAC.

    When Should You Use Linux Containers?

    When you want to run a standard Linux container (like one for NGINX, Python, or Node.js), Docker on Windows cleverly uses virtualization to run a tiny, purpose-built Linux virtual machine in the background. Your Linux containers run inside this hidden VM, not directly on the Windows kernel.

    You should use a Linux container when your application is a standard Linux workload. This is perfect for:

    • Web servers like NGINX or Apache.
    • Applications written in Python, Node.js, Ruby, or Go.
    • Databases like PostgreSQL, MySQL, or Redis.
    • Essentially, any application you would normally find on Docker Hub that is not explicitly for Windows.

    3. Installation Guide: Using PowerShell

    To manage a Windows Server effectively, you need to embrace automation and scripting. For the entire installation, we will use PowerShell for all tasks. It’s repeatable, less prone to human error, and the professional way to configure your servers.

    First, open PowerShell as an Administrator. You can do this by right-clicking the Start button and selecting “Windows PowerShell (Admin)” or “Windows Terminal (Admin)”.

    Step 1: Enable Required Windows Features

    Before you can install the Docker Engine, you must first enable the underlying features in the Windows operating system that support containerization and virtualization.

    In your elevated PowerShell window, run the following commands one by one:

    # Installs the core Windows Containers feature
    Install-WindowsFeature -Name Containers
    # Installs the Hyper-V role. This is best practice for security and compatibility.
    Install-WindowsFeature -Name Hyper-V 

    Even if you only plan to run Windows containers, installing the Hyper-V role enables “Hyper-V isolation.” This is a more secure way to run containers, as each one gets its own lightweight, dedicated kernel, preventing anything inside the container from affecting the host server.

    Step 2: Install the Docker Engine on Windows

    After your server has restarted, open another elevated PowerShell window. You will now use Microsoft’s DockerMsftProvider module to find and install the Docker Engine directly from a trusted repository.

    Run these two commands:

    # Installs the PowerShell module that knows how to find and install Docker
    Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    # Uses the module to install the latest validated version of Docker Engine
    Install-Package -Name docker -ProviderName DockerMsftProvider

    You will be asked to trust the repository; type A (for “Yes to All”) and press Enter to proceed.

    Step 3: Post-Install Verification

    Once your server is back online, it’s time to confirm that everything is working as expected. Open a new elevated PowerShell window and run these checks.

    1. Check the Docker Service: The Docker Engine runs as a Windows service. Run the following command to verify it. You should see the Status listed as Running.
    Get-Service docker
    1. Check the Docker CLI: Run the following command to verify that the docker command is available in your system’s PATH.
    docker --version

    This should return the Docker version you just installed, for example: Docker version 20.10.9, build 79ea9d3.

    1. Get Detailed Information: The ‘docker info’ command provides a comprehensive overview of your installation.
    docker info

    Post-Installation Configuration

    After installation, make Docker production-ready by adjusting these settings:

    • Create the Config File: Create a file named daemon.json inside the C:\ProgramData\docker\config\ directory. You will need to create the config folder yourself if it does not exist.
    • Move the Docker Data Directory: To prevent filling your C: drive, add the following to your daemon.json: "data-root": "D:\\Docker". This moves all images, volumes, and container data to the specified path on your D: drive.
    • Set up a Registry Mirror: To speed up image pulls for docker pull, configure a local mirror. Add "registry-mirrors": ["https://your.registry-mirror.url"] to prioritize pulling from your faster, local cache.
    • Grant Access to Non-Admins: To allow standard users to run Docker commands, add the following to the configuration: "group": "docker". This gives members of the local Docker security group access to the Docker engine.
    • Set a Network Proxy: To use Docker behind a corporate proxy, you must set an environment variable. Use PowerShell to run [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://user:pass@proxy:port/", [EnvironmentVariableTarget]::Machine).
    installing docker on windows
    • Run a Test Container: After configuring and restarting the Docker service, always confirm it’s working correctly. Run docker run mcr.microsoft.com/windows/nanoserver:ltsc2022 powershell -Command "echo Hello from your configured container!" to verify it works correctly.

    Suggested read: Self-Hosting Docker vs Cloud-Based Docker

    After Action Report

    Docker on Windows solves specific use cases, but most modern stacks run faster and more reliably on Linux. If you want that performance without managing Linux manually, RunCloud gives you a clean dashboard for deploying and managing Linux servers with ease.

    With RunCloud, you get:

    • Rock-Solid Security: RunCloud automates complex security configurations, so your server is hardened and protected from the start.
    • Total Flexibility: It works with any cloud provider (e.g., AWS, DigitalOcean, Vultr) or even a server in your own home. You never get locked into a single provider.
    • Complete Control: You always retain full root access and complete control of your server; RunCloud is your co-pilot, not a black box.

    If you’re ready to run Docker with fewer constraints and better performance, try hosting your containers on a fast Linux server managed through RunCloud’s easy dashboard.

    Create your free RunCloud account and deploy your next container the simple way.

  • How to Set Up WooCommerce Caching: The Ultimate Guide in 2025

    How to Set Up WooCommerce Caching: The Ultimate Guide in 2025

    Enabling caching on a WooCommerce store is an important but delicate process that balances performance with functionality.

    Unlike a static blog, an e-commerce site is highly dynamic, managing user-specific data like shopping carts, account information, and personalized content.

    A misconfigured cache can lead to serious issues, such as showing one customer’s cart to another or displaying incorrect order information, ultimately destroying user trust and costing sales.

    When we configure the cache, our goal is to aggressively cache static content and anonymous user page views while intelligently bypassing the cache for dynamic elements and logged-in users.

    This guide will walk you through how to properly implement caching for your WooCommerce store. By following these principles, you can significantly reduce server load, decrease page load times, and provide a faster, more reliable shopping experience for your customers without compromising the dynamic nature of your e-commerce operations.

    Let’s get started!

    What is WooCommerce Caching?

    Caching instructs your server to build a web page only once and then save a static, ready-to-go copy. Instead of repeating the resource-heavy process of running code and fetching data from the database for every visitor, the server can instantly deliver this pre-made version, dramatically accelerating your site’s performance.

    The most important part of building a good cache is being smart about what to save. Modern CMSs such as WooCommerce intelligently create copies of static pages that are the same for everyone, like product pages or category listings, to make them load incredibly quickly. At the same time, it knows to exclude dynamic pages unique to each user, such as the shopping cart and checkout pages, ensuring that customers only see their items and personal information.

    📖 Suggested read: How to Easily Optimize Your WordPress Website With RunCloud Hub

    Benefits of WooCommerce Caching

    The primary benefit of caching your WooCommerce store is a massive boost in website speed. Faster-loading pages create a significantly better user experience, which keeps shoppers from getting frustrated and leaving your site. This leads directly to more sales and a lower cart abandonment rate.

    In addition to improving conversions, the website speed is an important factor for search engine optimization (SEO). Google and other search engines favor fast websites, so a well-cached store will rank higher in search results, bringing you more free, organic traffic.

    Finally, caching reduces the workload on your server and allows your store to handle many more visitors at once without slowing down or crashing, which is essential for surviving busy shopping seasons like Black Friday.

    📖 Suggested read: How to Use Redis Full-Page Caching to Speed Up WordPress

    Step-by-Step Guide: How to Set Up WooCommerce Caching

    Follow the steps below to develop an effective caching strategy for your WooCommerce site.

    1. Choosing the Right Caching Solution

    The first (and arguably the most important) decision is selecting the appropriate caching technology for your hosting environment. Your options fall into two broad categories: plugin-based caching and server-level caching.

    Caching plugins such as WP Rocket or W3 Total Cache are user-friendly options that allow you to edit and manage your caching settings from the WordPress application. Although convenient, this adds processing overhead, as WordPress must still load to serve a cached page.

    You should consider using server-level caching, a superior approach to achieve maximum performance. Modern caching plugins, such as LiteSpeed’s LSCache, operate at the web server level, before WordPress is even loaded. This allows them to serve cached pages with minimal latency and resource consumption, resulting in significantly faster response times.

    However, if you are using RunCloud, you can consider using the RunCloud Hub, which provides a good balance between the two by offering both native NGINX FastCGI cache (RunCache) and Redis Page caching. For RunCloud users, RunCloud Hub is the most efficient approach as it is specifically optimized for the server stack.

    📖 Suggested read: The Best Free eCommerce Platforms for Selling in 2025

    2. Installing and Configuring Your Caching Plugin

    Once you have chosen your caching solution, the next step is installation and initial configuration. If using a plugin like WP Rocket, installation is straightforward via the WordPress dashboard. After activation, most modern caching plugins automatically detect that WooCommerce is active and apply a default set of safe exclusion rules. These presets typically prevent the caching of critical pages like Cart, Checkout, and My Account, providing a solid baseline to prevent major functional issues.

    If you are using RunCloud, you don’t need to leave your RunCloud dashboard, as you can enable RunCloud Hub within your RunCloud dashboard and your WordPress web application.

    During the initial setup, you should avoid enabling every performance feature simultaneously. Start by enabling the core page caching feature for logged-out users. After confirming the site still functions correctly, you can incrementally enable other options like CSS or JavaScript minification, testing thoroughly after each change.

    📖 Suggested read: How to Fix WordPress High CPU Usage (10 Instant Solutions)

    3. Excluding Dynamic WooCommerce Pages from Cache

    The single most important rule of WooCommerce caching is never to cache pages that display user-specific information publicly.

    Caching these pages would result in one user’s private data being served to other visitors, a catastrophic failure for any online store.

    The primary pages that must be excluded from any page caching mechanism are the Cart, Checkout, and My Account pages. By default, their URL slugs are /cart/, /checkout/, and /my-account/, respectively.

    To prevent this scenario at a technical level, the server sends specific instructions to browsers and intermediate caches through HTTP headers. This is handled by using the Cache-Control: private header. This HTTP header specifies that the response is intended for a single user’s browser and must not be stored by any shared cache, such as a CDN or a server-level cache like RunCache. This is often accompanied by a no-store directive for maximum security.

    Almost all caching plugins and server-level configurations provide a setting labeled “Never Cache URLs” or “Exclude URLs”. You must add the relative paths for these private pages in this section. It is best practice to use wildcards to ensure all sub-pages are also excluded from the cache. For example, adding /my-account/* will ensure that account-specific pages, such as order history and address management, are excluded from the cache.

    📖 Suggested read: Server Cache vs. Browser Cache vs. Site Cache: What’s the Difference?

    4. Excluding WooCommerce Sessions and Cookies from Cache

    In addition to excluding specific URLs, you must be aware of WooCommerce cookies. WooCommerce uses cookies to track user sessions and cart contents, even for guests who are not logged in.

    For example, the woocommerce_cart_hash cookie tracks changes to the shopping cart, and the wp_woocommerce_session_ cookie contains a unique code corresponding to the customer’s session data in the database. When these cookies are present in a visitor’s browser, it signifies that the user has an active, personalized session.

    To ensure your website works as expected, you must configure your caching system to bypass the cache entirely whenever these specific WooCommerce cookies are detected. This ensures that any user who has added an item to their cart or is logged in receives a fresh, non-cached page from the server. It also ensures that dynamic elements like the mini-cart and user-specific pricing function correctly.

    📖 Suggested read: Everything You Need to Know About WordPress Object Caching

    5. Configuring Minification Settings

    Minification is removing unnecessary characters (like whitespace and comments) from CSS and JavaScript files and combining them to reduce the number of server requests.

    The minification process can improve load times and cause unexpected errors and conflicts, particularly with the complex JavaScript used by WooCommerce and its many extensions. When enabling minification, proceed cautiously and test rigorously after each change is recommended.

    We recommend enabling CSS minification first and thoroughly testing the site’s layout and design. Once satisfied, you can enable JavaScript minification and test all interactive elements, paying close attention to the add-to-cart functionality, image galleries on product pages, and checkout. If you encounter a broken feature, you can configure your caching plugin to exclude specific CSS or JavaScript files from minification.

    📖 Suggested read: LiteSpeed Cache WordPress Plugin Configuration Tutorial

    6. Integrating CDN and Edge Caching with WooCommerce

    A Content Delivery Network (CDN) is a set of computers that can distribute your static assets, such as images, CSS, and JavaScript, across a worldwide network of servers. This drastically reduces latency for international visitors by serving files from a location geographically closer to them.

    Using a CDN to serve static assets is highly recommended for WooCommerce. Most caching plugins provide a dedicated section for rewriting asset URLs to point to the CDN. Modern caching solutions, such as Cloudflare or Bunny.net Accelerator, take this a step further by caching the full HTML of your pages at the CDN level.

    The edge cache must be configured to respect the same exclusion rules as your on-site cache, bypassing the cache for dynamic URLs (cart, checkout) and any visitor with a WooCommerce session cookie.

    This ensures the CDN edge doesn’t serve a stale, generic page to an active shopper. Proper integration ensures your origin server sends the correct Cache-Control headers, which a well-configured caching plugin will manage for you.

    📖 Suggested read: How to Use Redis Object Cache To Speed Up a Dynamic WordPress Site

    7. Setting Up Object Caching (Redis/Memcached) for WooCommerce

    Caching web pages allows you to store and serve fully rendered HTML pages, but that’s not the only thing you can cache. Loading a web page launches several repetitive and complex database queries that take a long time to execute. An object cache, such as Redis or Memcached, can store the results of these database queries in the server’s fast-access RAM.

    This Object caching functionality can provide a massive performance boost for a query-heavy application such as WooCommerce, which constantly checks product stock, sale prices, user permissions, and session data. This is especially useful for logged-in users and during backend operations where page caching is not active.

    Enabling object caching can be tricky if you do it manually, but using RunCloud Hub allows you to configure it with a single click. Simply navigate to the RunCloud Hub page in your RunCloud dashboard and select Enable next to the Redis Object Cache setting.

    Enabling this optimization significantly reduces the load on your MariaDB/MySQL database, which leads to faster dynamic page generation, a more responsive WordPress admin area, and a snappier experience for active shoppers navigating your store.

    📖 Suggested read: How to Easily Optimize Your WordPress Website With RunCloud Hub

    8. Enabling Redis ACL for Object Caching

    When you enable caching for your WooCommerce store, you inherently handle sensitive personal data and Personally Identifiable Information (PII). If you host multiple WordPress websites on the same server, this can create a security risk.

    In the case of a breach, if one of the websites gets infected, the attacker can access the cached data of other sites.

    To protect this data, it’s recommended that you enable Redis Access Control Lists (ACLs). This ensures that each website can only access its own cached data. It will also prevent a malicious plugin on one site from accessing the Redis data of your other sites.

    However, correctly configuring and maintaining this security can be challenging. That’s why we’ve pre-configured it in RunCloud Hub. When you install our plugin, Redis ACLs are automatically set up for your website, providing robust security with no extra effort.

    You can verify this setting by navigating to the “Redis Object Cache Constants” section in the RunCloud Hub settings menu. If you see the following screen, then it is configured correctly.

    9. Testing and Troubleshooting Your Cache

    Creating a caching system is one thing, but running it is another. A flawed cache configuration can go unnoticed while silently costing you sales. After you deploy your cache, you should use two different web browsers or a regular and an incognito window to test it.

    Browse the site in the incognito window (representing a new, logged-out visitor) to ensure you are being served fast, cached pages. In the regular browser, log in as a test customer to verify that all dynamic functionality works correctly.

    During the tests, you should perform a complete test transaction: add a product to the cart, view the cart page, proceed to checkout, and check the mini-cart widget on various pages to ensure it updates correctly.

    Check that personalized content for logged-in users appears as it should. If you encounter an issue, the first step is to clear all caches, the plugin’s cache, any server-level cache, your CDN cache, and your browser cache, before re-testing.

    If a problem persists, disable your most recently changed setting (e.g., JS minification) and test again, working backward to isolate the source of the conflict. You can also use your browser’s developer tools to inspect page response headers. This lets you see cache status codes in HTTP headers like X-Cache: HIT or X-RunCache-Status: BYPASS to confirm your rules are working as intended.

    Final Thoughts: Achieving Peak WooCommerce Performance with RunCloud

    In this guide, we have shown you that properly configuring cache for a WooCommerce store is a multi-layered process that requires a deep understanding of how static and dynamic content interact.

    Although manual configuration offers granular control, it also introduces multiple potential failure points that can be time-consuming to troubleshoot and disastrous if implemented incorrectly.

    This is precisely why we developed RunCloud Hub, our all-in-one optimization and management plugin.

    Built to integrate seamlessly with the RunCloud platform and eliminate these complexities, RunCloud Hub handles the actions mentioned above automatically and provides WooCommerce-aware caching out of the box with no manual rules required.

    Want WooCommerce caching without the headaches? Try RunCloud Hub, which is built for store owners.

    One of the most impactful optimizations for a busy WooCommerce store is Redis Object Caching, which dramatically speeds up backend operations and dynamic requests for logged-in users. This process can be tedious and complex, requiring the deployment of a Redis instance, installing a connector plugin, and manually configuring the connection.

    However, RunCloud Hub transforms this complex task into a single click. It automatically detects your RunCloud-managed Redis server and enables you to do object caching.

    By combining the raw power of RunCloud’s server-level caching with the intelligent, WooCommerce-aware optimizations of RunCloud Hub, you can achieve fast performance without needing to be a caching expert.

    This allows you to focus on what truly matters: growing your business, managing your products, and serving your customers.

    Ready to boost your store’s speed, stability, and conversions?

    Get started with RunCloud Hub and let your caching configure itself.

    FAQs on WooCommerce Caching

    What is the best caching plugin for WooCommerce?

    RunCloud Hub is one of the best caching plugins for WooCommerce. It automatically detects and excludes cart and checkout pages to prevent issues.

    Does WooCommerce work with Redis?

    Yes, WooCommerce works extremely well with Redis, primarily using it as a persistent object cache to efficiently handle database queries. This dramatically speeds up the WordPress admin area, user-specific content, and complex store operations, reducing server load. Enabling Redis caching with a single click on a managed server platform like RunCloud Hub is extremely easy.

    How can I use Memcached with WooCommerce?

    To use Memcached with WooCommerce, you must first ensure it is installed and running on your server, then use RunCloud Hub to integrate it as an object cache. Enabling cache stores repetitive database query results in memory, accelerating your site’s backend and dynamic functions.

    How do I exclude the cart and checkout from the cache?

    Leading caching plugins like WP Rocket and FlyingPress automatically exclude the default /cart/, /checkout/, and /my-account/ pages from the cache to ensure they remain dynamic. If you need to do this manually, find the “Do Not Cache URLs” or “Exclude Pages” section in your plugin’s settings and add the slugs for these critical pages. This is essential for a functioning e-commerce store.

    Can I use object caching in WooCommerce?

    Object caching is highly recommended for WooCommerce as it significantly reduces the number of database queries required for each page load. By storing query results in a fast-access system like Redis or Memcached, everything from product filtering to order processing in the backend is sped up.

    Why is my product search not updating?

    If your product search results are not updating with new products or price changes, the cause is almost always a stale page cache. Your caching system serves an old, static HTML version of the search results page instead of generating a new one. Clearing your site-wide cache or excluding the search results page will resolve this.

    Does caching affect WooCommerce search results?

    Yes, aggressive page caching can negatively affect WooCommerce search results by serving outdated or irrelevant content to users. To avoid this, you should exclude your search results page from the page cache so that it is always generated dynamically. Implementing an object cache can still speed up the search function by optimizing the underlying database queries.

    What is the difference between a caching plugin and server-level caching?

    A caching plugin runs within your WordPress installation, while server-level caching operates before WordPress loads, making it significantly faster and more efficient. It intercepts requests at the server level, delivering a cached page without engaging PHP or your database. RunCloud Hub provides this superior server-level caching functionality, which you can enable with one click for a performance boost that plugins alone cannot match.

    How do I choose the best hosting for a high-traffic WordPress site?

    For high-traffic sites, you need a scalable cloud server (from providers like Vultr, DigitalOcean, or AWS) paired with an expert server management panel. This combination provides raw power and fine-tuned control over your server environment. Using RunCloud Hub on your server allows you to easily manage resources and deploy critical performance features like single-click caching, ensuring your site remains fast and responsive under heavy load.