Adding Gutenberg / WordPress editor blocks to the front end
People love to play with a little web app on a site. Quizzes, small games, anything to take a break for a minute or two. Wouldn’t it be great to be able to add and edit these in the WordPress editor then reuse the React components on the front end? Yes! The answer is yes. (Unless it’s no for you. That’s ok! I’m not sure why you’d read past this point though.)
So what needs to be done to make this happen? I’ve come up with *one way* to do it which I’ll outline below. It might not be the best way and is almost certainly not the only way but I like it and it’s working for me. In the coming weeks, I’ll make posts about each of the steps.
First off, let me define exactly what it is I want to do which is:
Render a React app into an html element in the content using the block attributes as the app props.
This has two parts:
creating an html element in the front end content with the block attributes in the element’s attributes
rendering the correct React element into that html element and picking up the block attributes for use as props.
1. Create an html element in the front end content
Here’s an example of a block in the raw, unfiltered content* with the block name “mjj/component-to-use” and two attributes – “postsToShow” with a value of 4 and “displayPostDate” with a value of true:
I want to transform it into this when rendered onto the page.
ie a div with the class created from the block name, data-attr set as the stringified JSON attributes object, and data-block as the registered block name.
Once I have that, I can pick up the attributes and block name and use those as props in the app.
2. Render the correct React element into that html element
This bit should be familiar to anyone who has ever written something like
(A note here: this post is for people familiar with making React apps, however large or small.)
What I want to do is use, as much as possible, the React components I’m using in my editor blocks to create a React app which I render into a given element.
For the app, I’ll need to build a script for use on the front end with all of the app’s code.
The final front end jsx which handles rendering the apps into the correct elements will look something like this. Please note that there are places here where the code could be a bit more sleek. I am ignoring those in favour of clarity for now and because I tend to do that last, after I know the process is set.
What I need to do
Even though there are two steps, there’s more setup I will need in each individual steps. Here’s the list of things I want to do when it’s all broken down: