Determines whether a $post or a string contains a specific block type.
Description
This test optimizes for performance rather than strict accuracy, detecting whether the block type exists but not validating its structure and not checking synced patterns (formerly called reusable blocks). For strict accuracy, you should use the block parser on post content.
See also
Parameters
$block_name
stringrequired- Full block type to look for.
$post
int|string|WP_Post|nulloptional- Post content, post ID, or post object.
Defaults to global $post.Default:
null
Source
function has_block( $block_name, $post = null ) {
if ( ! has_blocks( $post ) ) {
return false;
}
if ( ! is_string( $post ) ) {
$wp_post = get_post( $post );
if ( $wp_post instanceof WP_Post ) {
$post = $wp_post->post_content;
}
}
/*
* Normalize block name to include namespace, if provided as non-namespaced.
* This matches behavior for WordPress 5.0.0 - 5.3.0 in matching blocks by
* their serialized names.
*/
if ( ! str_contains( $block_name, '/' ) ) {
$block_name = 'core/' . $block_name;
}
// Test for existence of block by its fully qualified name.
$has_block = str_contains( $post, '<!-- wp:' . $block_name . ' ' );
if ( ! $has_block ) {
/*
* If the given block name would serialize to a different name, test for
* existence by the serialized form.
*/
$serialized_block_name = strip_core_block_namespace( $block_name );
if ( $serialized_block_name !== $block_name ) {
$has_block = str_contains( $post, '<!-- wp:' . $serialized_block_name . ' ' );
}
}
return $has_block;
}
Changelog
Version | Description |
---|---|
5.0.0 | Introduced. |
If you are wanting to check if a custom (non core block) is for a page or post, include the namespace/name-of-block:
The function doesn’t work in reusable blocks. If you need to check blocks within a reusable block you need to parse content first. Here is my simplified functional solution (although OOP would do bit better):
Now you can call
wpdocs_enhanced_has_block( 'core/heading' )
to check for heading block both in post content and if not found in all reusable blocks within the post.If adding a “number” value for $post make sure it’s an integer (if a string – like ‘5’) sneaks in you will get a return of false.
I just want to know if Gutenberg block exist to create the logic, i have a hybrid kind of site, previous answers only had specific blocks with has_block, didnt suit me so i found this.
/
before the name. So, this example should be:or
core/block
, it returns true for the Group blockcore/group
. i.e. if you select multiple blocks and group them together, thehas_block()
will return true for a check against a block inside the group.