Setting up a Custom Palette in Gutenberg

While there’s been a lot written about the new editing experience that came out with WordPress v5.0 last month, I want to give a reminder of some of the neat features for end users. One of the best things about the new editor is that a theme or plugin can add or remove features from the editor with simple hooks, allowing you to craft an experience that fits your needs.

As an example, I have taken a few client sites that have embraced the new editor, and used their style guides to add their branding colors, fonts, and variants into the page editor. Now, when they want to add a block of content with a colored background or change the color of a button on a page, they have their palette of brand-approved colors already set to use. No need to remember hex codes or anything confusing!

Sounds great! How do I set up a custom color palette?

Default WordPress Editor Color Palette
Notice that the editor will warn you if your background and text colors aren’t high contrast. This makes it a bit easier to keep your content accessible!

By default the editor will have a palette of 11 colors, plus a color picker to get a different color. You can swap to a palette of your own by adding some code to your theme. Place the following in your functions.php file or where appropriate based on your structure. Next, we’ll modify it to fit our needs.

This code came directly from the Gutenberg Theme Support Handbook, a good resource for all WordPress developers.

function mytheme_setup_theme_supported_features() {
    add_theme_support( 'editor-color-palette', array(
        array(
            'name' => __( 'strong magenta', 'themeLangDomain' ),
            'slug' => 'strong-magenta',
            'color' => '#a156b4',
        ),
        array(
            'name' => __( 'light grayish magenta', 'themeLangDomain' ),
            'slug' => 'light-grayish-magenta',
            'color' => '#d0a5db',
        ),
        array(
            'name' => __( 'very light gray', 'themeLangDomain' ),
            'slug' => 'very-light-gray',
            'color' => '#eee',
        ),
        array(
            'name' => __( 'very dark gray', 'themeLangDomain' ),
            'slug' => 'very-dark-gray',
            'color' => '#444',
        ),
    ) );
}

add_action( 'after_setup_theme', 'mytheme_setup_theme_supported_features' );

There’s a lot of code there, but not a lot to break down. First, remember that after_setup_theme is a hook, on which you add the function mytheme_setup_theme_supported_features that you’re creating. In that function we’re using add_theme_support, a built in WordPress function, where we’re using editor-color-palette to set our palette up.

We’re adding an array of colors, and each element of that array is itself an array. Within those nested arrays we have the name of the color, which we’re making translatable with the __() function, and setting the textdomain of our theme. Change themeLangDomain to whatever matches your theme. This name is a descriptor for when you hover over it in the palette.

The slug is a string of how you’ll refer to the color elsewhere in your code. The color is the hexadecimal value of the color that you want in your palette. With the above code, you’ve got a new editor palette with four colors that you’ve set, along with the color picker.

Our custom WordPress editor color palette
Our four custom colors now appear, along with the color picker

Adding to Our Palette

There are a few more features of the editor color palette that I’d like to show off, including targeting blocks in CSS, Customizer set colors, and removing the color picker.

Using our Color Palette Selections in CSS

If you’re editing text with the color palette you shouldn’t have to make any other changes. But what if you want to use the color selection in something a bit more customized, or in your own block type?

The slug that we added to our colors in the example above lets us target for both background and text colors. We don’t even need to use the color set in the editor, but something custom to our needs. For example, you may want a specific background or text color when you use the strong magenta color. In that case, here’s the CSS that can target the classes added when we use that color:

.has-strong-magenta-background-color {
    background-color: #313131;
}

.has-strong-magenta-color {
    color: #f78da7;
}

Setting a Color Palette with the Customizer

The twentynineteen theme that comes with WordPress has a custom palette that includes colors that can be set in the Customizer. This means that you can set your own primary and secondary color from the WordPress dashboard, without changing code!

array(
		'name'  => __( 'Primary', 'twentynineteen' ),
		'slug'  => 'primary',
		'color' => twentynineteen_hsl_hex( 'default' === get_theme_mod( 'primary_color' ) ? 199 : get_theme_mod( 'primary_color_hue', 199 ), 100, 33 ),
	),
	array(
		'name'  => __( 'Secondary', 'twentynineteen' ),
		'slug'  => 'secondary',
		'color' => twentynineteen_hsl_hex( 'default' === get_theme_mod( 'primary_color' ) ? 199 : get_theme_mod( 'primary_color_hue', 199 ), 100, 23 ),
	),

The new color is now set as the output of a function that will get a theme mod, if you’ve modified the color. If not, it’ll return the default, ensuring that there’s always a color set.

The WordPress customizer with a primary color selection

