我正在与Gutenberg一起使用,而不是将其包含在核心中,并且我想知道如何扩展现有的图库块以更改其显示。例如,我要显示幻灯片而不是缩略图网格。可能吗?如果是这样,怎么办?任何帮助,将不胜感激。
我正在与Gutenberg一起使用,而不是将其包含在核心中,并且我想知道如何扩展现有的图库块以更改其显示。例如,我要显示幻灯片而不是缩略图网格。可能吗?如果是这样,怎么办?任何帮助,将不胜感激。
Answers:
好的,我已经玩了一点,并设法更改了Gallery块的输出,但要注意以下几点:
@wordpress/hooks
在讨论正在使用哪种钩子系统的同时进行讨论。我们需要做的第一件事是注册一个脚本。这是通过完成的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()
方法处理。您可以在此文件中看到Gallery块。
在这个阶段(2018年3月),古腾堡(Gutenberg)支持对块的保存方法进行过滤blocks.getSaveElement
。我们可以像这样在JavaScript中添加一个钩子:
wp.hooks.addFilter(
'blocks.getSaveElement',
'wpse-298225',
wpse298225GallerySaveElement
)
第一个参数是挂钩名称,第二个参数是-我认为-一个命名空间,最后一个参数是回调函数。
由于我们要替换save()
块的方法,因此我们需要返回一个新元素。但是,这不是我们需要返回的普通HTML元素。我们需要返回一个React元素。
当您查看原始块的save()
方法时,您会看到JSX。古腾堡(Gutenberg)在后台使用的React支持它来渲染元素。有关更多信息,请参见本文。
JSX通常需要一个构建步骤,但是由于本例中没有介绍构建步骤,因此我们需要一种无需JSX即可创建元素的方法。React提供了createElement()
。WordPress以wp.element
。形式提供了对此和其他react功能的包装。所以要使用createElement()
我们使用wp.element.createElement()
。
在回调函数中,blocks.getSaveElement
我们得到:
element
块创建的原始元素。blockType
代表正在使用的块的对象。attributes
块实例的属性。在我们的示例中,这包括图库中的图像以及诸如列数之类的设置。因此,我们的回调函数需要:
下面是简单地输出一个完整的例子ul
与类,my-gallery
以及li
S代表与类中的每个图像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
在每个图像上循环并返回一个子元素数组作为主元素的内容。在这些元素内部,还有图像本身的另一个子元素。在这里提供更新的答案。我发现这篇文章对回答如何扩展画廊街区非常有帮助。
简而言之,建议仅创建一个新块而不是扩展现有块。从我上方链接中的帖子中:
如果[通过扩展]修改块的HTML,则不会将其识别为原始块。与其尝试操作核心块,不如取消注册核心块并在其位置注册一个新的替换块,这是一种更安全的方法-这样,您可以确保网站的用户使用您特定的自定义图库,这将进行验证,因为它定义了自己的HTML结构。
上面的链接还引用了Create-Guten_Block插件,这是一个命令行工具,它将生成启动Block创建所需的一切。该工具非常易于使用,并且易于安装。
有了这些资源,我就能弄清楚如何在短时间内开发自定义图库