根据开机自检类型禁用编辑器中的块

时间:2019-10-03 作者:Sean

我制作了一个古腾堡块,它只适合在层次结构的帖子类型上显示,所以我想从非层次结构帖子类型的块插入器中禁用它。

我曾想过如何在PHP中实现这一点,但WordPress documentation on registering blocks 似乎建议在init 钩子,而不是稍后的钩子,在钩子中可以检查正在编辑的帖子是否具有层次结构。当时init 钩子开火,当前查看的帖子还不可用,例如。get_post(), 所以我不能检查它post_type.

我还考虑了如何在注册的(JavaScript)脚本中实现这一点editor_script 传递给的属性register_block_type, 但我不知道如何检查正在编辑的帖子类型,以便在非分级帖子类型的情况下停止阻止注册。只为脚本决定它不应该做任何事情而排队并运行块脚本似乎有点愚蠢,所以理想情况下,我希望在PHP中实现这种检查。

是否有一些标准方法可以使块仅对特定的post类型可用,最好是在PHP中?

3 个回复
SO网友:WebElaine

您可以使用allowed_block_types 挂钩:

<?php
function wpse_allowed_block_types($allowed_block_types, $post) {
    // Limit blocks in \'post\' post type
    if($post->post_type == \'post\') {
        // Return an array containing the allowed block types
        return array(
            \'core/paragraph\',
            \'core/heading\'
        );
    }
    // Limit blocks in \'page\' post type
    elseif($post->post_type == \'page\') {
        return array(
            \'core/list\'
        );
    }
    // Allow defaults in all other post types
    else {
        return $allowed_block_types;
    }
}
add_filter(\'allowed_block_types\', \'wpse_allowed_block_types\', 10, 2);
?>
根据需要调整尽可能多或尽可能少的条件。还可以通过标识非核心块的名称空间和名称并将其放入数组来启用非核心块。

SO网友:edanzer

我知道这是一篇比较老的帖子,但我也在尝试做类似的事情。我创建了一个帖子类型,并没有使用自定义的元框来添加/保存帖子元,而是使用了块。考虑到这样一个块的用途,它实际上应该只显示相关的post类型。

我发现了以下作品。您可以使用unregisterBlockType()函数为任何非您自己的post类型注销块。

有两个步骤。

当JS文件不在您的帖子类型中时,将其排队

function my_function() {
    if ( get_post_type() != \'my-post-type\' ) {
        wp_enqueue_script(
            \'my-script\',
            \'path/to/js/my-script.js\',
            array( \'original-block-js\' ),
            \'1.0.0\',
            true
        );
    }
}
add_action( \'admin_enqueue_scripts\', \'my_function\' );
请注意“原始块js”是一个依赖项。这是指首先注册块的JS文件。我们正在确保在注册块的代码之后加载注销块的代码。

将以下内容添加到JS文件中

const { unregisterBlockType } = wp.blocks;

wp.domReady( function() {
    unregisterBlockType( \'my-name-space/block-name\' );
} );
用您的块名称替换我的命名空间/块名称。

UPDATE

最初的海报想要隐藏任何非等级帖子类型上的块。这是一个稍微不同的用例。但是,只需使用is\\u post\\u type\\u hierarchy()调整条件即可实现。

SO网友:Tim

如果您需要将您想在帖子中使用的块列入白名单,您可以使用WordPress手册中的此方法https://developer.wordpress.org/block-editor/developers/filters/block-filters/#using-a-whitelist

// my-plugin.js
var allowedBlocks = [
    \'core/paragraph\',
    \'core/image\',
    \'core/html\',
    \'core/freeform\'
];

wp.blocks.getBlockTypes().forEach( function( blockType ) {
    if ( allowedBlocks.indexOf( blockType.name ) === -1 ) {
        wp.blocks.unregisterBlockType( blockType.name );
    }
} );