WooCommerce Checkout Block Payment Methods Missing: Fix
WooCommerce Checkout Block showing no payment methods after 9.x? Fix missing Stripe, PayPal, and COD options by enabling block support and cache rules.
Muhammad Qasim
Senior Full Stack Developer
The Problem
I ran into this on a client store last week. They upgraded to WooCommerce 9.5, switched the checkout page from the classic shortcode to the new Checkout Block, and suddenly the payment section rendered empty. No Stripe card field. No PayPal button. Not even Cash on Delivery. The order review summary was perfect, shipping calculated fine, but the Payment options section was a blank <div>.
The classic [woocommerce_checkout] shortcode still worked. Only the block was broken. If your store is bleeding conversions because customers hit a dead checkout, here is the fix.
Why It Happens
The Checkout Block does not read payment gateways the way the classic checkout does. It uses the Store API (/wp-json/wc/store/v1/checkout) and expects every payment method to explicitly register block support through register_payment_method_type.
Three things commonly break it:
- Gateway plugin has no block integration. Older Stripe, Authorize.net, and custom gateways only register for the classic checkout via
woocommerce_payment_gateways. They never callPaymentMethodRegistry::register(), so the Store API returns an emptypayment_methodsarray. - Cache plugins cache the Store API. LiteSpeed Cache, WP Rocket, and object caches sometimes cache
/wp-json/wc/store/v1/*responses. A guest request gets cached before any gateway has run, and every subsequent visitor gets zero payment methods served from cache. - Cart totals zero out. If the cart subtotal is
0.00(100% coupon, store credit, free shipping quirk), WooCommerce hides paid gateways and only shows gateways withsupports_zero_amount. Most do not.
You can confirm it in thirty seconds. Open your browser devtools, go to the checkout page, and watch the network tab. Find the GET /wp-json/wc/store/v1/checkout request. Look at the response JSON. If payment_methods is an empty array, the server is not sending them. If it has entries but the UI still shows blank, it is a frontend registration bug.
The Fix
Step 1: Confirm your gateway supports blocks. For Stripe, update the WooCommerce Stripe Gateway plugin to 7.0 or newer. For PayPal, use PayPal Payments 2.x (not the legacy PayPal Standard). For custom gateways, you need to add block support manually.
Here is a minimal block integration for a custom gateway. Drop this in a plugin file:
add_action( 'woocommerce_blocks_loaded', function () {
if ( ! class_exists( 'Automattic\WooCommerce\Blocks\Payments\Integrations\AbstractPaymentMethodType' ) ) {
return;
}
class My_Gateway_Blocks extends Automattic\WooCommerce\Blocks\Payments\Integrations\AbstractPaymentMethodType {
protected $name = 'my_gateway';
public function initialize() {
$this->settings = get_option( 'woocommerce_my_gateway_settings', [] );
}
public function is_active() {
return ! empty( $this->settings['enabled'] ) && $this->settings['enabled'] === 'yes';
}
public function get_payment_method_script_handles() {
wp_register_script(
'my-gateway-blocks',
plugins_url( 'build/index.js', __FILE__ ),
[ 'wc-blocks-registry', 'wp-element', 'wp-html-entities' ],
filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' ),
true
);
return [ 'my-gateway-blocks' ];
}
public function get_payment_method_data() {
return [
'title' => $this->settings['title'] ?? 'My Gateway',
'description' => $this->settings['description'] ?? '',
'supports' => [ 'products' ],
];
}
}
add_action(
'woocommerce_blocks_payment_method_type_registration',
function ( $registry ) {
$registry->register( new My_Gateway_Blocks() );
}
);
} );
Step 2: Exclude the Store API from cache. In WP Rocket, go to Advanced Rules → Never Cache (URLs) and add:
/wp-json/wc/store/(.*)
/wp-json/wc/store/v1/(.*)
/checkout/(.*)
/cart/(.*)
In LiteSpeed, add the same paths under Cache → Excludes → Do Not Cache URIs. For Nginx FastCGI, add a fastcgi_cache_bypass rule on the same regex. If you use Cloudflare, create a Cache Rule that bypasses cache for URI Path contains "/wp-json/wc/store".
Step 3: Purge the object cache. Redis and Memcached hold transients longer than you expect. Run this WP-CLI command:
wp transient delete --all && wp cache flush
Step 4: Verify the block registry loads. In the browser console on the checkout page, run:
wp.data.select('wc/store/payment').getAvailablePaymentMethods()
You should see an object with each method keyed by ID. If it returns {}, your gateway registration did not fire. Check the woocommerce_blocks_loaded hook ran (add an error_log to confirm) and that your build artifact actually exists at the registered script path.
The official WooCommerce Blocks payment method integration docs have the full API surface if you need extended features like saved payment tokens or express buttons.
One More Thing
If the block renders a single "No payment methods available" message even after all of this, check if you have Multi-Currency or Geolocation plugins filtering gateways by country. They sometimes hook into woocommerce_available_payment_gateways but not the block equivalent, so the classic checkout shows methods while the block strips them out. Audit those filters before blaming core.
Wrap Up
Block checkout is now the default in new WooCommerce installs, so this problem is going to land on every store owner who updates in the next year. The fix is not hard, but it requires touching three layers: the gateway plugin, the cache, and the object store.
I have fixed this on half a dozen stores already this month. If your checkout is losing conversions and you need it handled fast — take a look at my web development services, or see how I approach WordPress performance work end to end.
Need Help With This?
I offer professional web development services — WordPress, React/Next.js, performance optimization, and technical SEO.
Get in Touch