检查post_content中的古腾堡块


20

如果页面上存在某个古腾堡块,我正在设计一种具有不同样式的设计。换句话说,如果第一个块是定制的Gutenberg块,则由于做出了设计选择,post_title会呈现在其他位置。

WordPress中是否有任何功能可以获取post_content中存在的所有古腾堡块的列表?


1
有一个网站whichblocks.com当您键入网页URL时,它将扫描页面并找出页面中使用了哪些gutenberg块。
Teena Babu

Answers:


29

WordPress 5.0+具有以下功能:parse_blocks()。要查看帖子中的第一个块是否为“标题”块,请执行以下操作:

$post = get_post(); 

if ( has_blocks( $post->post_content ) ) {
    $blocks = parse_blocks( $post->post_content );

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}

谢谢!我找不到此功能。有趣的是,我的自定义代码基本上可以完成相同的操作,但是所需的代码却少得多!无论如何,由于它是正确的内置功能,因此被标记为已接受。
Jeffrey von Grumbkow

3
该功能已被弃用(但仅重命名),has_blocks($blockName)而应改用:github.com/WordPress/gutenberg/pull/8631/commits/…。还有has_block()(没有“ s”)。
Nico Prat

@NicoPrat我们已经更新了答案以反映正确的方法
Jeffrey von Grumbkow

请记住,目前存在一个已知问题,其中parse_blocks()返回不存在的块作为NULL数组元素-core.trac.wordpress.org/ticket/45312
Lee,

2

我在撰写本文时使用的解决方案请检查Gutenberg HTML注释的post_content。由于未来的古腾堡(Gutenberg)更改,这将来可能无法正常工作。

<?php    
$post_content = get_the_content( get_the_ID() ); // Get the post_content
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Get all matches in between <!-- /wp: --> strings

// $blocks[1] contains the names of all the blocks present in the post_content
if ( in_array( 'heading', $blocks[1] ) ) {
    // Post content contains a wp:heading block
}
else {
    // Post content does not contain a wp:heading block
}

0

从5.0版本开始,已将Gutenberg集成到核心中,不再使用这些功能。我想,但尚未确认这些功能仍然存在于Gutenberg独立插件中。

代替gutenberg_content_has_blocks使用has_blocks

代替gutenberg_parse_blocks使用parse_blocks


2
@JeffreyvonGrumbkow的事情是,ian-hoyte必须低声编辑或评论=)
honk31
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.