如何使用HAS_BLOCK()瞄准块变化?

时间:2021-07-28 作者:Marin Carroll

我们经常使用has\\u块,仅当存在某个块时,才将脚本排队。用vimeo这样的东西你以前会写has_block(\'core-embed/vimeo\').

现在,为vimeo变体而不是所有变体将脚本排队的正确方法是什么core/embed \'s

1 个回复
最合适的回答,由SO网友:birgire 整理而成

我们可以尝试使用has_block(), has_blocks()parse_blocks() 查找具有给定providerNameSlug 属性

未经测试的建议:

function has_block_embed_by_provider_wpse( $provider, $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;
        }
    }
   
    if ( has_block ( \'embed\', $post ) ) {
        $blocks = parse_blocks ( $post );
        foreach( (array) $blocks as $block ) {
            if ( isset( $block[\'attrs\'][\'providerNameSlug\'] ) 
                 && $provider === $block[\'attrs\'][\'providerNameSlug\'] 
            ) {
                return true;
            }
        }
    }
    return false;
}

Usage Examples:

has_block_embed_by_provider_wpse( \'vimeo\' )

has_block_embed_by_provider_wpse( \'vimeo\', $content )

has_block_embed_by_provider_wpse( \'vimeo\', $post )

has_block_embed_by_provider_wpse( \'vimeo\', 123 )

has_block_embed_by_provider_wpse( \'vimeo\', get_post( 123 ) )

相关推荐