In my project I use WordPress as a backend for a native app, I have implemented two custom post types. For booth post types only a limited set of blocks should be available. That’s simply due to the fact, that not all contents can be rendered/used in the app.
Filter allowed blocks
We can use the filter allowed_block_types
to allow only a limited set of blocks that can be used or allow/disallow all of them. If you just want to allow some blocks for a specific post type, use the filter like this:
function cpt_allowed_blocks( $allowed_block_types, $post ) {
if ( 'my_post_type' === $post->post_type ) {
return array(
'core/paragraph',
'core/list',
'core/quote',
'core/code',
'core/table',
'core/image',
'core/video',
'core/audio',
);
}
return $allowed_block_types;
}
add_action( 'allowed_block_types', 'cpt_allowed_blocks', 10, 2 );
In the callback function we first check, if we are currently editing our custom post type. If we do, we return an array with only the block included we want allow in our post type. If not, we return the original value.
This original value can either be an array or a boolean. If you return true
, all blocks are allowed. If you return false
no blocks are allowed.
Bonus: Set a blocks template for a post type
If you limit the blocks you want to allow, you probably want to ensure a specific layout in your post type. You can help with that by adding some blocks by default, every time an entry for that post type is created. This can be done when registering the post type:
function cpt_register_post_type() {
register_post_type(
'my_post_type',
array(
'label' => __( 'My Post Type', 'text_domain' ),
'supports' => array( 'title', 'editor' ),
'public' => true,
'show_ui' => true,
// ... other settings
'has_archive' => true,
'show_in_rest' => true,
'template' => array(
array(
'core/paragraph',
array(
'placeholder' => __( 'Lorem ...', 'text_domain' ),
),
),
array(
'core/image',
),
),
)
);
}
add_action( 'init', 'cpt_register_post_type' );
With the template
parameter, you can define a number of blocks to include every time a post type entry is created. Each block is represented by an array. For many blocks you can also set options. In this example we add a paragraph with a placeholder text (not content) and an image with no options. This image block will be in it’s “edit state”, just as if you have added it to a post yourself:
Conclusion
When working with custom post types, you can easily limit the blocks that are allowed to be used. Adding a template with some default blocks for new entries really increase the usability of your custom post types a lot.