古登堡第一块对佩奇有条件吗?

时间:2019-09-25 作者:user9664977

我一直在使用ACF PRO构建一些定制的古腾堡积木。我有一个我创建的块,我想在该块中显示页面的标题,但前提是它是页面上的第一个块。如果该块也出现在页面下方,我不希望它显示页面的标题。

我试过这个:

$post = get_post(); 

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

    if ( $blocks[0][\'blockName\'] === \'acf/custom-block\' ) {
    }
}
它正在解析页面上的块,并查看该数组中的第一个块是否是我的自定义ACF块。上面的代码片段可以工作,但不是我想要的。是的,它是检查内容中的第一个块是否是我的ACF自定义块,但这是检查整个页面,因此,即使我将我的自定义块作为页面上的第一个块,但在页面下方也有我的自定义块的第二个实例,此条件仍会在下方块上显示页面标题,因为从技术上讲,第一个块仍然是我的自定义块。

我需要的是一个条件语句,它检查这个块本身是否是页面上的第一个块,而不是页面上的第一个块是否是我的自定义块的实例。

古腾堡是否可能有这种条件?

1 个回复
SO网友:Skovsgaard

我想出了一个解决方案,它可以与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;

相关推荐

上载转到wp-content/ploads的根目录

我有一个又开又关的客户端,我刚刚对它进行了Wordpress/插件/主题更新。当我打开uploads文件夹时,我注意到从2014年开始有一年的文件夹,然后所有图像都位于uploads文件夹的根级别。我已经检查了以下控制上传的代码。功能。php。htaccess可湿性粉剂配置。php插件列表我没有找到任何指示绕过WordPress核心函数的代码。我还应该检查什么?