Sidekick is the server-side page cache built into every HonestHosting WordPress Site. When it is
enabled, Sidekick keeps a copy of each page WordPress renders and serves that copy to the next visitors, so most page views
never have to run PHP or query the database. Cached pages are cleared automatically when content changes in WordPress (posts,
comments, menus, terms), and you can clear the whole cache at any time with the icon button in the Sidekick row on the Site
summary card.
Every Site Type provides a set of Sidekick defaults. A Site can override individual settings: anything you do not
override keeps following the Site Type, including future updates to its defaults.
To change the settings, edit the Site, turn on Sidekick Cache Enabled under Site Features, and expand
the Performance Configuration section. The options are only shown while Sidekick is enabled. After saving, the platform
updates the Site deployment automatically.
Sidekick is disabled by default. Turn on Sidekick Cache Enabled to start caching pages for a Site.
| Setting | Field in the app | Default | Description |
|---|---|---|---|
enabled |
Sidekick Cache Enabled | false |
Turns the Sidekick page cache on or off for the Site |
cache_ttl |
Cache Time To Live (TTL) | 300 |
How long a page stays cached, in seconds (60 - 86400) |
cache_response_codes |
Cache Response Codes | 2XX,301,302 |
Response status codes that may be cached. 2XX means any status from 200 to 299 |
nocache |
No Cache Paths | /wp-admin,/wp-json,/wp-cron.php,/sitepro,/index.php/wp-json |
Path prefixes that are never cached, including everything beneath them (see multisite) |
nocache_home |
No Cache Home | false |
When true, the site root / is not cached. It applies to / only |
nocache_regex |
No Cache Regex | \.(mp4|webm|mp3|ogg|wav|pdf|zip|tar|gz|7z|exe)$ |
Regular expression for other paths or file types that should not be cached |
nocache_query |
No Cache Query Parameters | rest_route,unapproved,moderation-hash |
Query parameters that make a request skip the cache, on any path (see query parameters) |
cache_key_queries |
Cache Key - Queries | WordPress core query variables, ver, v, utm_*, gad_*, mc_cid |
Query parameters whose values are cached separately (see query parameters) |
cache_ignore_queries |
Ignored Tracking Parameters | gclid, fbclid, msclkid, and other click IDs |
Tracking parameters left out of the cache key (see query parameters) |
cache_key_headers |
Cache Key - Headers | Accept-Encoding |
Request headers included in the cache key. Do not change unless you understand the consequences |
cache_key_cookies |
Cache Key - Cookies | wordpress_logged_in_*,wordpress_sec_* |
Cookies included in the cache key (a trailing * matches by prefix). Do not change unless you understand the consequences |
Sizes use human-readable values such as 128KB, 64MB or 1GB.
| Setting | Field in the app | Default | Description |
|---|---|---|---|
cache_memory_max_size |
Cache Memory Max Size | 64MB |
Total memory the cache may use. 0 disables the memory cache |
cache_memory_max_count |
Cache Memory Max Count | 250 |
Maximum number of items kept in memory (100 - 100000) |
cache_memory_item_max_size |
Cache Memory Item Max Size | 128KB |
Largest single item kept in memory |
cache_memory_stream_to_disk_size |
Cache Memory Stream To Disk Size | 128KB |
Responses larger than this go straight to the disk cache instead of memory. 0 disables streaming |
cache_disk_max_size |
Cache Disk Max Size | 256MB |
Total disk space the cache may use. 0 disables the disk cache |
cache_disk_max_count |
Cache Disk Max Count | 1000 |
Maximum number of items kept on disk (100 - 100000) |
cache_disk_item_max_size |
Cache Disk Item Max Size | 10MB |
Largest single item kept on disk |
Every query parameter on a request (the part of the URL after ?) falls into exactly one class:
| Class | Setting | What happens |
|---|---|---|
| No-cache | nocache_query |
The request skips the cache |
| Cache key | cache_key_queries |
The parameter is part of the cache key: each distinct value is cached separately |
| Ignored | cache_ignore_queries |
The parameter is left out of the cache key, so those visits share the page’s cached copy |
| Anything else | - | The request is not cached. Sidekick can’t know whether the parameter changes the page, so it passes the request to WordPress without storing the response |
No-cache by default (rest_route,unapproved,moderation-hash):
rest_route is the WordPress REST API, which WordPress serves on any URL that carries it (for example
/?rest_route=/wp/v2/posts).unapproved and moderation-hash are the “your comment is awaiting moderation” view WordPress shows to the person who just
left a comment.Cache key by default: the public query variables WordPress core registers (p, page_id, cat, s, paged, m,
feed, orderby, post_type, the sitemap variables, and so on), so sites on plain permalinks keep caching, plus category,
the asset version parameters ver and v, and the campaign labels utm_*, gad_* and mc_cid.
Ignored by default: per-click tracking IDs that are different on nearly every visit, so keying them would make every ad or email click a cache miss:
gclid,gbraid,wbraid,dclid,fbclid,msclkid,ttclid,twclid,li_fat_id,igshid,yclid,srsltid,_gl,_ga,mc_eid,_kx,_hsenc,_hsmi,mkt_tok
A few more things worth knowing:
* matches by prefix, so utm_* covers utm_source, utm_medium, utm_campaign, and so on.cache_key_queries and cache_ignore_queries, it is treated as a cache key.* on its own in cache_key_queries caches every parameter that is not ignored, each value separately.filter_color, lang, amp, …) are deliberately not in the defaults.
Pages requested with them are not cached until you add them to cache_key_queries (see the examples below).These settings are comma-separated lists:
nocachenocache_querycache_key_queriescache_ignore_queriescache_key_headerscache_key_cookiescache_response_codesRather than storing a full copy of the list for your Site, HonestHosting stores only your changes to the Site Type’s
list. That way, when the defaults are improved later (for example, a new tracking ID is added to the ignored list), your Site
picks up the change automatically while keeping your own additions and removals.
Simply edit the list. Each field shows the values currently in effect for the Site. When you save, the app compares your list
with the Site Type’s list and saves only the differences, as adjustments. Type the values themselves in the field (entries
cannot start with + or -). Clearing a field, or setting it back to match the Site Type’s list, removes your override.
Sidekick overrides can be set with PATCH /v1/site/{uuid}/sidekick, or with the sidekick field of the site update
endpoint (PUT /v1/site/{uuid}). See the API Reference. Values are strings, and an override for a list
setting takes one of these forms:
| Form | Example | Effect |
|---|---|---|
| Adjustments | +filter_color,-fbclid |
Every entry starts with + (add the entry if missing) or - (remove it). Applied left to right to the Site Type’s value. Recommended: the Site keeps receiving future updates to the defaults |
| Plain list | /wp-admin,/members |
No entry starts with + or -. Replaces the Site Type’s value entirely and will not pick up future changes to the defaults. Not accepted for nocache_query, cache_key_queries or cache_ignore_queries (the API returns 422) |
* |
* |
cache_key_queries only: cache every parameter that is not ignored, each value separately |
+/- entries with plain entries in the same value is rejected (422).Site Type has no value for a setting, adjustments are applied to Sidekick’s built-in default instead.The sidekick object you send is the Site’s complete set of overrides: it replaces what is stored, and any setting you
leave out goes back to the Site Type default. Include every override you want to keep, such as "enabled": "true".
Sending an empty object ({}), or omitting the sidekick field from PUT /v1/site/{uuid}, removes all overrides.
For example, to keep Sidekick enabled, cache WooCommerce color filter pages, and ignore one extra tracking ID:
{
"enabled": "true",
"cache_key_queries": "+filter_color",
"cache_ignore_queries": "+_branch_match_id"
}
| Goal | Setting | Override | In the app |
|---|---|---|---|
| Cache WooCommerce color filter pages | cache_key_queries |
+filter_color |
Add filter_color to Cache Key - Queries |
| Share the cached page for a tracking ID the defaults don’t know | cache_ignore_queries |
+_branch_match_id |
Add _branch_match_id to Ignored Tracking Parameters |
A plugin reads fbclid on the server |
cache_ignore_queries |
-fbclid |
Remove fbclid from Ignored Tracking Parameters |
| Never cache a plugin’s API endpoint | nocache_query |
+myplugin_api |
Add myplugin_api to No Cache Query Parameters |
| Never cache an extra private area of the site | nocache |
+/members |
Add /members to No Cache Paths |
A few notes on these examples:
-fbclid: once removed from the ignored list, fbclid falls into “anything else”, so those visits skip the cache and
reach WordPress directly. Don’t add it to cache_key_queries instead: every click carries a different value, so keying it
would create one cache entry per click.+/members: nocache paths match by prefix, so /members also covers /members/account and /membership.Regardless of the settings above, Sidekick never serves these from the cache:
Authorization header.private or no-store.For logged-in users and saved commenters, static files such as stylesheets, scripts, fonts and images are still served from the cache.
nocache path also matches beneath one leading subsite folder, so /wp-admin covers
/blog/wp-admin/... and /wp-json covers /blog/wp-json/.... On a single site, the only effect is that a path such as
/news/wp-admin also skips the cache.nocache_home covers only the network root /. A subsite’s home page (such as /blog/) is cached normally.Sidekick adds an X-Sidekick-Cache header to its responses, which you can see in your browser’s developer tools:
| Value | Meaning |
|---|---|
HIT |
Served from the Sidekick cache |
MISS |
Not in the cache yet; the response has now been stored |
BYPASS |
The request skipped the cache |
Sidekick is open source. The module’s documentation covers these topics in more depth:
nocache_query)nocache path matchingCache-Control for browsers and the CDN in each case