WordPress.org

WordPress Developer Blog

Introducing Block Bindings, part 1: connecting custom fields

Introducing Block Bindings, part 1: connecting custom fields

Looking over the laundry list of developer-specific features coming in WordPress 6.5, I’m like a kid on Christmas morning, shredding the wrapping paper to reveal all the goodies Santa dropped off the night before. But there’s that one special gift. The big one. The one I’ve been wishing and hoping for.

It’s the Block Bindings API.

For extenders, this is the foundation of so many features we’ve all been asking for since the launch of WordPress 5.0 and the Block Editor. This initial iteration provides support for custom fields integration, pattern overrides, and custom bindings.

This post is the start of an in-depth series that covers what block bindings are, why you should use them, and how to use them in your projects. In this first post, you’ll learn how to bind custom fields to block attributes.

I encourage you to leave comments on what you’d like to build with the Block Bindings API. What you see in WordPress 6.5 is only the first iteration of a massively powerful feature that will only become better in the versions to come

If you’re reading this before WordPress 6.5 has been released, make sure that you’re testing with the latest version of WordPress trunk and the most up-to-date version of the Gutenberg plugin. Please report any issues that you find.

What are block bindings?

Before we dive into the really fun stuff like connecting custom fields, let’s set the groundwork. It’s important to understand what the Block Bindings API is and why it’s so vital to the future of WordPress.

The basic structure of a block and bindings

Take a look at the markup for a basic Image block:

<!-- wp:image -->
<figure class="wp-block-image"><img src="" alt=""/></figure>
<!-- /wp:image -->

What the Block Bindings API does is let you “bind” dynamic data to the block’s attributes, which are then reflected in the final HTML markup that is output to the browser on the front end.

This means you can do things like bind a custom URL to the Image block’s url attribute and text to the alt attribute with data from custom fields (post meta), site data, and even more.

It’s also necessary to understand what attributes are available for a block that you want to bind data to. For the Image block, you can view its attributes via its block.json file. There are many potential attributes. But for this exercise, let’s focus only on url and alt:

{
	"attributes": {
		"url": {
			"type": "string",
			"source": "attribute",
			"selector": "img",
			"attribute": "src",
			"__experimentalRole": "content"
		},
		"alt": {
			"type": "string",
			"source": "attribute",
			"selector": "img",
			"attribute": "alt",
			"default": "",
			"__experimentalRole": "content"
		}
	}
}

If you look closely at the block markup and compare it to the attributes property in block.json, you’ll see:

  • The url block attribute maps to <img src=""/>.
  • Likewise, the alt block attribute maps to <img alt=""/>.

In a real-world scenario, the Image block markup would look more like this (formatted for clarity):

<!-- wp:image {
	"lightbox":{"enabled":true},
	"id":1,
	"sizeSlug":"large",
	"linkDestination":"none"
} -->
<figure class="wp-block-image size-large">
	<img src="/path/to/image.jpg" alt="This is the image alt text" class="wp-image-1"/>
</figure>
<!-- /wp:image -->

This markup indicates that:

  • The url block attribute is /path/to/image.jpg.
  • The alt block attribute is This is the image alt text.

It’s important to grasp the relationship between block attributes and how they are represented in the markup because the Block Bindings API works entirely with the attributes system.

Why the Block Bindings API is useful

What makes Bindings so powerful is that you can bind dynamic data to block attributes. Before WordPress 6.5, adding dynamic data within the block system meant building a custom dynamic block.

Let’s take a look at a real-world example. If you open the Your Name movie page from the WP Movies Demo, you will see a lot of data that has been generated dynamically:

Much of what you see there is (currently) built with several custom blocks that are tied to metadata. You can see this from the project’s GitHub repository. What if the team didn’t need to build all of those as custom blocks and could use their existing post meta fields instead? Some easy wins right now would be to use bindings to replace movie data like:

  • Rating
  • Release date
  • Runtime
  • Language
  • Budget
  • Revenue

