我正在编写一个只允许一些自定义块的函数-本质上我想注册所有块,然后根据“选定”块的数据库表,不允许任何其他自定义块。
我可以使用allowed_block_types
要创建一个允许的块的数组,但它会擦除所有的核心块,有没有办法获得可靠的核心块列表,或者只为插件/主题注册的块添加一个过滤器?或者,允许所有块类别,然后过滤我自己的块类别?
我正在编写一个只允许一些自定义块的函数-本质上我想注册所有块,然后根据“选定”块的数据库表,不允许任何其他自定义块。
我可以使用allowed_block_types
要创建一个允许的块的数组,但它会擦除所有的核心块,有没有办法获得可靠的核心块列表,或者只为插件/主题注册的块添加一个过滤器?或者,允许所有块类别,然后过滤我自己的块类别?
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\' );
有一个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;
可用块名称列表:wp.blocks.getBlockTypes().forEach( function( blockType ){ console.log( blockType.name ); });
以下是可用块的表:console.table( wp.blocks.getBlockTypes() );
@伯吉尔的回答很好。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数据隐私设置。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 );
}
} );
} );
(遗憾的是,您仍然可以使用常规的嵌入块。我还不确定如何删除它。)我为自己创建了一个发票主题,并试图在自定义列中获取发票总额。我已经尝试调整模板页面中使用的代码,以便在函数中显示这一点。php文件,但它不工作。我的乘法操作数出现了一个操作数错误,我不知道为什么。这是我的代码(如有任何帮助,将不胜感激)。if( $column_name == \'invoice_total\' ) { $hours = 0; // This allows counting of each sub_field //* Set repeater va