has_block( string $block_name, int|string|WP_Post|null $post = null ): bool
Determines whether a $post or a string contains a specific block type.
Contents
Description
This test optimizes for performance rather than strict accuracy, detecting whether the block type exists but not validating its structure and not checking reusable blocks. For strict accuracy, you should use the block parser on post content.
See also
Parameters
-
$block_name
string Required -
Full block type to look for.
-
$post
int|string|WP_Post|null Optional -
Post content, post ID, or post object.
Defaults to global $post.Default:
null
Return
bool Whether the post content contains the specified block.
Source
File: wp-includes/blocks.php
.
View all references
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 ( false === strpos( $block_name, '/' ) ) {
$block_name = 'core/' . $block_name;
}
// Test for existence of block by its fully qualified name.
$has_block = false !== strpos( $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 = false !== strpos( $post, '<!-- wp:' . $serialized_block_name . ' ' );
}
}
return $has_block;
}
Changelog
Version | Description |
---|---|
5.0.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.
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.
Top ↑
Feedback
Blocks will always have a namespace followed by
/
before the name. So, this example should be:or
— By Pea Lutz —
Unlike reusable blocks
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. — By desertsailors —