If a block is inside a reusable block, has_block doesn't return true.
Steps to reproduce the behavior:
if (has_block('prfx/myblock')) {
wp_register_script('my-script', plugins_url( 'dist/assets/myscript.min.js', dirname( __FILE__ )), array(), null, true );
wp_enqueue_script('my-script');
}
Could has_block function also validate with blocks inside reusable blocks?
Desktop:
In the meantime, this function will do the job:
function has_reusable_block( $block_name, $id = false ){
$id = (!$id) ? get_the_ID() : $id;
if( $id ){
if ( has_block( 'block', $id ) ){
// Check reusable blocks
$content = get_post_field( 'post_content', $id );
$blocks = parse_blocks( $content );
if ( ! is_array( $blocks ) || empty( $blocks ) ) {
return false;
}
foreach ( $blocks as $block ) {
if ( $block['blockName'] === 'core/block' && ! empty( $block['attrs']['ref'] ) ) {
if( has_block( $block_name, $block['attrs']['ref'] ) ){
return true;
}
}
}
}
}
return false;
}
Maybe the name of the function should be sth like has_block_in_reusable instead of has_reusable_block, anyway...
Possible duplicate of #17048.
Most helpful comment
In the meantime, this function will do the job:
Maybe the name of the function should be sth like has_block_in_reusable instead of has_reusable_block, anyway...