register_block_type( string|WP_Block_Type $block_type, array $args = array() )

Registers a block type. The recommended way is to register a block type using the metadata stored in the block.json file.

Parameters Parameters


(string|WP_Block_Type) (Required) Block type name including namespace, or alternatively a path to the JSON file with metadata definition for the block, or a path to the folder where the block.json file is located, or a complete WP_Block_Type instance. In case a WP_Block_Type is provided, the $args parameter will be ignored.


(array) (Optional) Array of block type arguments. Accepts any public property of WP_Block_Type. See WP_Block_Type::__construct() for information on accepted arguments.

Default value: array()

Top ↑

Return Return

(WP_Block_Type|false) The registered block type on success, or false on failure.

Top ↑

Source Source

File: wp-includes/blocks.php

function register_block_type( $block_type, $args = array() ) {
	if ( is_string( $block_type ) && file_exists( $block_type ) ) {
		return register_block_type_from_metadata( $block_type, $args );

	return WP_Block_Type_Registry::get_instance()->register( $block_type, $args );

Top ↑

Changelog Changelog

Version Description
5.8.0 First param accepts a path to the block.json file.
5.0.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note 1 content
    Contributed by jmau

    You can pass custom $attributes which can be used both on editor and front-end in render_callback :

    register_block_type( 'my_namespace/my_block', [
    	'render_callback' => 'render_callback',
    	'attributes'      => [
    		'some_string' => [
    			'default' => 'default string',
    			'type'    => 'string'
    		'some_array'  => [
    			'type'  => 'array',
    			'items' => [
    				'type' => 'string',
    ] );

    Important (tested in 5.0.3) : in case of array attributes you MUST specify items type. Otherwise it would trigger a notice.

  2. Skip to note 2 content
    Contributed by Shah Alom

    Here is an example snippet that I use for one of my own projects

    function mcqa_register_block_related_quiz() {
        if ( ! function_exists( 'register_block_type' ) ) {
            // Block editor is not available.
        register_block_type( 'mcqac/related-quiz', array(
            'editor_script' => 'mcqac-related-quiz-block-script',
            'editor_style'  => 'mcqac-related-quiz-block-editor-style',
            'style'         => 'mcqac-related-quiz-block-frontend-style',
        ) );
    // Hook: Editor assets.
    add_action( 'init', 'mcqa_register_block_related_quiz' );
  3. Skip to note 3 content
    Contributed by livemesh

    The arguments to register_block_type() function match the instance vars of WP_Block_Type class, i.e., attributes, render_callback, editor_script, editor_style, script and style.

                    'attributes' => array(
                        'align' => array(
                            'type' => 'string',
                            'enum' => array( 'left', 'center', 'right', 'wide', 'full' ),
                        'day' => array(
                            'type' => 'integer',
                        'month' => array(
                            'type' => 'integer',
                        'year' => array(
                            'type' => 'integer',
                    'render_callback' => 'render_block_my_custom_blocks_calendar',
                    'editor_script'   => 'calendar-editor-js',
                    'editor_style'    => 'calendar-editor-css',
                    'script'          => 'calendar-frontend-js',
                    'style'           => 'calendar-frontend-css',

    This is because the register_block_type() function utilizes the name and arguments provided in the function call to create a new instance of WP_Block_Type class and the instance thus created is registered with the global WP_Block_Type_Registry instance.

You must log in before being able to contribute a note or feedback.