Building custom blocks for that type of data has always felt like overkill in many situations, especially when the basic HTML markup of what you were building already existed as a Core block. For example, why build a custom block that uses a simple <p> element with RichText content when the Core Paragraph block exists?

If you’re not very comfortable with advanced React JavaScript, the onramp to extending WordPress could feel more like climbing a mountain. The first version of the Block Bindings API will make that climb far less daunting, handing you more power with less code.

Sticking with the Image block example from the previous section, imagine connecting a custom URL from various sources like:

  • A custom field
  • A custom database table
  • The media source on an image attachment template
  • A fallback when the user doesn’t set an image

You don’t need to build a custom block for those things. You can bind the data directly to the existing WordPress Image block either through a Core or custom binding source, depending on the scenario.

Here’s an example of an Image block’s markup when pulling data from a fictional binding source:

<!-- wp:image {
	"metadata":{
		"bindings":{
			"url":{
				"source":"namespace/slug",
				"args":{
					"key":"some-field"
				}
			},
			"alt":{
				"source":"namespace/slug",
				"args":{
					"key":"some-other-field"
				}
			}
		}
	}
} -->
<figure class="wp-block-image">
<img src="" alt="" />
</figure>
<!-- /wp:image -->

Seriously, you’re just plugging in a few fields to make it work.

We’ll get to what each of those things does. I just wanted to familiarize you with the markup before jumping too far ahead.

The point is that Bindings let you attach any dynamic data from any source to a block attribute. (WordPress 6.5 will ship with limited support for a handful of Core blocks and attributes, which are listed in the table at the end of this post.)

Imagine a WordPress where you only needed to bind a few fields to an existing baseline block like Image, Heading, Paragraph, or others to create something that behaves just the way you need it to for your use case. 

Pretty exciting thought, right? Well, WordPress 6.5 makes it a reality for several use cases.

Connecting custom fields to block attributes

One of the primary use cases for the Block Bindings API is to connect a custom field (i.e., post metadata) to a block. This could be something as simple as adding a custom text field to a Paragraph block. Or it could handle a more advanced scenario like pulling a custom image URL and alt text to attach to an Image block.

We’ll actually walk through both of these examples as a broad introduction to using custom fields, but I’m sure you have plenty of use cases already in mind.

Enabling custom fields

Given how much territory this tutorial will cover, I didn’t want to spend too much time teaching how custom fields work or how to build your own UI elements for them. Those things are out of scope for this post, so any custom fields added will be done through the default Custom Fields panel in the Post Editor.

To enable this panel in your editor, open the Options ( icon) dropdown in the Post Editor and click the Preferences button. Under the Advanced section, toggle the Custom fields option on:

You will be asked to reload your browser so that the Custom Fields panel will appear at the bottom of the editor.

This tutorial shows you how to handle metadata with the Custom Fields panel, which works well for many use cases. But in a real-world project, you’ll most likely build out custom controls in the UI for your plugin/theme users. Or you can use one of the many existing custom fields plugins. That’s totally up to you.

The basics: binding a text field to a Paragraph block

Let’s kick this thing off with the simplest of possible examples: registering a meta key and binding it to a Paragraph block. How about we build something to display today’s mood?

It’s always good practice to prefix custom meta keys with your plugin or theme slug. It should look like this: projectslug_key.

Your PHP code can run from either a custom plugin file or your theme’s functions.php. Open the file of your choice and register a post meta key named projectslug_mood:

add_action( 'init', 'projectslug_register_meta' );

function projectslug_register_meta() {
	register_meta(
		'post',
		'projectslug_mood',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'sanitize_callback' => 'wp_strip_all_tags'
		)
	);
}

Again, this tutorial isn’t about how to register meta. Just keep in mind that you must set show_in_rest to true for meta fields to work over the REST API and in the Block Editor. For more information on registering custom meta, refer to the register_meta() documentation.

Now that you have registered your post meta, you’re ready to test a custom value and bind it to a block.

