💥 TRENDING: Block editor/reference guides/block api/block registration - Full Gallery 2025

Registration

Block registration API reference.

You can use the functions documented on this page to register a block with JavaScript only on the client, but the recommended method is to register new block types also with PHP on the server using the `block.json` metadata file. See metadata documentation for complete information

Learn how to create your first block for the WordPress block editor. From setting up your development environment, tools, and getting comfortable with the new development model, this tutorial covers all you need to know to get started with creating blocks.

registerBlockType

  • Type: Function

Every block starts by registering a new block type definition. To register, you use the registerBlockType function from the wp-blocks package. The function takes two arguments, a block name and a block configuration object.

Block Name

  • Type: String

The name for a block is a unique string that identifies a block. Names have to be structured as namespace/block-name, where namespace is the name of your plugin or theme.

// Registering my block with a unique name
registerBlockType( 'my-plugin/book', {} );

Note: A block name can only contain lowercase alphanumeric characters and dashes, and must begin with a letter.

Note: This name is used on the comment delimiters as <!-- wp:my-plugin/book -->. Those blocks provided by core don’t include a namespace when serialized.

Important: Choose Your Namespace Carefully

Block names cannot be changed later without consequences. The block name is stored in the post content of every post using that block, so changing it requires editing all affected posts or running database scripts.

Namespace Best Practices

  • Use your actual plugin/theme name: my-awesome-plugin/block-name
  • Avoid generic names like editorial/, block/, or create-block/
  • Use the same namespace for all blocks in your plugin/theme
  • Make it unique to prevent conflicts with other plugins
// Good examples
registerBlockType( 'my-company-blocks/hero', {} );
registerBlockType( 'awesome-gallery-plugin/slideshow', {} );

// Avoid these
registerBlockType( 'create-block/example', {} ); // Too generic
registerBlockType( 'block/content', {} ); // Too generic

Note: registerBlockCollection() only works with blocks from a single namespace.

Block configuration

  • Type: Object [ { key: value } ]

A block requires a few properties to be specified before it can be registered successfully. These are defined through a configuration object, which includes the following:

title

  • Type: String

This is the display title for your block, which can be translated with our translation functions. The title will display in the Inserter and in other areas of the editor.

// Our data object
title: __( 'Book' );

Note: To keep your block titles readable and accessible in the UI, try to avoid very long titles.

description (optional)

  • Type: String

This is a short description for your block, which can be translated with our translation functions. This will be shown in the Block Tab in the Settings Sidebar.

description: __( 'Block showing a Book card.' );

category

  • Type: String [ text | media | design | widgets | theme | embed ]

Blocks are grouped into categories to help users browse and discover them.

The core provided categories are:

  • text
  • media
  • design
  • widgets
  • theme
  • embed
// Assigning to the 'widgets' category
category: 'widgets',

Plugins and Themes can also register custom block categories.

icon (optional)

  • Type: String | Object

An icon property should be specified to make it easier to identify a block. These can be any of WordPress’ Dashicons, or a custom svg element.

// Specifying a dashicon for the block
icon: 'book-alt',

// Specifying a custom svg for the block
icon: <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0V0z" /><path d="M19 13H5v-2h14v2z" /></svg>,

Note: Custom SVG icons are automatically wrapped in the wp.primitives.SVG component to add accessibility attributes (aria-hidden, role, and focusable).

An object can also be passed as icon, in this case, icon, as specified above, should be included in the src property.

Besides src the object can contain background and foreground colors, these colors will appear with the icon when they are applicable e.g.: in the inserter.

icon: {
    // Specifying a background color to appear with the icon e.g.: in the inserter.
    background: '#7e70af',
    // Specifying a color for the icon (optional: if not set, a readable color will be automatically defined)
    foreground: '#fff',
    // Specifying an icon for the block
    src: <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h24v24H0V0z" /><path d="M19 13H5v-2h14v2z" /></svg>,
} ,

keywords (optional)

  • Type: Array

Sometimes a block could have aliases that help users discover it while searching. For example, an image block could also want to be discovered by photo. You can do so by providing an array of terms (which can be translated).

// Make it easier to discover a block with keyword aliases.
// These can be localised so your keywords work across locales.
keywords: [ __( 'image' ), __( 'photo' ), __( 'pics' ) ],

styles (optional)

  • Type: Array

Block styles can be used to provide alternative styles to block. It works by adding a class name to the block’s wrapper. Using CSS, a theme developer can target the class name for the block style if it is selected.

// Register block styles.
styles: [
    // Mark style as default.
    {
        name: 'default',
        label: __( 'Rounded' ),
        isDefault: true
    },
    {
        name: 'outline',
        label: __( 'Outline' )
    },
    {
        name: 'squared',
        label: __( 'Squared' )
    },
],

Plugins and Themes can also register custom block styles for existing blocks.

attributes (optional)

  • Type: Object

Attributes provide the structured data needs of a block. They can exist in different forms when they are serialized, but they are declared together under a common interface.

// Specifying my block attributes
attributes: {
    cover: {
        type: 'string',
        source: 'attribute',
        selector: 'img',
        attribute: 'src',
    },
    author: {
        type: 'string',
        source: 'html',
        selector: '.book-author',
    },
    pages: {
        type: 'number',
    },
},

example (optional)

  • Type: Object

Example provides structured example data for the block. This data is used to construct a preview for the block to be shown in the Inspector Help Panel when the user mouses over the block and in the Styles panel when the block is selected.

The data provided in the example object should match the attributes defined. For example:

example: {
    attributes: {
        cover: 'https://example.com/image.jpg',
        author: 'William Shakespeare',
        pages: 500
    },
},

If example is not defined, the preview will not be shown. So even if no attributes are defined, setting an empty example object example: {} will trigger the preview to show.

It’s also possible to extend the block preview with inner blocks via innerBlocks. For example:

example: {
    attributes: {
        cover: 'https://example.com/image.jpg',
    },
    innerBlocks: [
        {
            name: 'core/paragraph',
            attributes: {
                /* translators: example text. */
                content: __(
                    'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis.'
                ),
            },
        },
    ],
},

It’s also possible to define the width of the preview container in pixels via viewportWidth. For example:

example: {
    attributes: {
        cover: 'https://example.com/image.jpg',
    },
    viewportWidth: 800
},

variations (optional)