{"id":312481,"date":"2026-05-30T09:58:17","date_gmt":"2026-05-30T09:58:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/blockbuster\/"},"modified":"2026-05-30T10:26:39","modified_gmt":"2026-05-30T10:26:39","slug":"zero-blocks-given","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/zero-blocks-given\/","author":13709789,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.2","stable_tag":"1.2.2","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Zero Blocks Given","header_author":"MythThrazz","header_description":"Disable WooCommerce \/ WP block frontend output at the code level. Four tiers (patterns \/ blocks \/ all \/ nuclear). Tiny <dialog> settings on the Plugins screen, no paywall.","assets_banners_color":"3b372d","last_updated":"2026-05-30 10:26:39","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/marcindudek.dev\/","header_plugin_uri":"","header_author_uri":"https:\/\/marcindudek.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":90,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.2":{"tag":"1.2.2","author":"MythThrazz","date":"2026-05-30 10:26:39"}},"upgrade_notice":{"1.2.0":"<p>First public release. Configure with the <code>ZEROBLG_MODE<\/code> constant in <code>wp-config.php<\/code>, the <code>zeroblg\/mode<\/code> filter, or the `` settings on the Plugins screen.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3554597,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3554597,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3554597,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3554597,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3554597,"resolution":"1","location":"assets","locale":"","width":1280,"height":720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3554597,"resolution":"2","location":"assets","locale":"","width":1280,"height":720},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3554597,"resolution":"3","location":"assets","locale":"","width":1280,"height":688}},"screenshots":{"1":"The whole configuration API - one <code>define()<\/code> line in <code>wp-config.php<\/code>.","2":"Query Monitor \"Hooks &amp; Actions\" panel showing <code>BlockPatterns-&gt;register_block_patterns<\/code> gone from <code>init<\/code>.","3":"The optional <code>&lt;dialog&gt;<\/code> settings on the Plugins screen - four radios, one save button, no menu item."}},"plugin_section":[],"plugin_tags":[165079,148076,187,247,286],"plugin_category":[45,52,54],"plugin_contributors":[215789],"plugin_business_model":[],"class_list":["post-312481","plugin","type-plugin","status-publish","hentry","plugin_tags-disable-blocks","plugin_tags-gutenberg","plugin_tags-optimization","plugin_tags-performance","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-myththrazz","plugin_committers-myththrazz"],"banners":{"banner":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/banner-772x250.png?rev=3554597","banner_2x":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/banner-1544x500.png?rev=3554597","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/icon-128x128.png?rev=3554597","icon_2x":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/icon-256x256.png?rev=3554597","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/screenshot-1.png?rev=3554597","caption":"The whole configuration API - one <code>define()<\/code> line in <code>wp-config.php<\/code>."},{"src":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/screenshot-2.png?rev=3554597","caption":"Query Monitor \"Hooks &amp; Actions\" panel showing <code>BlockPatterns-&gt;register_block_patterns<\/code> gone from <code>init<\/code>."},{"src":"https:\/\/ps.w.org\/zero-blocks-given\/assets\/screenshot-3.png?rev=3554597","caption":"The optional <code>&lt;dialog&gt;<\/code> settings on the Plugins screen - four radios, one save button, no menu item."}],"raw_content":"<!--section=description-->\n<p>Most WooCommerce stores ship 80-150 KB of block CSS and JS that the store never actually renders. The WC <code>BlockPatterns<\/code> scanner is the one that bugs me most - it hits the filesystem on every request to scan a directory of pattern templates you don't use. Then add core WP <code>global-styles<\/code>, <code>wp-block-library<\/code> and font-faces on top, and you're loading a Gutenberg frontend you probably switched off a long time ago.<\/p>\n\n<p>Zero Blocks Given turns it off at the source, through WooCommerce's own dependency injection container. No CSS dequeue band-aid, no UI checkboxes, no PRO upsell. One constant in <code>wp-config.php<\/code>, pick a tier, done.<\/p>\n\n<h3>How it works<\/h3>\n\n<p>Here's the thing - WC registers its block hooks as closures wrapping instance methods on container-managed objects. So you can't <code>remove_action()<\/code> them by string. You have to fetch the same instance back from the DI container and pass it in as the callable. That's what this does:<\/p>\n\n<pre><code>$bp = \\Automattic\\WooCommerce\\Blocks\\Package::container()-&gt;get( BlockPatterns::class );\nremove_action( 'init', [ $bp, 'register_block_patterns' ] );\n<\/code><\/pre>\n\n<p>The DI-container path is the one that survives WC upgrades cleanly. String-callback matching and dequeue tricks tend to drift every release, so I went with the container.<\/p>\n\n<h3>Four modes. Three ways to set them.<\/h3>\n\n\n\n\n  Mode\n  What it turns off\n  When to use it\n\n\n\n\n  <code>patterns<\/code>\n  WC <code>BlockPatterns<\/code> directory scanner only\n  Block-based Cart\/Checkout - keeps all blocks rendering, just skips the file-I\/O scan\n\n\n  <code>blocks<\/code>\n  <code>patterns<\/code> + <code>BlockTypesController<\/code> + <code>Notices<\/code> styles + <code>wc-blocks-style<\/code> handle\n  Classic-shortcode WC stores\n\n\n  <code>all<\/code>\n  <code>blocks<\/code> + WP <code>global-styles<\/code> pipeline + <code>theme.json<\/code> + font-faces + head <code>&lt;style&gt;<\/code> strip\n  Sites with no Gutenberg frontend at all\n\n\n  <code>nuclear<\/code>\n  <code>all<\/code> + <code>unregister_block_type()<\/code> for every core block\n  Page-builder sites - strips the editor inserter clean\n\n\n\n\n<p>Default is <code>all<\/code>. Set the mode you want with any of these:<\/p>\n\n<ol>\n<li>The <code>&lt;dialog&gt;<\/code> settings - click the Settings link on the Plugins screen. Native HTML dialog, four radios, save. No menu items, nothing else added to your admin.<\/li>\n<li>A constant in <code>wp-config.php<\/code> - <code>define( 'ZEROBLG_MODE', 'patterns' );<\/code>. This wins over the dialog. Good devops escape hatch.<\/li>\n<li>A filter in a theme or mu-plugin - <code>add_filter( 'zeroblg\/mode', fn() =&gt; 'blocks' );<\/code>. Used when neither the constant nor the dialog set a value.<\/li>\n<\/ol>\n\n<p>Resolution order: constant, then settings, then filter, then <code>all<\/code>. An invalid value at any step just falls through to the next.<\/p>\n\n<h3>A few real cases<\/h3>\n\n<ul>\n<li>Service-form site on WC. You sell consultations, not products - no cart, no checkout. <code>mode=all<\/code> strips every block stylesheet across the site.<\/li>\n<li>Classic-shortcode WC store. You use <code>[woocommerce_cart]<\/code> and <code>[woocommerce_checkout]<\/code>, no block UI. <code>mode=blocks<\/code> turns off the block frontend without touching your classic flow.<\/li>\n<li>Block-checkout store with bloated patterns. You run the new Cart\/Checkout blocks but never the WC pattern library. <code>mode=patterns<\/code> skips just the directory scanner - saves the disk hit, leaves your checkout alone.<\/li>\n<li>FrankenPHP \/ worker mode. All hooks are idempotent, no <code>$GLOBALS<\/code> writes, <code>\\Throwable<\/code> catches around the DI lookups. Safe in a worker.<\/li>\n<li>Elementor \/ Divi WC stores. The page builder renders its own checkout, so <code>mode=all<\/code> clears the WC and WP block CSS your theme never uses anyway.<\/li>\n<\/ul>\n\n<h3>Why I built it this way<\/h3>\n\n<ul>\n<li>Activate it and it works - <code>mode=all<\/code> is the default, no setup needed.<\/li>\n<li>No settings page to learn. One constant or one filter is the whole API.<\/li>\n<li>Pure PHP. No database rows, no admin scripts, no frontend JS.<\/li>\n<li>No external requests, no tracking, nothing phoning home. GDPR is a non-issue.<\/li>\n<li>It uses the same <code>Package::container()<\/code> lookup as WC core, so it follows WC's own object lifecycle instead of guessing.<\/li>\n<li>Worker-safe - FrankenPHP, Roadrunner, Swoole. No <code>die<\/code>, no <code>exit<\/code>, no session writes.<\/li>\n<li>mu-plugin friendly. Drop the folder into <code>wp-content\/mu-plugins\/<\/code> and it loads itself.<\/li>\n<li>GPL, no upsells. No PRO tier, no Freemius, no admin notice nagging you for a review.<\/li>\n<\/ul>\n\n<h3>From the maker of WP Multitool<\/h3>\n\n<p>This plugin handles the frontend block bloat. If you also want the backend cleaned up, that's what <a href=\"https:\/\/wpmultitool.com\/\">WP Multitool<\/a> does - slow queries, autoload bloat, the database bottlenecks that caching plugins just hide instead of fixing. Most optimization plugins guess at the problem. WP Multitool runs <code>EXPLAIN<\/code> and shows you. 14 tools in there - slow-query analyzer, autoload optimizer, index suggestions, fatal-error recovery - and a free site scanner if you want to see what's slow before paying for anything. If Zero Blocks Given earned a spot in your stack, that one probably will too.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install from the WordPress plugin directory, or upload the folder to <code>\/wp-content\/plugins\/zero-blocks-given\/<\/code>.<\/li>\n<li>Activate it. It runs on <code>mode=all<\/code> out of the box.<\/li>\n<li>To change the tier, add this to <code>wp-config.php<\/code>:\n   define( 'ZEROBLG_MODE', 'patterns' ); \/\/ or 'blocks' or 'all'<\/li>\n<li>Or drop the folder into <code>wp-content\/mu-plugins\/<\/code> instead - it works as a must-use plugin too.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20woocommerce%20versions%20does%20it%20support%3F\"><h3>Which WooCommerce versions does it support?<\/h3><\/dt>\n<dd><p>WC 7.x through 10.x - anywhere the DI container (<code>Automattic\\WooCommerce\\Blocks\\Package::container()<\/code>) is stable. If a future WC release renames a method, the per-method <code>\\Throwable<\/code> catches mean Zero Blocks Given degrades quietly instead of throwing a fatal.<\/p><\/dd>\n<dt id=\"will%20it%20break%20my%20block-based%20cart%2Fcheckout%3F\"><h3>Will it break my Block-based Cart\/Checkout?<\/h3><\/dt>\n<dd><p>mode=patterns is safe - it only turns off the directory scanner, not the block UI. <code>mode=blocks<\/code> and <code>mode=all<\/code> will break Block-based Cart\/Checkout, which is the whole point of those modes. Pick the one that matches your site.<\/p><\/dd>\n<dt id=\"how%20do%20i%20switch%20tiers%3F\"><h3>How do I switch tiers?<\/h3><\/dt>\n<dd><p>Add <code>define( 'ZEROBLG_MODE', 'patterns' );<\/code> (or <code>'blocks'<\/code> or <code>'all'<\/code>) to <code>wp-config.php<\/code>. The constant wins over the filter. Invalid values fall back to <code>'all'<\/code>.<\/p><\/dd>\n<dt id=\"does%20it%20work%20as%20a%20must-use%20plugin%3F\"><h3>Does it work as a must-use plugin?<\/h3><\/dt>\n<dd><p>Yes. Drop the whole <code>zero-blocks-given\/<\/code> folder into <code>wp-content\/mu-plugins\/<\/code>, then add a one-line loader like <code>mu-plugins\/zero-blocks-given-load.php<\/code> with <code>require WPMU_PLUGIN_DIR . '\/zero-blocks-given\/zero-blocks-given.php';<\/code> in it. WordPress loads it on every request.<\/p><\/dd>\n<dt id=\"is%20it%20gdpr%20compliant%3F\"><h3>Is it GDPR compliant?<\/h3><\/dt>\n<dd><p>Yes. It doesn't collect, store, send or process any user data. No external requests, no cookies, no options written to your database.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20for%20frankenphp%20%2F%20worker%20mode%3F\"><h3>Is it safe for FrankenPHP \/ worker mode?<\/h3><\/dt>\n<dd><p>Yes. No <code>die<\/code>\/<code>exit<\/code>, no <code>$GLOBALS<\/code> writes, no <code>session_start<\/code>, every hook is idempotent, every DI lookup is wrapped in a <code>\\Throwable<\/code> catch. Tested on FrankenPHP worker mode.<\/p><\/dd>\n<dt id=\"how%20do%20i%20uninstall%3F\"><h3>How do I uninstall?<\/h3><\/dt>\n<dd><p>Deactivate and delete from the WordPress admin. It writes nothing to the database, so uninstall is a real no-op.<\/p><\/dd>\n<dt id=\"why%20a%20constant%20first%2C%20settings%20ui%20second%3F\"><h3>Why a constant first, settings UI second?<\/h3><\/dt>\n<dd><p>Keeping the tier in a <code>wp-config.php<\/code> constant means it lives in version control with the rest of your devops config. The dialog is there for sites where editing <code>wp-config.php<\/code> isn't practical. Both end up in the same code path.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>WP.org plugin review feedback - switched direct-file-access guards from <code>return<\/code> to <code>exit<\/code> (the WP coding-standards form). Applied to <code>zero-blocks-given.php<\/code>, <code>uninstall.php<\/code> and all <code>inc\/*.php<\/code> tier files. No behavior change.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>WP.org plugin review feedback - extended the internal prefix from <code>zbg<\/code> to <code>zeroblg<\/code> (review wanted prefixes longer than 4 chars). Renamed constant <code>ZBG_MODE<\/code> to <code>ZEROBLG_MODE<\/code>, filter <code>zbg\/mode<\/code> to <code>zeroblg\/mode<\/code>, option key <code>zbg_mode<\/code> to <code>zeroblg_mode<\/code>, plus the matching function, CSS and DOM-id prefixes. No behavior change.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>First public release. Slug: <code>zero-blocks-given<\/code>. Constant: <code>ZEROBLG_MODE<\/code>. Filter: <code>zeroblg\/mode<\/code>. Option key: <code>zeroblg_mode<\/code>.<\/li>\n<li>Settings dialog JavaScript loaded via <code>wp_enqueue_script()<\/code> on the Plugins screen (<code>inc\/admin-settings.js<\/code>).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New <code>nuclear<\/code> tier - calls <code>unregister_block_type()<\/code> for every core block. Editor inserter goes empty, frontend block markup stops rendering. For sites that build content with page builders, shortcodes or the classic editor only.<\/li>\n<li>New optional settings UI - a native <code>&lt;dialog&gt;<\/code> modal off the Settings link on the Plugins screen. Four radios, one save button. No menu item, no admin notices.<\/li>\n<li>The settings UI sits below the constant in the resolution chain - <code>ZEROBLG_MODE<\/code> in <code>wp-config.php<\/code> still wins. When the constant is defined, the dialog shows the radios disabled with a \"Locked by constant\" notice.<\/li>\n<li>Resolution order is now constant, option, filter, <code>all<\/code> (was constant, filter, <code>all<\/code>).<\/li>\n<li><code>uninstall.php<\/code> now deletes the <code>zeroblg_mode<\/code> option on uninstall (was a no-op).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release. Three tiers: <code>patterns<\/code>, <code>blocks<\/code>, <code>all<\/code>. Default <code>all<\/code>.<\/li>\n<li>DI container unregister via <code>Package::container()-&gt;get( BlockPatterns::class )<\/code>.<\/li>\n<li>Per-method <code>\\Throwable<\/code> catches for forward-compat with WC method renames.<\/li>\n<li>Worker-safe (FrankenPHP \/ Roadrunner \/ Swoole).<\/li>\n<li>mu-plugin friendly.<\/li>\n<\/ul>","raw_excerpt":"Turn off WooCommerce \/ WP block frontend output at the code level. Four tiers, optional one-click settings, no paywall.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312481","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=312481"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/myththrazz"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312481"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312481"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312481"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312481"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312481"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}