Open the Post Editor from your WordPress admin and scroll down to the Custom Fields panel. Add the projectslug_mood key under the Name field and enter any text you want under the Value field. Then hit the Add Custom Field button:

WordPress 6.5 doesn’t have a built-in UI for binding custom fields to blocks, so you’ll need to switch to the Code Editor view for this next step. You can locate it via the Options menu (the button in the top right panel).

Now add this block markup to the editor:

<!-- wp:paragraph {
	"metadata":{
		"bindings":{
			"content":{
				"source":"core/post-meta",
				"args":{
					"key":"projectslug_mood"
				}
			}
		}
	}
} -->
<p></p>
<!-- /wp:paragraph -->

Let’s take a brief moment to study the block markup you just entered before we get too far ahead of ourselves. There are certainly a lot of nested properties there!

Here is an overview of each of those nested properties:

  • metadata: An object that contains metadata about the block.
  • bindings: An object that can contain one or more bindings for the block.
  • content: The block attribute to bind to the custom field. In this case, it’s the Paragraph block’s content attribute.
  • source: The bindings source registered via the Block Bindings API that will handle the return value on the server. This must be set to core/post-meta to use the built-in custom fields handling (we’ll cover other sources in Part 2 of this series).
  • args: An object that can contain one or more arguments to pass to the block bindings source. For custom fields, you must always set the key property to the name of the meta key you want to bind to the block attribute.

Now switch back to the Visual Editor view. You might see the projectslug_mood key appear as the Paragraph content at first. The important part is that you should not be able to edit it from the Visual Editor itself. 

Once you save the post, the value you entered into to Custom Fields panel should appear in its place:

If you view the post on the front end of your site, you should see the exact same output.

Now, of course, in a real-world project, you are going to build a custom UI or use a third-party plugin for inputting the data. And often, you will actually be outputting these fields in patterns or templates. This is just a quick and clean method of testing the underlying API and custom fields.

More advanced: multiple bindings on an Image block

Let’s kick this up a notch and try registering two different bindings to a single block. In this exercise, you’ll add a custom URL and alt text to an Image block. The process is pretty much the same.

First, register two metadata keys for posts:

  • projectslug_image_url: This will store the URL that you’ll bind to the Image block’s url attribute.
  • projectslug_image_alt: The alt text you’ll bind to the alt attribute.

Open either your plugin file or your theme’s functions.php (whichever you decided on in the previous step). Then add this code inside of the projectslug_register_meta() function that you added earlier:

register_meta(
	'post',
	'projectslug_image_url',
	array(
		'show_in_rest'      => true,
		'single'            => true,
		'type'              => 'string',
		'sanitize_callback' => 'esc_url_raw'
	)
);

register_meta(
	'post',
	'projectslug_image_alt',
	array(
		'show_in_rest'      => true,
		'single'            => true,
		'type'              => 'string',
		'sanitize_callback' => 'wp_strip_all_tags'
	)
);

Head back to your Post Editor in the WordPress admin. Before adding any data to the Custom Fields panel, let’s see what an empty Image block looks like with the bindings in place.

Open the Code Editor view and paste this block markup into it:

<!-- wp:image {	"metadata":{
		"bindings":{
			"url":{
				"source":"core/post-meta",
				"args":{
					"key":"projectslug_image_url"
				}
			},
			"alt":{
				"source":"core/post-meta",
				"args":{
					"key":"projectslug_image_alt"
				}
			}
		}
	}
} -->
<figure class="wp-block-image">
<img src="" alt="" />
</figure>
<!-- /wp:image -->

If you recall from the previous section, the bindings property for a block can contain multiple attributes. Take note of the structure in comparison to the Paragraph block from the previous section.

Once you’ve added the code, switch back to the Visual Editor. Your Image block should look like this:

As you can see, the UI around the Image block is a little nicer by default. It provides a message that the block is connected to a custom field. If you open your sidebar panel for the block, you should also see the same message for the Alternative Text field.

The most important thing is that both the image upload and alt text field should be locked from editing.