Removing the Color Picker

You can also do things like disable the color picker, to ensure that users can only use the colors that you have preset for them. Doing so requires just one line of code in your functions file:

add_theme_support( 'disable-custom-colors' );

With that single line we’ve made it so the beautiful design that we’ve worked so hard to craft and the branding style guide that we have had to constantly review will always be set the way that we want.

Wrapping Up

As you can see, there’s a lot that you can do to change how users edit content in the Gutenberg editor, without having to add a tremendous amount of code.

This is only the beginning, and even more developer and user friendly features like this already exist or are coming to the editor and the rest of WordPress. I’m excited for the new opportunities this gives to all stakeholders of a site, from designers and developers, to admins and editors, all the way to customers and visitors. Let’s keep making WordPress better for everyone!

Fixing Style Issues While Editing Beaver Builder

I’ve started using Beaver Builder with a few clients after having played with it a bit and hearing lots of great reviews. I’ve looked into multiple WordPress Page Builders, and have had experience with quite a few of them through my work offering WordPress maintenance service.

I’ve found that Beaver Builder is able to handle a lot of the customizations that my clients may want to make, but there are still a few things that I have to setup externally to get a feature that they want. As an example, a client wanted to use the callout module to make an entire box clickable, not just a button after text and images.

Doing the above was fairly straightforward for this use-case: I set the entire callout link to be relatively positioned in CSS, so that I could absolutely position the anchor tag within the link to be the full height and width of that box. Finally, I added a hover and focus state to the button so that when hovering with the mouse or focusing with the keyboard there would be a visual indication that it was clickable, besides the cursor icon that was already set.

.callout-link {
	position: relative;
}

.callout-link a {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
}

.fl-callout-button a:hover,
.fl-callout-button a:focus {
	box-shadow: 1px 1px 3px 0 #315E7D;
}

So what’s the issue?

That looked like a simple solution to the problem that we had, but like many bits of code, I inadvertently created a new issue.

Beaver Builder is a front-end content editor, which means that it uses the same HTML and CSS structure to display the content while editing. While this is normally a good thing, it means that you need to pay attention to custom code that you’ve added to modify Beaver Builder.

Since I changed the layout of links in the callout module, I changed the layout of links for the editor of that module. Additionally, I’d styled unordered list bullets with pseudo-elements, which also caused a display issue. This is what the editor looked like when I tried to modify those links:

Broken Beaver Builder editor CSS
This is what happens when you let me touch code!

After I determined that I was the cause of the issue, I set about to fix it. Thankfully, Beaver Builder adds several body classes while the page editor is open, including the class fl-builder-edit which I used to fix this particular issue. I hid the li::before pseudo-elements, and restored the link anchor to relative positioning.

/* Beaver Builder Editor Fixes */
.fl-builder-edit .entry-content ul li::before,
.fl-builder-edit .fl-builder-content ul li::before {
	display: none;
}

.fl-builder-edit .callout-link a {
    position: relative;
}

With that code in place, the editor layout looked as it should before I mangled it.

Fixed Beaver Builder editor settings
That’s a lot better and actually usable!

Check for unintended consequences of your code.

This broken CSS wasn’t a major problem, and was thankfully easy to fix. But it did bring up a good reminder: when you make one change to your code, you may change something else that you didn’t mean to. It’s always good to review every time that you make a change. Having some version control in place that you use regularly doesn’t hurt either!

Display a Notice for New WordPress Posts

If you’re like me, it might not always be easy to get new posts out to your blog. I’m trying to keep a new tech-tip going every regular weekday for a while to see how I keep up with that.

Since my content might not always be the newest, I may want to highlight when something was recently published.

Calculate posts published in the last two weeks

In the following example, I’m going to check to see if a post was published within the past two weeks. If so, I’m going to attach a notice to the title of the post. I’m assuming that the following code is going to go into a loop of posts, or somewhere that we’re already using the correct post ID.

$post_title = get_the_title();
if ( get_the_date( 'U' ) >= date( 'U', strtotime( '-2 weeks' ) ) ) {
    $post_title .= ' — New Post!';
}
echo $post_title;

First, on line one, we’re creating a variable in PHP called $post_title. This will hold the title of the post, which we get with the built-in WordPress function get_the_title(). Again, I’m assuming that we’re already in a loop for a specific post, but if not you can pass the ID of the post as an argument in that function.

Next, line two is going to get the date that the post was published in Unix Timestamp format. I’ve put it into that format to make it easy to compare. I am grabbing the date instead of the exact time since it doesn’t really matter to me if it was exactly within two weeks down to the second, just generally two weeks by day count.

