
Short answer: the “Autoloaded options could affect performance” warning means WordPress is loading a large amount of option data at the beginning of requests. Do not respond by deleting the largest rows. Measure the total, identify who owns each option, determine whether it is needed on most requests, take a recoverable snapshot, and change only the options you can justify.
WordPress added this Site Health check because autoloaded data can quietly grow as themes and plugins are installed, reconfigured, or removed. The warning appears when the total autoloaded footprint crosses the threshold used by WordPress. It identifies avoidable work, but it does not tell you which option is safe to change.
WordPress stores site configuration in the wp_options table. The table prefix may be different on your installation. Some options are marked for autoloading, which lets WordPress retrieve a collection of commonly needed settings early in the request instead of issuing a separate query for every value.
Autoloading is useful for small settings required on most pages: the site URL, active plugin list, theme settings, widget configuration, rewrite rules, and other runtime configuration. The problem begins when large or rarely used data joins that collection. An admin-only report, expired cache, abandoned plugin configuration, or unbounded log does not need to occupy memory on every unrelated frontend, REST, AJAX, admin, and cron request.
WordPress 6.6 introduced new autoload values and logic for large options. It also added a Site Health warning when the total autoloaded data exceeds 800 KB. The official WordPress Core development note explains why unnecessary autoloaded data can affect performance and why developers should choose the autoload behavior deliberately.
The warning proves that the measured footprint crossed a WordPress threshold. It does not prove that autoloaded options are the only reason a site is slow. A page can also wait on PHP work, a remote API, uncached database queries, a page builder, an overloaded server, browser JavaScript, fonts, or large images.
Treat the warning as an actionable diagnostic lead:
Start with the total byte size and rank individual options by their stored size. The number of rows is useful context, but 1,000 tiny values can be lighter than one multi-megabyte serialized array. Focus first on the largest contributors and the cumulative footprint.
Record at least:
Names often contain a plugin or theme prefix, but naming is only a clue. Search the active codebase for calls that read or update the option. Check the plugin’s documentation and uninstall behavior. An unfamiliar name is not automatically abandoned, and a deactivated plugin’s option is not automatically safe to delete.
Classify each candidate as WordPress core, active plugin, inactive plugin, active theme, previous theme, custom code, or unknown. Unknown options should receive more investigation, not more confidence.
The right question is not “Is this value large?” It is “Does normal WordPress execution need this value on most requests?”
| Observed use | Likely decision | Reason |
|---|---|---|
| Small setting read on nearly every frontend request | Keep autoloaded | Avoiding repeated individual retrieval can be beneficial. |
| Large configuration used only on one admin screen | Consider offloading | It can still be retrieved when that screen needs it. |
| Active plugin data with uncertain access patterns | Investigate or keep | Guessing can break runtime behavior. |
| Confirmed orphan from a removed plugin | Consider deletion after backup | Deletion is appropriate only after ownership and non-use are established. |
| Logs, queues, or an expanding cache stored in one option | Fix the source design | Offloading reduces broad request weight but does not stop unbounded growth. |
Changing an option from autoloaded to non-autoloaded leaves its value in the database. Code using get_option() can still retrieve it when needed. That makes offloading a narrower and usually more reversible experiment than deleting the row.
Deletion is a different decision. It removes the stored value and may cause a plugin to lose configuration, regenerate defaults, reschedule work, or fail. Do not combine “stop loading this everywhere” with “erase this data” as if they were the same operation.
Do not modify dozens of uncertain options in one operation. Start with one or a small group of high-confidence candidates. Record exactly what changed, clear the relevant WordPress and persistent object caches through supported APIs, then test the workflows owned by those options.
Re-run Site Health and recalculate the autoloaded footprint. Repeat the same requests used for the baseline with comparable cache state, user role, URL and input. Check:
A smaller footprint is evidence that the database state changed. Stable workflows and improved request measurements are evidence that the change was useful.
The fastest investigation is a two-pass audit. The first pass establishes scale: total bytes, largest rows, growth since the last measurement, and whether the warning occurs on production, staging, or both. The second pass establishes meaning: ownership, read frequency, regeneration behavior, and business consequence. Keeping those passes separate prevents a common error—treating a list sorted by size as a deletion list.
If you are comfortable with SQL, run read-only queries through a trusted database tool or WP-CLI. On current WordPress versions, multiple values can mean that an option participates in autoloading, so do not assume that only the literal value yes matters. Use WordPress APIs or the current core function that defines accepted autoload values when constructing an inventory.
SELECT option_name,
LENGTH(option_value) AS stored_bytes,
autoload
FROM wp_options
ORDER BY stored_bytes DESC
LIMIT 50;This query is deliberately broad: it shows the largest rows before applying an autoload interpretation. Replace wp_ with the real table prefix. Do not paste an UPDATE or DELETE version into production. The result still needs WordPress-version context, owner research, and functional testing.
Next calculate the aggregate using the autoload values recognized by the installed WordPress release. Compare the database number with Site Health or a WordPress-aware tool. A discrepancy can reveal a stale cache, an incorrect SQL filter, a different table prefix, or a Multisite scope mistake.
Store raw bytes in the audit record, then display kilobytes or megabytes for people. Avoid rounding too early: several values shown as “0.1 MB” may differ substantially. Also distinguish stored bytes from PHP memory. A serialized value can occupy more memory after WordPress retrieves and unserializes it, especially when it contains large nested arrays and strings. Database size is therefore a consistent comparison measure, not a promise of exact runtime memory cost.
For every option that materially contributes to the total, create a short evidence record. A useful dossier answers six questions:
add_option(), update_option(), settings APIs, migrations, and vendor-specific storage wrappers.get_option(), but account for dynamically assembled names and wrappers.Search both active and inactive plugin directories when available. An option may belong to code that is currently deactivated, and custom deployment tooling may live outside the normal plugin directory. For commercial plugins whose source is encoded or unavailable, consult the vendor and test a cloned site. “No search result” means ownership is unresolved, not that the row is unused.
| Decision | What changes | Main risk | Verification |
|---|---|---|---|
| Keep autoloaded | Nothing | Ongoing broad request cost | Confirm frequent use and acceptable footprint |
| Stop autoloading | Loading strategy only | Extra query/cache lookup where used | Test owning paths and total footprint |
| Replace or split data | Owner’s storage design | Migration and compatibility errors | Versioned migration, rollback, load test |
| Delete data | Value is removed | Lost settings or repeated initialization | Restore test and owner-specific regression |
These are not interchangeable optimizations. A frequently read 900 KB value may need a redesign rather than simply setting autoload off. A 300 KB abandoned cache may be safe to delete after proof. A small but rapidly growing log may deserve urgent source remediation even though removing it barely changes today’s warning.
Pick a low-risk traffic window, confirm monitoring, and write down the exact acceptance criteria. Include the expected byte reduction, the workflows that must continue, the maximum acceptable latency on the option’s owning screen, and the rollback trigger. Export the selected option names, values, and autoload states separately from the general backup so a narrow reversal is possible.
If you use runtime access tracking, warm the site normally first, then exercise anonymous pages, logged-in pages, wp-admin, checkout, REST, AJAX, CLI, cron, and integrations relevant to the candidate. A short quiet tracking window can incorrectly label valid options as unused. Seasonal and monthly jobs require code evidence or longer observation because waiting for them in staging may be impractical.
Use a WordPress-aware interface that updates the option and invalidates its individual and aggregate caches. Record the operator, time, previous state, new state, and reason. Avoid simultaneous plugin updates or deployments; otherwise a regression cannot be attributed cleanly.
Run the verification once with normal warm caches and once after a controlled cache clear. A change may appear successful because an old object-cache value remains available. Conversely, the first request after invalidation may be slower while caches rebuild. Measure enough requests to distinguish a one-time rebuild from steady-state behavior.
Keep immediate smoke tests short, but retain the rollback data through at least one meaningful cycle: a scheduled synchronization, daily report, renewal, backup, checkout, or editorial publish. Review logs for warnings about missing array keys, invalid settings, repeated database writes, or options being recreated with their former autoload state.
A membership site receives the Site Health warning and finds one reporting option responsible for 2.4 MB of the total. The name belongs to an active analytics plugin. The value contains daily aggregates for the plugin’s admin dashboard; code search shows it is read only when that report screen loads, while a nightly job updates it.
The team first clones production to staging and captures the option plus the complete database. Deleting the row makes the plugin rebuild months of aggregates, causing a long cron job, so deletion is rejected. They change only the autoload behavior through a WordPress-aware tool. Anonymous pages, member login, account pages, checkout, REST, and cron all pass. The analytics screen performs one cached lookup and remains within its response-time budget.
After a cold-cache test and two nightly aggregation cycles, the option remains non-autoloaded and the Site Health warning clears. The team documents the plugin version and alerts on future size growth. The outcome is defensible because it connects ownership, access pattern, business behavior, and measurement; the same 2.4 MB size without those facts would not justify the change.
If reducing autoloaded data produces little measurable improvement, do not keep deleting rows to force a dramatic result. Compare server timing with browser timing and inspect slow database queries, remote HTTP waits, PHP worker queues, cron overlap, object-cache health, page-builder workloads, and frontend asset delivery. The autoload warning can be worth fixing while another bottleneck still dominates user experience.
Prioritize by breadth and consequence. Autoload overhead affects many PHP requests, so a safe reduction has broad value. But a five-second remote API timeout on checkout or saturated PHP pool may deserve the first incident response. A good performance plan can hold both facts at once.
Close the work with a record that another administrator can use months later. Include the Site Health message, WordPress and PHP versions, database prefix and environment, total autoloaded bytes before and after, selected option names and sizes, ownership evidence, runtime paths tested, cache state, monitoring window, and the location of the recoverable snapshot. Record options that were investigated but deliberately retained so the same research is not repeated during the next audit.
For each changed value, note whether the action was an autoload toggle, owner-level redesign, or deletion. Link links to any vendor ticket or code change. State the precise rollback trigger and whether rollback was rehearsed. If a plugin update later restores the old behavior, this record turns an unexplained regression into a quick comparison.
Finally, set a follow-up measurement rather than a permanent “fixed” label. Review the total after the next major plugin rollout and on a regular interval appropriate to the site’s change rate. A stable brochure site may need infrequent checks; a store with many integrations needs closer observation. The goal is controlled growth and explainable decisions, not a magic byte count.
WPStack Autoloaded Options Manager packages this workflow inside WordPress. It shows real byte sizes, attributes likely ownership, highlights large contributors, and integrates with Site Health. Its Safety Analyzer combines time-limited runtime access tracking with static code inspection to classify candidates as Safe, Caution, or Keep.
The plugin creates a snapshot before toggles, bulk actions, deletions, and restores. It also invalidates per-option and aggregate WordPress caches when an autoload state changes, including sites using persistent Redis or Memcached object caches.
A practical sequence is:
The tool reduces guesswork; it does not eliminate the need for judgment. Static scanning cannot understand every dynamic option name, custom loader, or external integration. Runtime tracking can only observe workflows exercised during the tracking window.
No. It is the WordPress Site Health threshold for raising attention, not a universal latency boundary. Hardware, cache configuration, traffic, PHP workers, and request behavior affect the observed cost.
Not automatically. Confirm ownership, decide whether the plugin may be reactivated, review its retention policy, and take a backup. Offloading and deletion solve different problems.
get_option()?No. The value remains available through get_option(). WordPress retrieves it when requested instead of including it in the broadly loaded collection.
No. Persistent object caching can reduce repeated database work, but unnecessary data can still consume cache and PHP memory and must still be loaded into the request when WordPress builds the option collection.
No. Dynamic names, custom code, conditional workflows, and external integrations limit automated certainty. Use ownership, static evidence, runtime observation, staging, snapshots, and functional testing together.
Compare the new inventory with the previous one. Identify which option grew or appeared, then correct the plugin or workflow generating the data. Repeated manual cleanup is not a substitute for fixing unbounded storage.
wp_autoload_values_to_autoload()
Aditya Bhimrajka is a technology entrepreneur, product strategist, and software solutions expert with over a decade of experience building scalable web and mobile applications. His expertise spans SaaS, AI, cloud technologies, custom software development, and digital transformation. Passionate about solving real-world business challenges through technology, Aditya shares practical insights on WordPress, plugins, software development, startup growth, product strategy, and emerging technologies. At WPStack, he writes actionable, experience-driven content that helps developers, businesses, and website owners build secure, high-performing, and future-ready WordPress solutions.