Now go to your Custom Fields panel in the post editor and enter a custom image URL for the projectslug_image_url meta key and custom text for  projectslug_image_alt.

Once you’ve saved your fields and the post, the Image block should appear with the correct image and alt text in the UI:

Adding a fallback meta value

The Core register_meta() function lets you register a default field. If you set this when registering your meta key, it will appear as the default value until the user has set the meta value.

Let’s revisit the code where you registered the meta keys for the Image block in the previous section. Now add a new default argument for the projectslug_image_url meta. In the example below, you can see that I’ve set this to an image URL in my theme folder:

register_meta(
	'post',
	'projectslug_image_url',
	array(
		'show_in_rest'      => true,
		'single'            => true,
		'type'              => 'string',
		'sanitize_callback' => 'esc_url_raw',
		'default'           => get_theme_file_uri( 'assets/images/default.jpg' )
	)
);

This is especially useful if you want to output a default when a user hasn’t entered a custom value. Here is what the Image block looks like with the default set for the projectslug_image_url meta key:

You are more likely to use custom fields within WordPress’s template or patterns systems than in the Post Editor. And we’ve barely even scratched the surface of how you will use this in your day-to-day work. This is meant as a starting point for you to build your own solutions.

The current limitations and the future of the Block Bindings API

I bet you’re chomping at the bits to begin implementing this in your own projects—I know I am!

But before you take a nosedive into the deep end, I want you to understand what’s possible in WordPress 6.5 vs. what’s coming in future releases.

The biggest limitation is what blocks and attributes you can bind data to. The list is short for WordPress 6.5, but you can do a lot with a little:

Supported BlocksSupported Attributes
Imageurl, alt, title
Paragraphcontent
Headingcontent
Buttonurl, text, linkTarget, rel

There is no custom block support or way to define additional supported attributes. But this is only the beginning, and it’s a very solid start to one of the most exciting developer features to land in WordPress.

There is a huge list of planned features that you can look forward to with WordPress 6.6 and beyond:

  • Additional block and attribute support based on feedback (note that the bindings rely heavily on what’s possible with the HTML API).
  • An opt-in mechanism so that any block can enable bindings.
  • Making the editor APIs public, giving you more control over the user experience.
  • An interface for editing the custom field values directly in the editor when a binding exists (yes, you read that right: a block-native custom fields editing experience).
  • The addition of more Core sources for data beyond custom fields like site data, user data, and more.

Up next: creating custom bindings sources

If you’re interested in going even deeper into the Block Bindings API, stay tuned into the Developer Blog. The next post in this series will teach you how to register your own bindings sources.

In the meantime, I encourage you to explore what’s possible with custom fields. And please share all of your feedback—good or bad—in the comments. I want to see this feature continue to evolve in the coming WordPress releases.

Resources

Props to @santosguillamot, @bph, @ndiego, and @bjmcsherry for providing feedback and reviewing this post.

