WooCommerce 11.1 skips block and pattern registration for cron, AJAX, and REST requests that normally do not render blocks. WooCommerce handles product and variation descriptions on demand, but an extension that renders another WooCommerce block in a webhook or custom endpoint may return raw block comments or static fallback HTML. Turning registration on for every request gives back the performance work and can hide which endpoint actually needs it.
Use this when a custom REST route, Store API extension, webhook payload, feed, email job, or AJAX response includes WooCommerce block markup after upgrading to 11.1.
Quick answer
Capture the exact request method, route, query form, callback, authentication, response body, and WooCommerce block name. Confirm whether WooCommerce considers that request non-rendering and whether your extension calls block rendering before registration. Product and variation descriptions should use the built-in on-demand path. For a custom renderer, return true from woocommerce_should_register_blocks only for a condition available on plugins_loaded, such as a stable request path or query flag. Retest unrelated REST, cron, and AJAX requests to prove they still skip the work.
Test scenarios to run
Run the same controlled fixture across these branches. Write down the expected result before testing so a surprising response is easy to identify.
| Scenario | Fixture | Expected result |
| Product description | REST product response | Built-in on-demand rendering |
| Custom endpoint | Mini-cart block | Narrow opt-in renders output |
| Unrelated REST | Orders query | Registration stays skipped |
| Webhook | Extension block payload | One rendered result, no raw comment |
Diagnostic table
Use this table to connect the observed behavior to evidence and a verification step.
| Action | Evidence | Verification |
| Capture the exact raw response | Save one failing request and response with route, query string, headers, callback, block name, UTC time, and exact WooCommerce version. | The owned endpoint returns dynamic output without raw block comments. |
| Identify the rendering owner | Check whether the output is raw block markup, saved static HTML, missing dynamic output, or missing assets because each points to a different layer. | Product and variation descriptions still use WooCommerce on-demand handling. |
| Add one early narrow opt-in | Trace when the extension calls do_blocks or block rendering relative to plugins_loaded, init, REST route registration, and response serialization. | Unrelated REST, cron, AJAX, and webhook requests keep registration skipped. |
| Retest every request context | Add the narrowest early condition that identifies the owned rendering request and never rely on the main query that does not exist yet. | Endpoint timing, queries, memory, logs, and frontend rendering remain healthy. |
What to check first
- Save one failing request and response with route, query string, headers, callback, block name, UTC time, and exact WooCommerce version.
- Check whether the output is raw block markup, saved static HTML, missing dynamic output, or missing assets because each points to a different layer.
- Trace when the extension calls do_blocks or block rendering relative to plugins_loaded, init, REST route registration, and response serialization.
- Add the narrowest early condition that identifies the owned rendering request and never rely on the main query that does not exist yet.
- Benchmark the affected endpoint and unrelated REST, cron, AJAX, webhook, and frontend requests before and after the filter.
Field notes
- Write the expected result before changing anything and keep one repeatable synthetic fixture for the full test window.
- Record exact versions and UTC timestamps because caches, retries, scheduled actions, and deployments can change the evidence between checks.
- Test the public path and the stored server-side result, not only an admin preview, isolated command, or API response.
- Review the result again after the relevant cache, queue, cron, webhook, and observation window has completed.
Useful command or data shape
Adapt paths, IDs, and privacy handling to the site before running commands or storing data on production.
add_filter( 'woocommerce_should_register_blocks', function ( $should ) {
$uri = $_SERVER['REQUEST_URI'] ?? '';
return str_starts_with( $uri, '/wp-json/acme/v1/render-card' ) ? true : $should;
} );
# Keep the match narrow and test query-form REST URLs too.
Why this usually happens
- The extension relied on WooCommerce registering every block during every request.
- A filter checks is_rest or the main query too early and never matches.
- The endpoint needs server rendering but is treated like a data-only request.
- A developer enables registration globally, masking the boundary and adding cost everywhere.
Decision rule
Opt in only when the extension truly renders a WooCommerce block in that early-identifiable request. A global true value is not an acceptable compatibility fix.
Production verification checklist
- The owned endpoint returns dynamic output without raw block comments.
- Product and variation descriptions still use WooCommerce on-demand handling.
- Unrelated REST, cron, AJAX, and webhook requests keep registration skipped.
- Endpoint timing, queries, memory, logs, and frontend rendering remain healthy.
Safe fix order
Use a sequence that makes each result easy to prove. Stop when new evidence changes the scope or owner of the problem.
- Capture the exact raw response
- Identify the rendering owner
- Add one early narrow opt-in
- Retest every request context
- Keep the performance benefit elsewhere
Mistakes to avoid
- Changing production before recording exact versions, UTC timestamps, a stable fixture, the expected result, and a tested rollback point.
- Treating one successful screen as proof while logs, stored records, background jobs, caches, emails, APIs, and downstream systems remain unchecked.
- Testing only as an administrator instead of using the role, device, locale, cache state, request path, and failure branch that users actually reach.
- Leaving debug output, temporary exclusions, helper accounts, duplicate hooks, broad permissions, or relaxed firewall rules active after verification.
Questions teams ask during testing
Can I test this directly in production?
Start with read-only evidence. Use staging for code, package, security, checkout, form, privacy, or cache changes. If a production canary is necessary, make it identifiable, reversible, monitored, and incapable of exposing personal data or charging a customer.
How do I avoid a false positive?
Repeat the same fixture with the same versions, URL, role, locale, cache state, and downstream integration. Compare the public result, stored result, and logs instead of relying on one browser view.
What evidence should I retain?
Keep UTC time, exact versions, request or record ID, expected result, actual result, relevant log lines, change made, rollback point, owner, and final verification. Redact credentials, tokens, and personal data.
When is the work complete?
Close it when the primary path passes, failure branches are understood, stored and downstream records reconcile, temporary changes are removed, monitoring is active, and the owner has the evidence packet.
What to tell the client or owner
Give the owner a concise packet with the affected workflow, exact versions, UTC test time, synthetic fixture ID, expected result, actual result, key logs, change made, rollback point, final result, unresolved risks, owner, and next review date. Remove credentials and personal data before sharing it.
When HandL WP should help
Bring in help when this affects leads, checkout, search visibility, security, paid media reporting, or a client production site. HandL WP can trace the issue through WordPress, hosting, cache, tracking, and Search Console, then verify the workflow after the technical fix.
If this is active on a production site, have HandL WP fix a WooCommerce 11.1 extension.
Related HandL WP guides
Use these related guides when the same issue touches tracking, security, checkout, or crawler visibility.
Helpful references