Settings Reference
Every setting, where it appears in the admin, its key, and its default. Defaults and allowed values come from src/Core/Settings.php; labels come from src/Admin/AdminModule.php. This page lists what each setting is. The linked feature pages explain how to use it.
How settings are stored
- One option. Everything lives in
gt_performance_settings, which is not autoloaded. Keys the plugin does not declare are dropped on save. - Compiled on save. Each save writes two runtime files under
wp-content/cache/gt-performance/:config.json, which the page-cache drop-in reads, andredis-config.json, which the Redis drop-in reads. Both are authenticated encrypted JSON keyed fromAUTH_KEY, never PHP. If they cannot be written, the save is refused, the previous settings are kept, and the old runtime files are removed where possible so the drop-ins fall back to plain WordPress instead of running on a stale configuration. - Secrets are encrypted. The Cloudflare token and Global API Key, the Redis password and the xCloud token are stored encrypted. Leaving one of those fields blank keeps the saved value.
- Cache-relevant saves change every cache key. A save that changes a setting reaching cached pages increments
generation, which is part of each cache key, so previously stored pages stop matching. Such a save made in wp-admin also purges the origin cache, which purges Cloudflare (this site’s hostnames) and xCloud when they are connected and queues a warm run when warming is on. Saves that change only output-neutral settings (credentials, connection status, warming, background work and admin-only settings) purge nothing; the list is on Page Cache. - Changes are recorded. A save that changes any non-secret setting records the values it replaced. The last 20 revisions, up to 90 days old, can be compared and restored from Tools or
wp gt-performance config. - Constants win. Some values can be set in
wp-config.phpinstead. See Constants Reference.
Settings save from one form per tab. A tab submits only its own fields; everything else keeps its saved value.
Admin tabs
The screen is the top-level GT Performance menu, at wp-admin/admin.php?page=gt-performance&tab=<slug>. It requires the manage_options capability.
| Tab | Slug | Stores settings |
|---|---|---|
| Dashboard | dashboard | No. Status cards, current configuration (including the cache mode), recommended next step, quick operations |
| Setup | setup | Partly. Six setup steps; Save cache mode saves cache.enabled and cache.mode, and the Cloudflare step saves cloudflare.api_token and cloudflare.domain. See Setup |
| Page Cache | cache | Yes |
| Optimization | optimization | Yes |
| CSS Status | css-status | No. Unused CSS build results, regeneration, and Fetch important CSS classes. See CSS Optimization |
| Exceptions | exceptions | Yes |
| Cloudflare | cloudflare | Yes |
| CDN | cdn | Yes |
| Object Cache | object-cache | Yes |
| Database | database | Yes |
| Integrations | integrations | Yes |
| AI & MCP | ai | Yes |
| Tools | tools | No. Runtime status, Explain this page, health report, warming, purge receipts, settings history and export/import, background queue. See Tools |
List fields (paths, cookies, parameters, patterns) take one entry per line. Commas also separate entries, except in Selector safelist, where each line is one pattern.
Page Cache

| Label | Key | Default | Values and notes |
|---|---|---|---|
| Enable origin page cache | cache.enabled | true | In store mode, stores nothing until the drop-in is installed and WP_CACHE is on |
| Cache mode | cache.mode | store | store (Store pages: GT Performance serves them) or optimize (Optimize only: my host already caches pages). See Page Cache |
| Separate cache for mobile HTML | cache.separate_mobile | false | Adds a mobile variant to the cache key and sends Vary: Accept-Encoding, User-Agent |
| Fresh cache lifetime | cache.fresh_ttl | 3600 | Seconds. Sent as s-maxage |
| Stale cache retention | cache.stale_ttl | 86400 | Seconds past fresh. Sent as stale-while-revalidate |
| Stale-on-error window | cache.stale_if_error | 86400 | Seconds. Sent as stale-if-error; 0 omits it |
| Browser cache lifetime | cache.browser_ttl | 300 | Seconds. Sent as max-age |
| Cache clearing after publishing | cache.post_publish_purge | related | related, post, all, none |
| Warm cache after a full purge | cache.preload | true | Also gates stale-page rebuilds and the preloads of every warm run |
| URLs per warming batch | cache.preload_max_urls | 200 | 0 to 2000. 0 stops preloading without turning caching off |
| Sitemap sources | cache.preload_sitemaps | empty | Up to 10 sitemap URLs on this site. Empty uses /wp-sitemap.xml plus sitemaps listed in robots.txt |
The One-click presets fill the four lifetime fields; you still save. Maximum impact is 1 h fresh, 24 h stale, 24 h stale-on-error, 5 min browser. Balanced is 30 min, 12 h, 24 h, 5 min. Frequently updated is 5 min, 1 h, 6 h, 5 min.
See Page Cache, Purging and Cache Warming.
Optimization
Unused CSS