43 responses to “Introducing Block Bindings, part 1: connecting custom fields”

  1. Joe Hoyle Avatar

    IMO the biggest change to the block editor since its inception! Really fantastic to see progress here, and I think the API is shaping up to meet requirements I’ve encountered when trying to build sites with the block editor. Excited to see how things progress on the UI too.

  2. WebMan Design</title>
	<path fill="currentColor" d="M13.6052 0.923525C16.1432 0.923525 18.6137 1.67953 20.7062 3.09703C22.7447 4.47403 24.3512 6.41803 25.3097 8.68603C26.9837 12.6415 26.5382 17.164 24.1352 20.7145C22.7582 22.753 20.8142 24.3595 18.5462 25.318C14.5907 26.992 10.0682 26.5465 6.51772 24.1435C4.47922 22.7665 2.87272 20.8225 1.91422 18.5545C0.240225 14.599 0.685725 10.0765 3.08872 6.52603C4.46572 4.48753 6.40973 2.88103 8.67772 1.92253C10.2302 1.26103 11.9177 0.923525 13.6052 0.923525ZM13.6052 0.113525C6.15322 0.113525 0.105225 6.16153 0.105225 13.6135C0.105225 21.0655 6.15322 27.1135 13.6052 27.1135C21.0572 27.1135 27.1052 21.0655 27.1052 13.6135C27.1052 6.16153 21.0572 0.113525 13.6052 0.113525Z" />
	<path fill="currentColor" d="M2.36011 13.6133C2.36011 17.9198 4.81711 21.8618 8.70511 23.7383L3.33211 9.03684C2.68411 10.4813 2.36011 12.0338 2.36011 13.6133ZM21.2061 13.0463C21.2061 11.6558 20.7066 10.6973 20.2746 9.94134C19.8426 9.18534 19.1676 8.22684 19.1676 7.30884C19.1676 6.39084 19.9506 5.31084 21.0576 5.31084H21.2061C16.6296 1.11234 9.51511 1.42284 5.31661 6.01284C4.91161 6.45834 4.53361 6.93084 4.20961 7.43034H4.93861C6.11311 7.43034 7.93561 7.28184 7.93561 7.28184C8.54311 7.24134 8.61061 8.13234 8.00311 8.21334C8.00311 8.21334 7.39561 8.28084 6.72061 8.32134L10.8111 20.5118L13.2681 13.1273L11.5131 8.32134C10.9056 8.28084 10.3386 8.21334 10.3386 8.21334C9.73111 8.17284 9.79861 7.25484 10.4061 7.28184C10.4061 7.28184 12.2691 7.43034 13.3626 7.43034C14.4561 7.43034 16.3596 7.28184 16.3596 7.28184C16.9671 7.24134 17.0346 8.13234 16.4271 8.21334C16.4271 8.21334 15.8196 8.28084 15.1446 8.32134L19.2081 20.4173L20.3691 16.7453C20.8821 15.1388 21.1926 14.0048 21.1926 13.0328L21.2061 13.0463ZM13.7946 14.5853L10.4196 24.3998C12.6876 25.0613 15.1041 25.0073 17.3316 24.2243L17.2506 24.0758L13.7946 14.5853ZM23.4741 8.21334C23.5281 8.59134 23.5551 8.98284 23.5551 9.37434C23.5551 10.5218 23.3391 11.8043 22.7046 13.3973L19.2621 23.3333C24.5271 20.2688 26.4036 13.5593 23.4741 8.21334Z" />