The post publish date is compared to the current time minus two weeks, also in Unix Timestamp format. The PHP function strtotime() allows you to use human readable formats for time conversions, which we’re using to say “give me the time in Unix seconds for two weeks ago”.

If that comparison is true and the post was published less than two weeks ago, we’re going to append the text ” — New Post!” to the post title. By using a period followed by the equals sign, we’re saying that we want to concatenate, or add the new value to the existing variable.

Finally, on line five we’re echoing out the value of $post_title, meaning we’re printing it to the screen. So if I were to use the above code to display titles for this site and this post was published less than two weeks ago, the title would display as Display a Notice for New WordPress Posts — New Post!

How else could this be used?

One way that I use this code is for a custom post type that displays properties for sale for a client. They wanted to highlight some recent listings, and using this code along with some CSS let me put a fancy ribbon on the corner of property listings, as well as list the number of days that the home has been on the market.

Property Listing with new listing notice and number of days on the market

If you have the need to calculate WordPress post publish date compared to the current date, I hope the above snippet has been a good place to start!

How to Keep Gravity Forms Displayed After Submission

Sometimes you’ll have a Gravity Form that you want to keep visible after it is submitted. Maybe you want people to be able to fill out the same form multiple times, or maybe your design looks better with the form still showing.

Gravity forms has a filter hook built in called gform_pre_submission_filter, which can be used to make changes to the form, among other things, after the form has validated (ensured that required fields are filled, nothing is blocked, etc), but before the form submits and notifications are sent. You can learn a bit more about that filter on the Gravity Forms documentation.

We’re going to use this filter and create our own PHP function that will check the form before it is submit, and create a div that holds any confirmation messages that we have set.

// Allow the Gravity form to stay on the page when confirmation displays.
add_filter( 'gform_pre_submission_filter', 'dw_show_confirmation_and_form' );
function dw_show_confirmation_and_form( $form ) {
	$shortcode = '
. '" title="true" description="false"]'; if ( array_key_exists( 'confirmations', $form ) ) { foreach ( $form['confirmations'] as $key => $confirmation ) { $form['confirmations'][ $key ]['message'] = $shortcode . '<div class="confirmation-message">' . $form['confirmations'][ $key ]['message'] . '</div>'; } } return $form; }

First, on line two we add our function, dw_show_confirmation_and_form, to the filter. Notice that we use the parameter $form in our function, which gives us access to details about this specific form.

On line four I’m getting the shortcode that inserts the form into the page. In this case I want it to get the proper ID of the form, and I want to display the title of the form but not its description.

Below that, from line six to line ten, we’re checking to see if there are any confirmations for this form. If so, we’re going to loop through each confirmation and append it to the form shortcode (so the form will display again), then put the confirmation text inside of a div that we’ve given the class .confirmation-message. That class can then be used to style the display of the confirmations.

Finally, on line twelve, we return the form. Since we’ve prepended the shortcode with the ID of the form, when the form submits it will display the form again, followed by our confirmation message.

Gravity Form displaying with confirmation text below it.
Our post-submission form, with the confirmation text displaying below

The code above will make this change to all forms. If you need to target just one form, use the ID of the form and change the filter to include the form number after an underscore at the end. For instance, if we’re making this change to form three, we’ll change our filter call to 'gform_pre_submission_filter_3'.

You may also want to do other things, like control whether any fields stay filled or not, update without refreshing the page, or scrolling down to the confirmation when complete, but those are lessons for another day!

What I’ve Learned Hosting the WordPress Orlando Meetup For Almost Seven Years

I’ve been organizing the WordPress Orlando Meetup since near the start, all the way back in late 2011. For me that was my first introduction to the idea of a community around WordPress, and that led to my involvement in my first WordCamp in 2012. Since then I’ve traveled to dozens of WordCamps, speaking, volunteering, organizing, and even occasionally attending without having all of that extra pressure ????

WordPress Orlando Organizers and Matt Mullenweg
Having Matt Mullenweg stop by your Meetup is ????????????

There are a few things that I’ve learned about hosting recurring events for people that you don’t always see outside of that community. Some of these were taught to me by others locally, some were shared from the supportive network of the Make WordPress Community, and some were those harder learned lessons, where I had to experience firsthand when things don’t always go according to plan.

I can’t say that these are the most important lessons of all, but since I’m prepping for our WordPress QA Meetup tonight, I thought I could jot down a few of the things that I find important for a Meetup.

It Doesn’t Matter Where You Are

