Finding your next read
Practical craft for people building for the web.
Explore DevelopmentFinding your next read
THE FINDERPRESS TOOL DIRECTORY
Explore this tool and check the official listing for its latest features and requirements.
01 / SOURCE DETAILS
WordPress prioritises backwards compatibility. That’s a feature. It also means every install ships with things you didn’t ask for. An emoji CDN script. An oEmbed script. A Windows Live Writer manifest (discontinued 2017). Dashicons loaded for logged-out visitors. Heartbeat polling every 15 seconds. A version tag that tells the world exactly which WordPress you’re running. None of these are bugs. They’re just not needed on most sites. Disable what you don’t need. Keep what you do. The Off Switch lets you disable each one, individually. One screen, every switch A live counter shows how many switches are on. A sticky bar keeps Save, the filter, and state chips (All / On / Off / Changed / New) in reach while you scroll. Changed switches are highlighted until you save, and an “unsaved changes” pill shows exactly what you’ve flipped before you commit. Jump between sections with live per-section counts, or copy a WP-CLI command that replicates your whole configuration on another site. Every switch card states what it removes, what it saves, and what to watch out for. Every switch is functionally verified against a live WordPress install before release — the WordPress 7.1 switches against WordPress 7.1. Bloat Remover Emoji script – ~15 KB + 1 HTTP request. Browsers handle emoji natively. Embed script – ~4 KB + oEmbed discovery links in <head> , and the endpoint other sites use to embed your posts. Embedding YouTube, Vimeo and other sites in your own content is unaffected. RSD link – Really Simple Discovery. Only needed for legacy XML-RPC clients. WLW manifest – Windows Live Writer has been discontinued since 2017. WordPress 6.3 removed this link from core — the switch matters on WordPress 6.2 and older. WP version tag – Stops advertising your WordPress version to the world. Max Image Preview Directive (WP 5.7+) – WordPress adds max-image-preview:large to the robots tag on every public page, telling search engines they may show large image previews. Remove it if you set your own robots policy. Shortlink – Removes <link rel="shortlink"> from <head> and HTTP headers. Search engines ignore it. Asset query strings – Strips ?ver= from scripts, styles, and WP 6.5+ Script Modules so CDNs and proxies cache correctly. XML-RPC – Closes a common brute-force attack vector. XML-RPC Kill Requests – Goes further than disabling: hard-kills any incoming xmlrpc.php request with a 403 before WordPress loads at all. XML-RPC Methods – A gentler alternative to the hard kill: strips every XML-RPC method, closing the unauthenticated ones — including pingback.ping — that the XML-RPC switch above leaves answering. xmlrpc.php still responds, but with nothing to call. Heartbeat API – Reduces admin polling from every 15 s to every 60 s. Dashicons (frontend) – ~35 KB (CSS + font) saved for every logged-out visitor. REST API Discovery Link – Removes <link rel="https://api.w.org/"> from <head> . Safe to remove on standard sites. RSS Feed Links – Removes feed autodiscovery <link> tags from <head> . Modern browsers no longer act on them. Leave enabled if you publish an RSS feed. Speculation Rules (WP 6.8+) – Disables the WP 6.8+ Speculation Rules API that prefetches links before users click. Can inflate analytics, increase server bandwidth, and trigger consent flows on unfetched pages. Disable All Feeds – Redirects all RSS and Atom feed URLs to the homepage. For sites with no RSS subscribers. Comment Auto-Links – Stops WordPress from converting plain-text URLs in comments into clickable links. Editor Autosave – Deregisters the autosave script that POSTs editor content to the server every 60 seconds. For teams that prefer explicit saves. DNS Prefetch – Removes all <link rel="dns-prefetch"> hints from <head> . Redundant when Emojis and Embeds are already disabled. Recent Comments Inline CSS – WordPress outputs a small inline <style> block in <head> whenever the Recent Comments widget is active. Remove it if your theme already styles the widget. Script & Style Control jQuery Migrate – ~30 KB. Modern themes don’t need it. Block Library CSS – ~7 KB loaded on every page, even with no Gutenberg blocks. Global Styles (theme.json CSS) – 10-50 KB inline CSS from block themes. SVG Duotone Filters – Hidden SVG blob injected on every page, even with no duotone images. WordPress 6.3 made duotone output on-demand — the switch matters on WordPress 6.2 and older. Script/Style type attributes – type="text/javascript" and type="text/css" are redundant in HTML5. Only older themes still emit them; themes with HTML5 support already don’t. Off by default. Defer non-critical JavaScript – Adds defer so scripts don’t block HTML parsing. jQuery is never deferred. Move scripts to footer – Relocates enqueued scripts from <head> to just before </body> . jQuery is never moved. Template Output Buffering (WP 7.0) – Since WordPress 7.0, classic themes get every frontend page buffered in memory in full and re-parsed before a single byte reaches the visitor, so late-printed block styles can be hoisted into <head> . Turning the buffer off restores streamed output for faster TTFB and lower peak memory. Block themes are unaffected. WordPress Behaviour Tweaks Self-pingbacks – WordPress pings your own posts when you link between them – a wasted HTTP request that creates an unwanted comment on the target post. Capital P filter – WordPress corrects “WordPress” to “WordPress” on every rendered string. Remove if you don’t need the autocorrect. Smart Quotes (wptexturize) – WordPress runs a regular-expression pass over every title, excerpt, comment and block of content to turn straight quotes and hyphens into typographic ones. Remove it if you write your own punctuation or output code and markup that the conversion mangles. Limit post revisions – WordPress stores unlimited revisions per post. Caps revisions at 3 to prevent silent database growth on active editorial sites. Attachment pages – WordPress creates a full template page for every uploaded file. These waste crawl budget on most sites. Sends a 301 redirect to the parent post instead. Comments – Closes all comments and pingbacks site-wide, hides existing comments on the frontend, skips the theme’s comments template and comment-reply.js, and removes comment-related UI from wp-admin (Comments menu, admin bar node, dashboard widget). Enable only if your site does not use comments. Search – Redirects all WordPress search queries ( /?s= ) to the homepage with a 301, preventing bots from triggering repeated database queries. Also removes search forms rendered via get_search_form() . Hardcoded forms in theme templates are not affected. oEmbed Provider – WordPress registers a REST endpoint at /wp-json/oembed/1.0/embed so other sites can embed your content via the oEmbed protocol. Remove it if you don’t want your content embeddable externally. Does not affect your ability to embed others’ content. Widgets – Unregisters every widget area and removes the Appearance → Widgets screen, the admin bar entry and the Customizer panel. Nothing is deleted: switch it back off and every widget returns. Block themes register no widget areas, so this one is for classic themes. Post via Email – Removes the Post via Email configuration from Writing Settings and disables the feature. Almost no modern site uses email-to-post. Update Services (Ping-o-Matic) – Removes Update Services from Writing Settings and stops outbound pings to weblog ping services on every published post. Native XML Sitemap (WP 5.5+) – Disables WordPress’s built-in XML sitemap generator. Most sites use external SEO plugins (Yoast, Rank Math) for sitemaps instead. Removes unnecessary redirects and reduces crawl overhead (default OFF). oEmbed Auto-Embed – Disables WordPress from regex-scanning post content for [embed] shortcodes and oEmbed patterns on every frontend page load. For sites that do not embed external content, removing this filter saves processing overhead (default OFF). Database & Query Expired Transients – Schedules a daily cleanup of expired transient rows in wp_options. Useful on low-traffic sites where WP-Cron can go days without firing. Abandoned Auto-Drafts – WordPress creates an auto-draft every time the post editor opens. Abandoned sessions leave these rows permanently. Runs a daily sweep to delete auto-drafts older than 30 days. Skip Row Count on Singles – On every single post or page, MySQL runs SQL_CALC_FOUND_ROWS to count total matching rows – a full index scan only needed for paginated archives. Removes that sub-query on all singular views. Adjacent Post Links – Older WordPress queries the previous and next post on every single post page to output <link rel="prev/next"> in <head> — two extra DB queries per page load. Google dropped support for these hints in 2019, and modern WordPress no longer outputs them; the switch matters on older installs. Reduce Trash Retention – WordPress keeps trashed items for 30 days before permanent deletion. A daily sweep permanently deletes posts and comments trashed more than 7 days ago, keeping wp_posts leaner on active editorial sites without affecting normal recovery workflows. Image Performance Google Fonts display:swap – Without font-display:swap , the browser hides text while your Google Font downloads (FOIT). Adds display=swap to every Google Fonts URL so visitors see text immediately. Add missing image dimensions – Images without width and height attributes cause layout shifts (CLS). WordPress 5.5 and later add them to content images itself, so this only matters on older WordPress. Marked legacy; off by default. LCP image priority – Adds fetchpriority="high" to the first content image and fetchpriority="low" to the rest. WordPress 6.3+ already prioritises the likely LCP image using the whole page, so this is off by default — enable it only if you’ve measured a gain. Lazy load images – Lazy-loads every content image after the first. WordPress 5.5+ lazy-loads images itself and, since 6.3, keeps the first three eager so a hero lower down
02 / SOURCE DETAILS
Upload wp-avoid-slow to /wp-content/plugins/ Activate through the Plugins menu Go to Settings -> Off Switch Turn off what you don’t need
03 / SOURCE DETAILS
Will this break my site? Each toggle is independent. Safe defaults are on. Risky ones (jQuery Migrate, defer JS, scripts to footer) are off by default. If something breaks – turn that toggle off. Nothing is written to disk. Does it work on managed hosting (WP Engine, Kinsta, Pressable)? Yes. Pure PHP hooks, no .htaccess required. Should I disable XML-RPC? Only if you don’t use Jetpack, the WordPress mobile app, or any XML-RPC client. When in doubt, leave it off. Should I enable “Defer non-critical JavaScript” or “Move scripts to footer”? Test on staging first. These two are the most likely to cause issues on complex sites – some themes and plugins rely on scripts being available synchronously in <head> . Can I manage the switches from the command line? Yes, with WP-CLI. wp off-switch list shows every switch and whether it is on (filter with --status=on , --module=woocommerce , or --format=json ). wp off-switch enable <key>... and wp off-switch disable <key>... flip individual switches, and wp off-switch disable --all puts WordPress back to stock. wp off-switch export prints your whole configuration as JSON, ready to import on another site with wp option update . Does it cache pages? No. This plugin removes unused WordPress features. For page caching, use a dedicated plugin. Does it work on WordPress Multisite? Not currently. The plugin is designed and tested for single-site WordPress installs. Multisite support is planned for a future release. Does it work with WooCommerce? Yes. When WooCommerce is active, a WooCommerce section appears in Settings -> Off Switch with 10 dedicated toggles for removing WooCommerce frontend overhead. None of the core toggles touch WooCommerce – each module is independent. How do I disable emojis in WordPress? Enable the Emoji Script toggle under Bloat Remover. It removes the emoji CDN script (~15 KB + 1 HTTP request) — modern browsers render emoji natively without it. How do I disable the Heartbeat API in WordPress? Enable the Heartbeat API toggle. It reduces admin polling from every 15 seconds to every 60 seconds. For most sites the difference is invisible to editors. Does it work alongside caching plugins like WP Rocket, LiteSpeed Cache, or W3 Total Cache? Yes. This plugin removes features at the WordPress hook level before caching plugins run. Use both — they do different jobs. This plugin removes unnecessary output; a caching plugin stores and serves the result. How is this different from other performance plugins? Most performance plugins add things – caching layers, CDN routing, minification pipelines. This one removes things. It’s a different job.
KEEP EXPLORING