</svg>				</a>
			</figure>

			<figure class="wp-block-image global-footer__wporg-logo-full">
				<a href="https://wordpress.org/">
					<svg xmlns="http://www.w3.org/2000/svg" role="img" width="329" height="52" viewBox="0 0 329 52">
	<title>WordPress.org</title>
	<path fill="currentColor" d="M4.33 26a21.68 21.68 0 0 0 12.22 19.5L6.21 17.18A21.66 21.66 0 0 0 4.33 26ZM26.38 27.89l-6.5 18.89a21.31 21.31 0 0 0 6.12.89 21.77 21.77 0 0 0 7.2-1.23 1.429 1.429 0 0 1-.16-.3l-6.66-18.25Z"/>
	<path fill="currentColor" d="M26 0a26 26 0 1 0 0 52 26 26 0 0 0 0-52Zm20.27 39.66a24.47 24.47 0 0 1-29.78 8.86 24.49 24.49 0 0 1-13-13 24.4 24.4 0 0 1 5.23-26.8 24.46 24.46 0 0 1 26.79-5.24 24.49 24.49 0 0 1 13 13 24.42 24.42 0 0 1-2.25 23.17l.01.01Z"/>
	<path fill="currentColor" d="M45 15.61c.103.736.153 1.477.15 2.22a20.38 20.38 0 0 1-1.65 7.76l-6.61 19.14A21.65 21.65 0 0 0 45 15.61ZM40.63 24.91a11.45 11.45 0 0 0-1.79-6c-1.1-1.78-2.13-3.29-2.13-5.08A3.76 3.76 0 0 1 40.35 10h.28A21.65 21.65 0 0 0 7.9 14.1h1.39c2.27 0 5.78-.27 5.78-.27a.9.9 0 0 1 .13 1.79s-1.17.13-2.47.2l7.88 23.47 4.75-14.22L22 15.84c-1.17-.07-2.27-.2-2.27-.2a.9.9 0 0 1 .14-1.79s3.57.27 5.7.27c2.13 0 5.78-.27 5.78-.27a.9.9 0 0 1 .14 1.79s-1.18.13-2.48.2l7.83 23.29 2.23-7.08a25.171 25.171 0 0 0 1.56-7.14ZM145.83 19.3h-10.34v1.1c3.23 0 3.75.69 3.75 4.79v7.4c0 4.1-.52 4.85-3.75 4.85-2.48-.35-4.16-1.68-6.47-4.22l-2.66-2.89c3.58-.63 5.49-2.89 5.49-5.43 0-3.18-2.72-5.6-7.8-5.6h-10.17v1.1c3.24 0 3.76.69 3.76 4.79v7.4c0 4.1-.52 4.85-3.76 4.85v1.1h11.5v-1.1c-3.24 0-3.76-.75-3.76-4.85v-2.08h1l6.42 8h16.81c8.26 0 11.85-4.39 11.85-9.65 0-5.26-3.61-9.56-11.87-9.56Zm-24.21 9.42V21H124a3.551 3.551 0 0 1 3.76 3.87 3.536 3.536 0 0 1-3.76 3.85h-2.38Zm24.38 8h-.4c-2.08 0-2.37-.52-2.37-3.18V21H146c6 0 7.11 4.39 7.11 7.8S152 36.75 146 36.75v-.03ZM93.49 13.52H82.62v1.16c3.7 0 4.22 1 3.07 4.39l-4 11.78L76 13.52h-1.1l-5.85 17.33-3.87-11.78c-1.22-3.59-.29-4.39 3.12-4.39v-1.16H55.47v1.16c3.35 0 4.28.86 5.66 5.08l6.42 19.76h.75l6-18.08 5.9 18.08h.8l6.59-19.76c1.44-4.22 2.31-5.08 5.95-5.08l-.05-1.16ZM101.34 18.55c-6.35 0-11.55 4.68-11.55 10.34s5.2 10.4 11.55 10.4c6.35 0 11.56-4.68 11.56-10.4 0-5.72-5.2-10.34-11.56-10.34Zm0 18.89c-5.31 0-7.16-4.74-7.16-8.55 0-3.81 1.85-8.55 7.16-8.55 5.31 0 7.23 4.79 7.23 8.55 0 3.76-1.85 8.55-7.23 8.55ZM170.67 13.52h-12v1.16c3.88 0 4.57.92 4.57 6.7v9.24c0 5.78-.69 6.76-4.57 6.76v1.16H172v-1.16c-3.88 0-4.57-1-4.57-6.76v-2.83h3.29c6 0 9.25-3.12 9.25-7.11s-3.35-7.16-9.3-7.16Zm0 12.13h-3.29v-10h3.29c3.24 0 4.74 2.31 4.74 5.08s-1.5 4.92-4.74 4.92ZM219.32 34.15c-.52 1.9-1.15 2.6-5.26 2.6h-.81c-3 0-3.52-.7-3.52-4.8v-2.66c4.51 0 4.85.41 4.85 3.41h1.1v-8.61h-1.1c0 3-.34 3.41-4.85 3.41V21h3.18c4.1 0 4.74.69 5.26 2.6l.28 1.1h.93l-.38-5.4h-17v1.1c3.23 0 3.75.69 3.75 4.79v7.4c0 3.75-.44 4.69-3 4.83-2.42-.37-4.09-1.69-6.37-4.2l-2.65-2.89c3.58-.63 5.49-2.89 5.49-5.43 0-3.18-2.72-5.6-7.8-5.6h-10.17v1.1c3.23 0 3.75.69 3.75 4.79v7.4c0 4.1-.52 4.85-3.75 4.85v1.1h11.49v-1.1c-3.23 0-3.75-.75-3.75-4.85v-2.08h1l6.41 8h23.75l.35-5.43h-.87l-.31 1.07ZM189 28.72V21h2.37a3.542 3.542 0 0 1 3.75 3.87 3.532 3.532 0 0 1-.998 2.77 3.532 3.532 0 0 1-2.752 1.05l-2.37.03ZM234.52 27.91l-3.18-1.56c-2.78-1.27-4-2.08-4-3.59 0-1.51 1.5-2.36 3.12-2.36 3.06 0 4.57 2.25 5 5h1.21v-6.85h-1.09a3.415 3.415 0 0 1-.75 1.56 7.25 7.25 0 0 0-4.51-1.5c-3.58 0-6.18 2.36-6.18 5.14 0 2.54 1.73 4.45 4 5.54l3.29 1.56c2.37 1.1 3.7 2.26 3.7 3.76 0 1.73-1.5 2.77-3.35 2.77-3.41 0-6.07-2.25-6.53-6.06h-1.15v8h1.09a4.194 4.194 0 0 1 .93-2 8.481 8.481 0 0 0 5.2 2c3.87 0 7-2.54 7-6.18.07-1.77-1.03-3.9-3.8-5.23ZM252 27.91l-3.18-1.56c-2.78-1.27-4-2.08-4-3.59 0-1.51 1.5-2.36 3.12-2.36 3.06 0 4.57 2.25 5 5h1.21v-6.85H253a3.415 3.415 0 0 1-.75 1.56 7.25 7.25 0 0 0-4.51-1.5c-3.58 0-6.18 2.36-6.18 5.14 0 2.54 1.73 4.45 4 5.54l3.29 1.56c2.37 1.1 3.7 2.26 3.7 3.76 0 1.73-1.5 2.77-3.35 2.77-3.41 0-6.07-2.25-6.53-6.06h-1.15v8h1.09a4.194 4.194 0 0 1 .93-2 8.481 8.481 0 0 0 5.2 2c3.87 0 7.05-2.54 7.05-6.18.07-1.77-1.03-3.9-3.79-5.23ZM277.56 18.75a10.481 10.481 0 0 0-10.68 10.17 10.47 10.47 0 0 0 10.68 10.16c5.9 0 10.71-4.58 10.71-10.16s-4.81-10.17-10.71-10.17Zm0 19c-5.52 0-7.63-4.91-7.63-8.88 0-3.97 2.07-8.87 7.63-8.87 5.56 0 7.66 4.94 7.66 8.92 0 3.98-2.11 8.88-7.66 8.88v-.05ZM301.71 33.79l-3.14-3.69c3.63-.38 5.71-2.59 5.71-5.38 0-3-2.44-5.42-6.89-5.42h-8.47v.7c2.66 0 3.05.51 3.05 3.72v10.39c0 3.21-.39 3.76-3.05 3.76v.67h8.66v-.67c-2.66 0-3.05-.55-3.05-3.76v-4H296l6.35 8.44h5.29v-.67c-1.88-.24-4.03-1.88-5.93-4.09ZM294.53 29v-8.52h2.82c2.79 0 4.08 1.93 4.08 4.24 0 2.31-1.29 4.28-4.08 4.28h-2.82ZM319.6 30.59v.64c2.21 0 3 .7 3 2.08 0 2.89-2.5 4.39-5.29 4.39-5.93 0-7.6-4.81-7.6-8.78 0-3.97 1.86-8.92 7-8.92 3.59 0 6.09 2.54 7 6.7h.64v-7h-.64a3.281 3.281 0 0 1-1.09 1.83 8.203 8.203 0 0 0-6-2.73 10.167 10.167 0 0 0-9.851 10.165 10.169 10.169 0 0 0 9.851 10.165c3.34 0 4.78-1.66 8.34-1.66V35c0-3.21.39-3.75 3.05-3.75v-.64l-8.41-.02ZM261.9 34.77a2.061 2.061 0 1 0 .288 4.112 2.061 2.061 0 0 0-.288-4.112Z"/>
