Most WooCommerce stores ship 80-150 KB of block CSS and JS that the store never actually renders. The WC BlockPatterns 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 global-styles, wp-block-library and font-faces on top, and you’re loading a Gutenberg frontend you probably switched off a long time ago.
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 wp-config.php, pick a tier, done.
Here’s the thing – WC registers its block hooks as closures wrapping instance methods on container-managed objects. So you can’t remove_action() 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:
$bp = \Automattic\WooCommerce\Blocks\Package::container()->get( BlockPatterns::class );
remove_action( 'init', [ $bp, 'register_block_patterns' ] );
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.
Mode
What it turns off
When to use it
patterns
WC BlockPatterns directory scanner only
Block-based Cart/Checkout – keeps all blocks rendering, just skips the file-I/O scan
blocks
patterns + BlockTypesController + Notices styles + wc-blocks-style handle
Classic-shortcode WC stores
all
blocks + WP global-styles pipeline + theme.json + font-faces + head <style> strip
Sites with no Gutenberg frontend at all
nuclear
all + unregister_block_type() for every core block
Page-builder sites – strips the editor inserter clean
Default is all. Set the mode you want with any of these:
<dialog> settings – click the Settings link on the Plugins screen. Native HTML dialog, four radios, save. No menu items, nothing else added to your admin.wp-config.php – define( 'ZEROBLG_MODE', 'patterns' );. This wins over the dialog. Good devops escape hatch.add_filter( 'zeroblg/mode', fn() => 'blocks' );. Used when neither the constant nor the dialog set a value.Resolution order: constant, then settings, then filter, then all. An invalid value at any step just falls through to the next.
mode=all strips every block stylesheet across the site.[woocommerce_cart] and [woocommerce_checkout], no block UI. mode=blocks turns off the block frontend without touching your classic flow.mode=patterns skips just the directory scanner – saves the disk hit, leaves your checkout alone.$GLOBALS writes, \Throwable catches around the DI lookups. Safe in a worker.mode=all clears the WC and WP block CSS your theme never uses anyway.mode=all is the default, no setup needed.Package::container() lookup as WC core, so it follows WC’s own object lifecycle instead of guessing.die, no exit, no session writes.wp-content/mu-plugins/ and it loads itself.This plugin handles the frontend block bloat. If you also want the backend cleaned up, that’s what WP Multitool 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 EXPLAIN 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.