{"id":385007,"date":"2026-10-12T14:06:19","date_gmt":"2026-10-12T14:06:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sitemap-cache-warmer\/"},"modified":"2026-10-12T14:05:51","modified_gmt":"2026-10-12T14:05:51","slug":"uruz-cache-warmer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/uruz-cache-warmer\/","author":23559868,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.4","stable_tag":"1.2.4","tested":"7.1.3","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Uruz Cache Warmer","header_author":"Brainrune","header_description":"Keeps the cache warm by visiting the URLs in your sitemap, in parallel and at a pace that backs off when the server is busy. Warms the desktop and mobile cache buckets separately, so phone visitors stop paying for cold pages.","assets_banners_color":"f4f5f9","last_updated":"2026-10-12 14:05:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/brainrune.com\/plugins\/#cache-warmer","header_author_uri":"https:\/\/brainrune.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":26,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.4":{"tag":"1.2.4","author":"brainrune","date":"2026-10-12 14:05:51","revision":3741833}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3741833,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3741833,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3741833,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3741833,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-3088x1000.png":{"filename":"banner-3088x1000.png","revision":3741833,"resolution":"3088x1000","location":"assets","locale":"","width":3088,"height":1000}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3741833,"resolution":"1","location":"assets","locale":"","width":2880,"height":1800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3741833,"resolution":"2","location":"assets","locale":"","width":2880,"height":1800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3741833,"resolution":"3","location":"assets","locale":"","width":2880,"height":1800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3741833,"resolution":"4","location":"assets","locale":"","width":2880,"height":1800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3741833,"resolution":"5","location":"assets","locale":"","width":2880,"height":1800}},"screenshots":{"1":"The dashboard: queue size, cold share, and the measured time for a full cycle.","2":"Settings: pace, the quiet window, and the mobile bucket.","3":"Recently warmed URLs, with the desktop and mobile bucket in separate columns.","4":"The setup wizard turns the pace you pick into how long one full pass over the site takes.","5":"How it works: the steps the warmer follows, a live read of this site's cron setup, and the WP-CLI commands."}},"plugin_section":[],"plugin_tags":[146,232693,14945,247,1557],"plugin_category":[52,54,55],"plugin_contributors":[281502],"plugin_business_model":[],"class_list":["post-385007","plugin","type-plugin","status-publish","hentry","plugin_tags-cache","plugin_tags-cache-warming","plugin_tags-litespeed","plugin_tags-performance","plugin_tags-sitemap","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_category-seo-and-marketing","plugin_contributors-brainrune","plugin_committers-brainrune"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/icon.svg?rev=3741833","icon":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/icon.svg?rev=3741833","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/screenshot-1.png?rev=3741833","caption":"The dashboard: queue size, cold share, and the measured time for a full cycle."},{"src":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/screenshot-2.png?rev=3741833","caption":"Settings: pace, the quiet window, and the mobile bucket."},{"src":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/screenshot-3.png?rev=3741833","caption":"Recently warmed URLs, with the desktop and mobile bucket in separate columns."},{"src":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/screenshot-4.png?rev=3741833","caption":"The setup wizard turns the pace you pick into how long one full pass over the site takes."},{"src":"https:\/\/ps.w.org\/uruz-cache-warmer\/assets\/screenshot-5.png?rev=3741833","caption":"How it works: the steps the warmer follows, a live read of this site's cron setup, and the WP-CLI commands."}],"raw_content":"<!--section=description-->\n<p>A page that falls out of cache is built from scratch for the next visitor. On a WooCommerce store that visitor waits seconds instead of milliseconds.<\/p>\n\n<p>Uruz Cache Warmer reads your sitemap, builds a queue of public URLs and visits them in the background, so pages are already cached by the time somebody asks for them.<\/p>\n\n<p>Every request goes to your own site. A URL on any other host is dropped before it is fetched, and the plugin contacts no third-party service.<\/p>\n\n<p><strong>The mobile bucket<\/strong><\/p>\n\n<p>LiteSpeed, and most CDNs, keep a separate cache copy for mobile devices: the response carries <code>vary: User-Agent<\/code> and the classification rules live in <code>.htaccess<\/code> or in the CDN. A warmer that sends only a desktop user agent leaves the mobile copy cold, and that is where most store traffic lands.<\/p>\n\n<p>This plugin warms both and reports them in separate columns, so a bucket that is not being filled is visible at a glance.<\/p>\n\n<p><strong>What it does<\/strong><\/p>\n\n<ul>\n<li>Reads a sitemap index or a plain <code>urlset<\/code>. With no readable sitemap it walks your published content instead.<\/li>\n<li>Extra URLs you list by hand are warmed on top of the sitemap.<\/li>\n<li>Six-step setup wizard: reads your sitemap on the spot and shows how long a full pass will take at the pace you pick.<\/li>\n<li>Warms a few URLs while you watch, with the cache answer for each one.<\/li>\n<li>A secret cron URL that warms one batch. Point a server cron entry at it and the warmer runs on hosting with no WP-CLI, independent of the WordPress cron queue.<\/li>\n<li>One line at the top of the dashboard says whether warming is running normally or has stopped, and what to do about it.<\/li>\n<li>A How it works tab: the steps the plugin follows, a live read of your cron setup, and the exact cron and WP-CLI lines to paste.<\/li>\n<li>Judges the cache only from the second pass onwards. The first warming request is the one that builds the page, so it always reads MISS; that is not counted and not emailed about.<\/li>\n<li>Warms the home page first, then archives, then everything else.<\/li>\n<li>Sends requests in parallel through the HTTP library WordPress already ships, with no added dependency.<\/li>\n<li>Adaptive pacing: slow answers or a loaded server shrink the next run, and a 429 or 503 is honoured for as long as Retry-After says.<\/li>\n<li>Quiet window: hours in which the warmer uses a larger batch and more parallel requests.<\/li>\n<li>Detects the cache header (LiteSpeed, Cloudflare, Nginx, Varnish, CloudFront, Kinsta, SiteGround, Sucuri, 20i) and reduces it to hit, miss, bypass or no cache.<\/li>\n<li>Warms a page the moment it is published or updated, instead of waiting for its turn.<\/li>\n<li>Emails you when too many warmed pages come back cold.<\/li>\n<li>Reads the cart, checkout and account pages from WooCommerce, in every language, and never warms them. Extra paths can be added by hand.<\/li>\n<li>WP-CLI: <code>wp brl-scw run<\/code>, <code>rebuild<\/code>, <code>warm &lt;url&gt;<\/code>, <code>status<\/code>, <code>reset<\/code>.<\/li>\n<li>Sends an identifying header and <code>DNT: 1<\/code>, so the traffic can be filtered out of logs and server-side analytics.<\/li>\n<\/ul>\n\n<p><strong>No paid tier<\/strong><\/p>\n\n<p>Every feature listed above is in this plugin. There is no URL limit, no locked screen and no upsell.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>wp-content\/plugins\/<\/code>, or install the ZIP from Plugins &gt; Add New.<\/li>\n<li>Activate it.<\/li>\n<li>The setup wizard opens: it reads your sitemap, you pick a pace, and the last step turns the worker on.<\/li>\n<li>For hosting where WP-Cron is unreliable, add the cron entry shown under Settings &gt; Running the worker.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20hammer%20my%20server%3F\"><h3>Does it hammer my server?<\/h3><\/dt>\n<dd><p>No. A small batch per run, a delay between requests, a 45-second ceiling per run, and adaptive pacing that backs off when the site slows down or the machine is under load. All of these are settings.<\/p><\/dd>\n<dt id=\"why%20are%20urls%20never%20warmed%20on%20my%20low-traffic%20site%3F\"><h3>Why are URLs never warmed on my low-traffic site?<\/h3><\/dt>\n<dd><p>WP-Cron only fires when somebody visits, which a quiet site rarely has at night. Add a real cron entry at your host calling <code>wp brl-scw run<\/code>, or hitting <code>wp-cron.php<\/code>.<\/p><\/dd>\n<dt id=\"should%20i%20turn%20on%20the%20mobile%20pass%3F\"><h3>Should I turn on the mobile pass?<\/h3><\/dt>\n<dd><p>Yes, if your cache serves separate mobile copies, which LiteSpeed and most CDNs do. It doubles the requests per cycle, and the first cycle after you enable it is slow, because every mobile page is built from scratch.<\/p><\/dd>\n<dt id=\"the%20admin%20page%20hangs%20when%20i%20press%20%22run%20one%20batch%20now%22\"><h3>The admin page hangs when I press \"Run one batch now\"<\/h3><\/dt>\n<dd><p>Your site is serving one PHP request at a time. The warm requests queue up behind the admin request that started them, and neither can finish. It shows up on dev servers and on a php-fpm pool sized to a single worker.<\/p>\n\n<p>Let the background worker do the warming instead, or raise the number of PHP workers. On normal hosting this does not happen.<\/p><\/dd>\n<dt id=\"what%20counts%20as%20%22cold%22%3F\"><h3>What counts as \"cold\"?<\/h3><\/dt>\n<dd><p>Only a real MISS. Bypass and no-cache are decisions your stack made on purpose, and unknown means no cache header could be read, so neither counts as cold.<\/p><\/dd>\n<dt id=\"is%20the%20cron%20url%20safe%20to%20leave%20on%20the%20site%3F\"><h3>Is the cron URL safe to leave on the site?<\/h3><\/dt>\n<dd><p>It runs one batch and nothing else, and only when the request carries the random key generated on your site. A wrong key gets a 403, and you can replace the key from Settings at any time. A cron entry cannot send a login or a nonce, so the key is the credential.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20with%20cloudflare%20html%20caching%3F\"><h3>Can I use it with Cloudflare HTML caching?<\/h3><\/dt>\n<dd><p>Yes, and the plugin reads <code>cf-cache-status<\/code>. If you also run LiteSpeed, keep one purge strategy rather than two.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Renamed to Uruz Cache Warmer, slug <code>uruz-cache-warmer<\/code>.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>The admin page moved to <code>admin.php?page=brl-scw-cache-warmer<\/code>, and the WP-CLI command is now <code>wp brl-scw<\/code>. The old command name still works.<\/li>\n<li>The Events log keeps its columns: a long context folds to one line and opens to the full JSON on click.<\/li>\n<li>Database queries name the queue table through a placeholder instead of building it into the SQL.<\/li>\n<li>Uninstall also removes the canary timestamp and the setup wizard's cached sitemap count.<\/li>\n<li>The warmer's user agent carries the plugin's real version.<\/li>\n<li>Recently warmed shows the path instead of the full address, so the desktop and mobile columns stay on screen on a laptop.<\/li>\n<li>No more sideways scrollbar under the admin screens.<\/li>\n<li>Setup lays the pace and quiet-window fields out side by side, and the Back button is readable on the dark bar.<\/li>\n<li>Notices are plain cards with a small status dot.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Purges done outside WordPress are now caught: each run checks three recently warmed URLs, and only when all three come back cold is the queue reset. A single check fired on the partial purges a stock sync makes.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Archive pagination: an optional switch warms page 2, 3... of categories, brands, the shop and the blog. A sitemap names only the first page of an archive, and on a big category the second page is visited almost as often. The page count comes from the term count and the products-per-page setting; a cap (default 3) limits how deep it goes.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Rebuilt adaptive pacing around measured request latency and exact concurrency.<\/li>\n<li>Made large sitemap rebuilds use safe database batches.<\/li>\n<li>Hardened same-site requests and the secret cron endpoint.<\/li>\n<li>Split the admin renderer and stylesheet into maintainable modules.<\/li>\n<li>Added automated tests and WordPress.org quality checks.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Keeps your cache warm by visiting the URLs in your sitemap, in both the desktop and the mobile cache bucket.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/385007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=385007"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brainrune"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=385007"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=385007"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=385007"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=385007"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=385007"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=385007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}