</svg>				</a>
			</figure>
		

			</div>
	

	
	<ul class="wp-block-social-links is-style-logos-only is-layout-flex wp-block-social-links-is-layout-flex">
		<li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a href="https://www.facebook.com/WordPress/" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Visit our Facebook page</span></a></li>
		<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a href="https://www.x.com/WordPress" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">Visit our X (formerly Twitter) account</span></a></li>
		<li class="wp-social-link wp-social-link-instagram  wp-block-social-link"><a href="https://www.instagram.com/wordpress/" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Visit our Instagram account</span></a></li>
		<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a href="https://www.linkedin.com/company/wordpress" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Visit our LinkedIn account</span></a></li>
		<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a href="https://www.youtube.com/wordpress" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Visit our YouTube channel</span></a></li>
	</ul> 

			<!-- Use an image so it can have the MrsEaves font. -->
		
		<figure data-wp-context="{"imageId":"67e0f484684c8"}" data-wp-interactive="core/image" class="wp-block-image is-resized global-footer__code_is_poetry wp-lightbox-container">
			<img data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles"
				src="../../../../../s.w.org/style/images/code-is-poetry-for-dark-bg.svg"
				alt="Code is Poetry"
				width="188"
				height="13"
			/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button>
		</figure> 

	</div> 
