我想出了一个解决方案,它可以与Wordpress 5.4和ACF Pro 5.8.9配合使用。
首先,您需要在函数中的某个位置使用此函数。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属性。核心块没有)。
现在,在块样板文件中,可以执行以下操作:
<?php if($block[\'id\'] === sg_get_first_block_id()): ?>
<h1><?php the_title(); ?></h1>
<?php endif; ?>
$block[\'id\']
是每个块实例的唯一id。然后将其与页面上第一个块的id进行比较。如果它们相同,函数将返回true,并显示文章的标题。
我创建了一个自定义封面,里面有全尺寸的背景图像和内容。如果这是页面上的第一个块,我不想让它成为英雄元素。
通过在我的块模板文件中使用上述方法,如果自定义封面块标题是页面上的第一个块,我可以在h1标记而不是h2标记中显示它。
<?php if($block[\'id\'] === sg_get_first_block_id()): ?>
<h1><?php echo $title; ?></h1>
<?php else: ?>
<h2><?php echo $title; ?></h2>
<?php endif; ?>
我也不想隐藏普通的标题和面包屑,以便封面块与导航标题完美对齐。为此,我在函数中创建了此函数。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 \'<h1>\' . get_the_title() . \'</h1>\';
endif;