我已经建立了一些自定义古腾堡区块使用ACF。我已经创建了一个块,我想在该块中显示页面标题,但前提是它是页面上的第一个块。如果该块也出现在页面较低的位置,我不希望它显示页面的标题。
我试过这个:
$post = get_post();
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
if ( $blocks[0]['blockName'] === 'acf/custom-block' ) {
}
}
它通过页面上的块进行解析,并查看该数组中的第一个块是否是我的自定义ACF块。上面的片段可以工作,但不是我想要的。是的,它正在检查内容中的第一个块是否是我的ACF自定义块,但这是检查整个页面,所以即使我将我的自定义块作为页面上的第一个块,但是在页面上还有我的自定义块的第二个实例,这个条件仍然会在较低的块上显示页面标题,因为技术上第一个块仍然是我的自定义块。
我需要的是一个条件语句,它检查这个块本身是否是页面上的第一个块,而不是检查页面上的第一个块是否是自定义块的实例。
这种条件在古腾堡有可能吗?
发布于 2020-04-22 17:46:43
下面是我想出的一个解决方案,它适用于Wordpress 5.4和ACF 5.8.9。
首先,您需要在functions.php中的某个地方使用这个函数:
/**
* Get ID of the first ACF block on the page
*/
function sg_get_first_block_id() {
$post = get_post();
if(has_blocks($post->post_content)) {
$blocks = parse_blocks($post->post_content);
$first_block_attrs = $blocks[0]['attrs'];
if(array_key_exists('id', $first_block_attrs)) {
return $first_block_attrs['id'];
}
}
}
此函数用于获取页面上第一个块的块id (如果该块具有块id )。(据我所见,只有ACF块具有块id属性。核心区块没有)。
现在,在块模板文件中可以这样做:
$block['id']
是每个块实例的唯一id。然后,我们将其与页面上第一个块的id进行比较。如果它们是相同的,则函数将返回true,并显示文章的标题。
我已经创建了一个全尺寸的背景图像和内容内部的自定义封面块。如果这是页面上的第一个块的话,我不想让这个块充当英雄元素。
通过在我的块模板文件中使用上述方法,如果它是页面上的第一个块,我可以在h1标记中而不是h2中显示自定义覆盖块标题。
我也不想隐藏普通的标题和面包屑,这样封面块就可以与导航头完美地对齐。为此,我在我的functions.php文件中创建了这个函数:
/**
* Check first block type
* @param string block_handle - handle of the block
*/
function sg_first_block_is($block_handle) {
$post = get_post();
if(has_blocks($post->post_content)) {
$blocks = parse_blocks($post->post_content);
if($blocks[0]['blockName'] === $block_handle) {
return true;
}else {
return false;
}
}
}
我可以使用这个条件来检查第一个块是什么块类型,然后相应地显示或隐藏面包屑和标题:
if(!sg_first_block_is('acf/sg-cover')):
get_template_part('template-parts/components/component', 'breadcrumbs');
echo '' . get_the_title() . '';
endif;
https://wordpress.stackexchange.com/questions/349050
复制相似问题