Part 1: Building a Popup for FSE WordPress

Most WordPress popup plugins don’t play well with Full Site Editing. Here’s how I’ve started building a custom, block-editor-native popup solution that solves that.

None of the plugins I tried worked particularly with Full Site Editing (FSE). I wanted a solution that stayed fully within the block editor, without relying on custom post types or complex configuration. For something like a popup form, it didn’t make sense to push content into a separate post type — the content should live inline.

The First Attempt: A Single Block with Button + Popup Content

So, I created a custom popup content block. It included:

Because the button and container were placed next to each other, the JavaScript could easily locate the matching popup. It was lightweight, tidy, and worked surprisingly well.

The editor experience
Screenshot of a popup component , front-end
The front-end

What Didn’t Work

But the more I used this primitive version of my popup, the more its limitations became clear:

1. No Support for Multiple Triggers

You could only trigger the popup from the button placed next to it. If you wanted a second button to trigger the same popup, you had to duplicate the content — leading to unnecessary page weight and maintenance overhead.

2. Why Rebuild the Button?

I had recreated a simplified version of the native WordPress Button block. But the core block already does everything I need (and more), including styling, accessibility, and responsive layout. Why introduce another button block with fewer features?

3. Awkward Layout in the Editor

In the editor, the popup container sat directly beneath the button. This was fine in simple layouts, but if you used the button inside a narrow column (like in a grid or hero layout), the full popup block sat awkwardly within that space, making editing more frustrating.


Rethinking It: Decoupling the Trigger from the Content

What I really needed was to decouple the popup trigger from the popup content:

To do this, I updated my system so that:


The Result ( or the new begining )

The final approach is:

Checkout the block’s github repository here, at time of writing I am at version 0.3.0 and intend to release a credible version 1 soon

I also intend to add a Docker Compose setup to make it easy to test locally. If you’re interested, follow along — a follow-up post will include setup instructions and usage examples.