</footer></div></div>
<script type="application/json" id="wp-script-module-data-@wordpress/interactivity">
{"state":{"core/image":{"metadata":{"67e0f4843cb7f":{"uploadedSrc":"https://developer.wordpress.org/news/files/2024/02/bindings-movie-meta.webp","figureClassNames":"wp-block-image alignwide size-full","figureStyles":null,"imgClassNames":"wp-image-2783","imgStyles":null,"targetWidth":2048,"targetHeight":1300,"scaleAttr":false,"ariaLabel":"Enlarged image","alt":"Screenshot of the \"Your Name\" movie page from the WP Movies demo. It shows text and images about the movie. Two sections of text are highlighted to show areas that could be metadata."},"67e0f4843d3b0":{"uploadedSrc":"https://developer.wordpress.org/news/files/2024/02/bindings-custom-fields-preference.webp","figureClassNames":"wp-block-image alignwide size-full","figureStyles":null,"imgClassNames":"wp-image-2784","imgStyles":null,"targetWidth":1876,"targetHeight":1358,"scaleAttr":false,"ariaLabel":"Enlarged image","alt":"A panel titled \"Preferences\" with multiple tabs. The \"General\" tab is currently open, and the \"Custom Fields\" option is ticked on."},"67e0f4843d915":{"uploadedSrc":"https://developer.wordpress.org/news/files/2024/02/bindings-custom-field-mood.webp","figureClassNames":"wp-block-image alignwide size-full has-custom-border","figureStyles":null,"imgClassNames":"has-border-color has-light-grey-2-border-color wp-image-2785","imgStyles":"border-width:1px","targetWidth":2048,"targetHeight":1060,"scaleAttr":false,"ariaLabel":"Enlarged image","alt":"WordPress post editor with an empty content area. The Custom Fields panel has a key set with the name of \"projectslug_mood\"."},"67e0f4843de49":{"uploadedSrc":"https://developer.wordpress.org/news/files/2024/02/bindings-custom-field-paragraph.webp","figureClassNames":"wp-block-image alignwide size-full has-custom-border","figureStyles":null,"imgClassNames":"has-border-color has-light-grey-2-border-color wp-image-2786","imgStyles":"border-width:1px","targetWidth":2048,"targetHeight":1060,"scaleAttr":false,"ariaLabel":"Enlarged image","alt":"WordPress post editor with a paragraph that reads: \"Jammin