古腾堡不允许某些定制块,但保留所有核心块?

时间:2019-01-28 作者:Aravona

我正在编写一个只允许一些自定义块的函数-本质上我想注册所有块,然后根据“选定”块的数据库表,不允许任何其他自定义块。

我可以使用allowed_block_types 要创建一个允许的块的数组,但它会擦除所有的核心块,有没有办法获得可靠的核心块列表,或者只为插件/主题注册的块添加一个过滤器?或者,允许所有块类别,然后过滤我自己的块类别?

4 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

AFAIK从古腾堡移除积木只有一种方法-你必须使用allowed_block_types 滤器

不幸的是,Gutenberg开发人员对WordPress挂钩和过滤器不太熟悉,所以他们用这个创建了一个小怪物。因此,他们不是在那里传递一系列核心块,而是传递true 启用所有块。这样,您就无法获得已注册的所有块的列表。

所以,如果你只想禁用一个块,那么你必须自己获得所有块。。。

以下是核心块列表:

核心/短码核心/图像核心/库核心/标题核心/表核心/预格式化核心/代码核心/html(之前core/cover-image)

核心嵌入/推特

核心嵌入/youtube核心嵌入/facebook核心嵌入/instagram核心嵌入/wordpress核心嵌入/soundcloud核心嵌入/spotify核心嵌入/flickr核心嵌入/vimeo核心嵌入/动画核心嵌入/funnyordiei> core embed/imgurcore embed/Issucore embed/kickstartercore embed/meetup comcore embed/mixcloudcore embed/photobucketcore embed/Polldadycore embed/reddit核心嵌入/SMUG另一方面,core embed/ted/tumblr/core embed/videopress/core embed/wordpress tv在JS中注销给定的块要容易得多。。。在这里,您可以使用:

wp.blocks.unregisterBlockType( \'core/verse\' );

SO网友:birgire

有一个whitelist 中的块移除示例Gutenberg Handbook:

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 );
    }
} );
可以尝试对其进行修改,以删除不以开头的块core 不属于allowedExtraBlocks (未测试):

var allowedExtraBlocks = [
    \'my-plugin/block-example-1\',
    \'my-plugin/block-example-2\'
];

wp.blocks.getBlockTypes().forEach( function( blockType ) {
    if ( ! blockType.name.startsWith( \'core\' )
         && allowedExtraBlocks.indexOf( blockType.name ) === -1
    ) {
        wp.blocks.unregisterBlockType( blockType.name );
    }
} );
可以进一步调整此选项,以匹配以core/core-embed/ 而不是core 更准确地说。

这个blacklist example 将其包装为:

wp.domReady( function() {
    // ...
} );
因此,白名单示例可能也需要这样做。

以下是在浏览器控制台中查看编辑页面上可用块的快速方法:

根据

wp.blocks.getBlockTypes().length;

number of core blocks

可用块名称列表:

wp.blocks.getBlockTypes().forEach( function( blockType ){ console.log( blockType.name ); }); 

block names

以下是可用块的表:

console.table( wp.blocks.getBlockTypes() );

Table of available blocks

SO网友:sebix

@伯吉尔的回答很好。https://wordpress.stackexchange.com/a/326969/198298

但可能缺少一些信息。

正如@birgire猜测的那样,确实有必要将代码包装在

wp.domReady( function() {
    // ...
} );
即使脚本加载了依赖项array( \'wp-blocks\', \'wp-dom-ready\', \'wp-edit-post\' ) 就像在block filters guide.

说到加载:如果你不是插件开发人员(像我一样),但只想为你(公司)博客的用户删除一些块类型,那么你应该在你的子主题中为此加载js文件functions.php 就像这样:

/** Allow js-side adjustments to block editor (aka Gutenberg), i.e. remove certain block types. */
function my_childtheme_enqueue_block_editor_adj() {
    wp_enqueue_script(
        \'block-editor-adjustments\',
        get_stylesheet_directory_uri() . \'/js/block-editor-adjustments.js\',
        array( \'wp-blocks\', \'wp-dom-ready\', \'wp-edit-post\' ),
    );
}
add_action( \'enqueue_block_editor_assets\', \'my_childtheme_enqueue_block_editor_adj\' );
我的js文件如下所示:

wp.domReady(function () {
    /**
     * Remove some blocks from the block editor.
     * This is not possible in php unfortunately.
     */
    wp.blocks.unregisterBlockType(\'core/embed\');

    var allowedEmbedBlocks = [
        \'core-embed/twitter\',
        \'core-embed/youtube\',
        \'core-embed/facebook\',
        \'core-embed/instagram\',
        \'core-embed/wordpress\',
        \'core-embed/flickr\',
        \'core-embed/vimeo\',
    ];

    wp.blocks.getBlockTypes().forEach(function (blockType) {
        if (blockType.name.startsWith(\'core-embed\')
            && allowedEmbedBlocks.indexOf(blockType.name) === -1
        ) {
            wp.blocks.unregisterBlockType(blockType.name);
        }
    });
});
这样,我现在可以专注于中的嵌入选项allowedEmbedBlocks 关于Usercentrics数据隐私设置。

SO网友:Jules

core-embed 古腾堡编辑器的最新版本中不再存在。所有嵌入现在似乎都是core/embed. 因此无法注销默认值core/embed 阻止,因为如果这样做,将自动注销其所有变体。但是,您可以使用注销任何变体wp.blocks.unregisterBlockVariation(blockName, variationName).

Example: 仅允许YouTube嵌入块:

wp.domReady( function() {
    const allowedEmbedBlocks = [
        \'youtube\',
    ];

    wp.blocks.getBlockType( \'core/embed\' ).variations.forEach( function( blockVariation ) {
        if (
            allowedEmbedBlocks.indexOf( blockVariation.name ) === -1
        ) {
            wp.blocks.unregisterBlockVariation( \'core/embed\', blockVariation.name );
        }
    } );
} );
(遗憾的是,您仍然可以使用常规的嵌入块。我还不确定如何删除它。)

相关推荐

Calculations in functions.php

我为自己创建了一个发票主题,并试图在自定义列中获取发票总额。我已经尝试调整模板页面中使用的代码,以便在函数中显示这一点。php文件,但它不工作。我的乘法操作数出现了一个操作数错误,我不知道为什么。这是我的代码(如有任何帮助,将不胜感激)。if( $column_name == \'invoice_total\' ) { $hours = 0; // This allows counting of each sub_field //* Set repeater va