I mean you should try to choose a place that is quiet enough to hold conversations, but not so quiet that you’re intruding on it. Ideally select a location where you won’t be a disturbance to others nearby, and they won’t be a disturbance to your group.

Libraries have been good for us for this, as well as private office spaces generously donated by supportive businesses. These are places that you can generally have a multi-hour meeting without disturbing anyone else, and if you look hard enough you can find people willing to give you space for free. We generally choose companies that are in the web and marketing space, since they would have a natural overlap with our group.

Coffeeshops and other public venues can also be used if they fit what you’re looking to do. We host a monthly coffee Meetup at a local coffeeshop near my house. I chose that location because they make the best coffee around Orlando, they are locally owned and get a business boost by us being there, and they have faster internet than I have at home. The casual environment is a good setup for our conversational Meetups, where we naturally form small groups to chat, help each other with websites, and meet new people.

WordPress Orlando User Workshop
Hands-on Workshops are a huge hit for our group.

It Doesn’t Matter What You Do

Again, have some guidelines, and certainly let people know in advance what you want to do at the Meetup so they can determine if it’s good for them to attend. You can do a variety of Meetup styles, and they don’t all have to be lectures or be the same from event to event.

We’ve hosted events that are standard lectures, deep dives on one topic, several short talks with a general theme, QA sessions, hands-on workshops, and the aforementioned coffee chats. We even hosts parties and social events, like the WordPress 15th Anniversary Party that we’re holding next week.

A group you’d love to party with

I’ve found that having different topics each month, as well as giving an idea of the level of familiarity that you should have with that topic before attending helps.

We’ve had people mention that they thought the group would be too technical for them, so we do our best to make everyone feel welcome. Indeed, our makeup of events skews heavily toward business owners and bloggers, the people that make up the largest portion of the WordPress user base by far. It’s our job and my pleasure to make sure they get something valuable out of attending an event.

It Doesn’t Matter How Many People Attend

Orlando is lucky to be situated to have one of the largest WordPress Meetups in the world. We’ve got a passionate base of attendees that show up to most events, and a healthy cycling of new members each month.

Though a crowd is always nice when you’ve got a stage!

That said, we’ve noticed attendance dipping. Not always that we have fewer people attend, although that’s sometimes the case, but that we have higher RSVPs and a higher number of no-shows. Sometimes this can be upsetting when I provide food for the Meetup that goes uneaten, but it’s worst when we’re in a venue that we have to limit RSVPs and I know that there are people who didn’t make it because someone took a seat and didn’t show up.

We’ve hosted individual events that had a handful of attendees all the way up to 100+ people who are passionate about WordPress. The size of the event doesn’t matter as long as some time can be made to let everyone know what they can do, who is welcome, and that whatever reason they chose to come will be heard.

Irina Blumenfeld, Chris Edwards, David Wolfpaw, and Adam Soucie answering WordPress Questions

Sometimes those smaller Meetups can be even more fun, since they take less planning and can have more intimate conversations. I get to learn a lot from a wide group of people who know lots about something that I know nothing about, and they can hopefully learn something about WordPress from me.

General Notes

Just a few things that didn’t fit into the above sections:

  • Maintaining some sort of online presence is useful to keep people connected outside of events. Our website, Facebook group, Youtube, and Slack team, are resources for all members with notes from our previous Meetups and new discussion.
  • Having some way to remind people how they can reach you is important. We have a banner that we bring to each event, so that someone can snap a picture of it to remind themselves of our URLs later. I shortened them with redirects from our main website to make them even easier to type in.
  • Having a Code of Conduct is super important. We haven’t had too many issues where we had to enforce ours, but they’ve happened. Having some sort of guiding document is a good start to ensure discussions flow around inappropriate behavior.
  • Having a few organizers helps to stop burnout. Each event involves booking a venue, setting dates, getting refreshments, arranging speakers, and ensuring all of the little things around those go off without a hitch, like say ensuring the venue isn’t locked (happened multiple times), that people have the right date and address (same), and that speakers aren’t stuck without the right laptop adapter (yup)
  • Have fun with it! This is a volunteer group with all volunteer driven events. I try not to let it consume all of my time, and try not to go overboard on fancy venues and food when it’s coming out of pocket. Survey after survey have shown us that people come for the content and community, and that everything else is secondary.

If you want to start a Meetup in your area or get involved in an existing one, do it! It doesn’t have to take a lot of time and energy to get started, and the Make WordPress Community can provide additional resources, including funding for venues.

WordPress US Contributor Day
Seriously, these people are amazing!