| Label | Key | Default | Values and notes |
|---|---|---|---|
| Remove unused CSS | css.enabled | false | GTPERF_UNUSED_CSS forces it on |
| CSS delivery | css.mode | file | file (Generated file), inline (Inline all used CSS), hybrid (Critical inline + remaining file) |
| Hybrid inline CSS limit | css.critical_budget | 14336 | Bytes, 2048 to 51200 |
| Preserve dynamic states | css.keep_dynamic_states | true | |
| Staged rollout | css.rollout_percent | 100 | 0, 10, 25, 50 or 100. 0 serves original CSS only |
See CSS Optimization.
JavaScript
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Minify local JavaScript | javascript.minify | false | No JavaScript files are written |
| Defer safe JavaScript | javascript.defer | false | |
| Delay selected third-party scripts | javascript.delay | false | Delays scripts matching Scripts to delay until the first pointer, key or touch event, or five seconds |
Images and embeds
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Lazy-load non-critical images | media.lazy_load | true | |
| Add missing image dimensions | media.add_dimensions | true | |
| Images to load immediately | media.critical_images | 2 | 0 to 10, counted from the top of the page |
| Hero image rules | media.hero_rules | empty | One scope => target [preload] rule per line. Invalid lines are dropped on save; the first 30 are used |
| Generate optimized variants | media.optimize_uploads | false | |
| Serve optimized image variants | media.rewrite_variants | false | |
| Generated format | media.format | webp | webp, avif |
| Image quality | media.compression | 82 | 30 to 100 |
| Lightweight YouTube previews | media.youtube_previews | false |
Hero rule scopes are *, front_page, post_type:<type> and template:<template>. Targets are attachment:<ID>, .<image class> and url:<background image URL>. See Media, Fonts and Embeds.
Speculative loading
Shown only when WordPress provides core speculative loading.
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Speculative loading | speculation.mode | core | core (WordPress default, with safety exclusions), conservative (prefetch only when a link is pressed), off |
When the Speculative Loading plugin is active, it controls the mode and GT Performance adds only its exclusions. See Media, Fonts and Embeds.
Fonts
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Self-host Google Fonts | fonts.self_host_google | false | |
| Font display | fonts.font_display | swap | swap, fallback, optional, block |
WordPress quick toggles
All false by default.
| Label | Key |
|---|---|
| Disable WordPress emoji assets | bloat.disable_emojis |
| Disable Dashicons for visitors | bloat.disable_dashicons |
| Disable WordPress embeds | bloat.disable_embeds |
| Disable XML-RPC | bloat.disable_xmlrpc |
| Remove RSD link | bloat.remove_rsd_link |
| Remove jQuery Migrate for visitors | bloat.remove_jquery_migrate |
| Remove WordPress version | bloat.hide_wp_version |
| Remove shortlink | bloat.remove_shortlink |
| Disable every RSS feed | bloat.disable_rss_feeds |
| Disable secondary feeds only | bloat.disable_secondary_feeds |
| Remove every RSS feed link | bloat.remove_feed_links |
| Remove secondary RSS feed links | bloat.remove_secondary_feed_links |
| Disable self pingbacks | bloat.disable_self_pingbacks |
| Remove REST API links | bloat.remove_rest_api_links |
| Disable Google Maps | bloat.disable_google_maps |
| Disable password strength meter | bloat.disable_password_strength_meter |
| Remove comment author URLs | bloat.remove_comment_urls |
| Add a blank fallback favicon | bloat.blank_favicon |
| Remove global styles | bloat.remove_global_styles |
| Load separate core block styles | bloat.separate_block_styles |
Apply site baseline checks the first eight, the two secondary-feed toggles, and self pingbacks, REST API links, Google Maps, password strength meter and comment author URLs. It unchecks the other five: every RSS feed, every feed link, blank favicon, global styles and separate block styles. Clear quick toggles unchecks all twenty. Neither saves until you do.
Editor, comments, and APIs
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Heartbeat behavior | bloat.heartbeat_mode | reduce | default, reduce, disable_dashboard (disable outside the editor), disabled |
| Heartbeat interval | bloat.heartbeat_seconds | 60 | 15 to 120 seconds. Applies in reduce mode |
| Autosave interval | bloat.autosave_interval | 60 | 15 to 3600 seconds. Not applied when AUTOSAVE_INTERVAL is already defined, for example in wp-config.php |
| REST API access | bloat.disable_rest_api | default | default (keep enabled), non_admin (administrators only), disabled |
| Disable comments | bloat.disable_comments | false |
Autosave interval is applied by defining AUTOSAVE_INTERVAL during plugins_loaded, before WordPress core defines its own 60-second default, and only when the value is not 60 and nothing has defined the constant yet. A value in wp-config.php wins.
Diagnostics
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Diagnostic logging | debug | false | Keeps the last 100 redacted log entries in the gt_performance_diagnostic_log option. Also sends X-GT-Cache-Reason on bypassed and uncacheable responses, X-GT-Cache-Key on cache hits, and, when a JavaScript option is on, an HTML comment before </body> listing each script decision |
| Remove all data when the plugin is deleted | remove_data_on_uninstall | false | Off keeps settings, including saved Redis credentials, after the plugin is deleted |
See Diagnostics.
Exceptions

| Label | Key | Default |
|---|---|---|
| Paths that must stay dynamic | cache.bypass_paths | /wp-admin/, /wp-login.php, /wp-cron.php, /wp-json/, /xmlrpc.php |
| Cookie prefixes that bypass cache | cache.bypass_cookies | comment_author_, wordpress_logged_in_, wordpress_no_cache, wp-postpass_ |
| Never cache query parameters | cache.bypass_query_params | add-to-cart, customize_changeset_uuid, elementor-preview, fluent-cart, preview, s, wc-ajax, gtperf_verify, gtperf_safe_mode, gtperf_css_preview, gtperf_css_build, gtperf_js |
| Cache each value separately | cache.vary_query_params | empty |
| Parameters that do not change content | cache.ignored_query_params | fbclid, gclid, gbraid, msclkid, utm_campaign, utm_content, utm_medium, utm_source, utm_term |
| Selector safelist | css.safelist | empty |
| Excluded stylesheets | css.excluded_stylesheets | empty |
| Never optimize scripts | javascript.exclusions | empty |
| Scripts to delay | javascript.delay_patterns | clarity.ms, connect.facebook.net, google-analytics.com, googletagmanager.com, hotjar.com |
| Lazy-render selectors | media.lazy_render_selectors | empty |
| Google Maps path exceptions | bloat.google_maps_exclusions | empty |
Paths match whole URL segments, cookie entries match name prefixes, and parameter names match exactly. Ignored parameters are removed from the cache key, so the page is still cached. Parameters cached separately stay in the key: each value up to 100 characters gets its own copy, up to 100 per page (see Page Cache). Safelist lines are partial matches unless written as a delimited regular expression; an invalid expression is not saved and the save shows which ones were rejected. Active commerce integrations add their own bypass rules on top of these lists. See Cache Exclusions and Commerce Safety.
Cloudflare
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Enable Cloudflare integration | cloudflare.enabled | false | Also turned on by a successful sync |
| Authentication | cloudflare.auth_mode | token | token (scoped API token), global (Global API Key) |
| Scoped API token | cloudflare.api_token | empty | Encrypted |
| Global API Key | cloudflare.global_api_key | empty | Encrypted |
| Cloudflare account email | cloudflare.email | empty | Needed only with the Global API Key |
| Domain | cloudflare.domain | empty | Used to find the zone when Zone ID is blank. Falls back to the home URL’s host |
| Zone ID | cloudflare.zone_id | empty | Saved automatically after the zone is found |
| Cloudflare edge cache lifetime | cloudflare.edge_ttl | 0 | 0 to 31536000 seconds. 0 respects the origin’s Cache-Control; a positive value overrides origin freshness in the managed rule |
Changing these saves local settings only. Run Connect/sync Cloudflare to update the managed rule. See Cloudflare.
CDN
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Enable CDN URL rewriting | cdn.enabled | false | |
| CDN URL | cdn.url | empty | HTTPS only. A hostname, optionally with a port and a path |
| Files served by the CDN | cdn.file_types | css, js, mjs, jpg, jpeg, png, gif, webp, avif, svg, ico, woff, woff2, ttf, otf, eot | Also selectable: mp4, webm, mp3, ogg, wav, pdf, zip |
See CDN.
Object Cache
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Enable Redis object cache | redis.enabled | false | |
| Redis host or socket | redis.host | 127.0.0.1 | Hostname, IP, or Unix socket path. A redis:// or tls:// prefix is removed |
| Redis port | redis.port | 6379 | 0 to 65535. 0 with a socket |
| Redis database number | redis.database | 0 | 0 to 255 |
| Redis username | redis.username | empty | ACL username |
| Redis password | redis.password | empty | Encrypted |
| Use TLS | redis.tls | false | |
| Reuse Redis connections | redis.persistent | true | |
| Cache key prefix | redis.prefix | empty | Letters, digits, :, _, -. Empty uses an automatic per-site prefix |
| Connection timeout | redis.connection_timeout | 0.5 | 0.1 to 10 seconds |
| Read timeout | redis.read_timeout | 0.5 | 0.1 to 10 seconds |
GTPERF_REDIS_* and WP_REDIS_* constants override these at runtime. See Redis Object Cache.
Database
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Schedule database cleanup | database.enabled | false | |
| Cleanup schedule | database.schedule | weekly | daily, weekly, monthly. The first run is one hour after the schedule is set |
| Scheduled revisions to retain | database.retain_revisions | 5 | 0 to 100 per post. Applies to scheduled runs and wp gt-performance database run; the admin’s manual run and --all-revisions delete every revision |
| Scheduled tasks | database.tasks | revisions, auto_drafts, spam_comments, trashed_posts, trashed_comments, expired_transients, optimize_tables | all_transients is also a valid task, but the form offers it only for manual cleanup |
The manual cleanup panel on the same tab runs the tasks you tick in the background and saves nothing. See Database Cleanup.
Integrations
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Automatic conflict protection | integrations.auto_protection | true | |
| Perfmatters ownership | integrations.perfmatters_owner | automatic | automatic (per feature), gt_performance, perfmatters |
| Enable xCloud cache integration | xcloud.enabled | false | |
| xCloud site domain | xcloud.domain | empty | Empty uses the home URL’s host |
| xCloud site UUID | xcloud.site_uuid | empty | Found and saved by Connect/refresh xCloud |
| xCloud API token | xcloud.api_token | empty | Encrypted. Needs the read:sites and write:sites scopes |
| Protect Akismet assets | integrations.akismet | true | |
| Jetpack compatibility | integrations.jetpack | true | |
| FluentCart | commerce.fluentcart | true | Applies only while FluentCart is active |
| Easy Digital Downloads | commerce.edd | true | Applies only while EDD is active |
| WooCommerce | commerce.woocommerce | true | Applies only while WooCommerce is active |
Connect/refresh xCloud appears once the integration is enabled and saved. It also writes read-only status keys: xcloud.server_id, site_id, dashboard_url, stack, page_cache_enabled, page_cache_source, redis_enabled, object_cache_pro, free_edge_cache_enabled, enterprise_available, enterprise_requests, enterprise_edge_requests, enterprise_hit_percent and checked_at.
Switching on Cloudflare, xCloud, the CDN, automatic conflict protection or Redis fills related fields in the form with recommended values (text and number fields only when empty). Nothing is stored until you save.
See Integrations, xCloud and Commerce Safety.
AI & MCP
| Label | Key | Default | Values and notes |
|---|---|---|---|
| Agent access | agents.mode | off | off, read (read-only), operate (read and operate). Shown when the Abilities API is available (WordPress 6.9+) |
| Enable the AI adviser | advisor.enabled | false | Shown when the WordPress AI Client is available (WordPress 7.0+) |
| Provider | advisor.provider | empty | Empty uses the first AI provider configured in WordPress |
See AI and MCP.
Keys without a form field
| Key | Default | Notes |
|---|---|---|
generation | 1 | Incremented by a save that changes a setting reaching cached pages. Part of every cache key |
cache.entry_budget | 5000 | 0 to 200000; 0 means no limit. Hourly garbage collection evicts the oldest entries above it, and warm runs stop when they reach it. Change it with a settings export, edit and import |
cloudflare.drift_hash | empty | Written by Cloudflare sync to record which cache policy the managed rule was built from |
Per-page options
The editor sidebar of every public post type has a GT Performance box. Its values are post meta, not part of gt_performance_settings, and apply to newly cached copies of that page.
| Label | Meta key | Values |
|---|---|---|
| Don’t cache this page | _gtperf_no_cache | 1 when ticked. The page is never stored or optimized; in store mode it is sent no-store and Explain reports page-option. See Page Cache |
| Use original CSS | _gtperf_original_css | 1 when ticked. The page keeps its full stylesheets and no unused-CSS build is queued for it |
| JavaScript on this page | _gtperf_javascript | Empty (site settings), no_delay (do not delay scripts), off (do not defer or delay scripts) |
| Hero image | _gtperf_hero | A hero target (attachment:<ID>, .<class> or url:<URL>), optionally followed by preload. Overrides the site’s hero rules |
Export, import and restore
Settings export, import and restore carry the non-secret values on this page, with these exceptions, which are never exported, imported or restored:
generationagentsandadvisorredisandxcloudcloudflare.enabled,cloudflare.auth_mode,cloudflare.domain,cloudflare.zone_id- credentials and
remove_data_on_uninstall, which never leave the site
Keys whose names look like credentials are left out too, with one reviewed exception: bloat.disable_password_strength_meter is a quick toggle, not a secret, and is exported, imported and restored like any other setting.