好的,我已经玩了一段时间了,并成功地更改了Gallery块的输出,但有以下注意事项:
预览与输出不匹配。我认为这是可能的,但似乎涉及更多要使块能够解析内容并保持其可编辑性,输出中需要某些类和标记。这些类具有需要处理的前端样式。我现在不确定是否有办法过滤块是如何做到这一点的。如果可能的话,如果这意味着当一个主题或插件被停用时,图库块会被破坏,这可能不是一个好主意。对于需要这样做的情况,可能需要一个全新的模块我真的不确定图像大小在这个阶段是如何工作的所使用的JavaScript挂钩方法可能与最终版本无关。古腾堡使用@wordpress/hooks
而关于在核心中使用什么挂钩系统的讨论is ongoing.由于块的输出保存为HTML,而不是短代码或元,因此不编辑现有库就无法修改现有库的输出我们需要做的第一件事是注册一个脚本。这是用wp_enqueue_scripts()
, 但是在enqueue_block_editor_assets
钩
脚本应具有wp-blocks
作为依赖项编写脚本。几乎可以肯定,它已经加载到编辑器中,但将其作为依赖项可能会确保它在我们的脚本之前加载。
function wpse_298225_enqueue_block_assets() {
wp_enqueue_script(
\'wpse-298225-gallery-block\',
get_theme_file_uri( \'block.js\' ),
[\'wp-blocks\']
);
}
add_action( \'enqueue_block_editor_assets\', \'wpse_298225_enqueue_block_assets\' );
块输出的HTML由
save()
块的方法。你可以看到画廊街区在
this file.
现阶段(2018年3月),Gutenberg支持块保存方法上的过滤器,blocks.getSaveElement
. 我们可以在JavaScript中添加一个钩子,如下所示:
wp.hooks.addFilter(
\'blocks.getSaveElement\',
\'wpse-298225\',
wpse298225GallerySaveElement
)
第一个参数是挂钩名称,第二个参数是(我想)名称空间,最后一个参数是回调函数。
因为我们正在更换save()
方法,我们需要返回一个新元素。然而,这不是我们需要返回的普通HTML元素。我们需要返回一个React元素。
当您查看原始块的save()
方法您看到的是JSX。古腾堡在引擎盖下使用的React支持渲染元素。看见this article 了解更多信息。
JSX通常需要一个构建步骤,但由于我没有为这个示例介绍构建步骤,我们需要一种不使用JSX创建元素的方法。React为此提供createElement()
. WordPress以以下形式为该功能和其他react功能提供包装wp.element
. So使用createElement()
我们使用wp.element.createElement()
.
在的回调函数中blocks.getSaveElement
我们得到:
element
由块创建的原始图元blockType
表示正在使用的块的对象attributes
块实例的特性。在我们的示例中,这包括gallery中的图像和列数等设置因此我们的回调函数需要:返回非块库的原始元素获取属性,尤其是图像,并从中创建一个新的React元素来表示库这里有一个完整的示例,只需输出ul
带着一个班级,my-gallery
, 和li
类的每个图像的my-gallery-item
和和img
在每个src
设置为图像URL。
function wpse298225GallerySaveElement( element, blockType, attributes ) {
if ( blockType.name !== \'core/gallery\' ) {
return element;
}
var newElement = wp.element.createElement(
\'ul\',
{
\'className\': \'wp-block-gallery my-gallery\',
},
attributes.images.map(
function( image ) {
return wp.element.createElement(
\'li\',
{
\'className\': \'blocks-gallery-item my-gallery-item\',
},
wp.element.createElement(
\'img\',
{
\'src\': image.url,
}
)
)
}
)
)
return newElement
}
需要注意的一些事项:原始库块通过查找ul.wp-block-gallery .blocks-gallery-item
, 因此,需要此标记和这些类才能编辑块。此标记也用于默认样式
attributes.images.map
在每个图像上循环,并返回一个子元素数组作为主元素的内容。在这些元素中,图像本身有另一个子元素