如何延长古腾堡的画廊街区?

时间:2018-03-19 作者:leemon

在古腾堡加入core之前,我正在与它合作,我想知道如何扩展现有的图库块来改变它的显示。例如,我想显示图像的幻灯片,而不是缩略图网格。有可能吗?如果是,如何?任何帮助都将不胜感激。

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

好的,我已经玩了一段时间了,并成功地更改了Gallery块的输出,但有以下注意事项:

预览与输出不匹配。我认为这是可能的,但似乎涉及更多@wordpress/hooks 而关于在核心中使用什么挂钩系统的讨论is ongoing.我们需要做的第一件事是注册一个脚本。这是用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中的图像和列数等设置

    返回非块库的原始元素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 在每个图像上循环,并返回一个子元素数组作为主元素的内容。在这些元素中,图像本身有另一个子元素

SO网友:Jeff Wilkerson

此处提供最新答案。我发现this post extremely helpful 在回答如何扩展库块的问题时。

简而言之,建议只创建一个新块,而不是扩展现有块。从我上面链接中的帖子:

如果[通过扩展]修改块的HTML,它将不会被识别为原始块。与其试图操纵核心块,不如取消注册核心块并在其位置注册新的替换块,这将是一种更安全的方法,这样可以确保网站用户使用特定的自定义库,该库将进行验证,因为它定义了自己的HTML结构。

上面的链接也引用了The Create-Guten_Block plugin 这是一个命令行工具,将生成开始创建块所需的所有内容。该工具非常易于使用,并且易于设置。

有了这些资源,我能够在短时间内找到如何开发自定义库块的方法

结束

相关推荐

Issue uploading images

我从来没有遇到过图像问题,但现在新上传的图像突然显示出损坏的图像图标,当我继续插入它时,我在帖子中看到了损坏的图像。以下是屏幕截图:Issue details:1) 前端上的图像不显示为内联图像,它们仅显示为附件。2) 此问题仅在主站点上存在,所有子站点上的图像都可以正常工作I tried to resolve the issue by doing following things with no success:1) 切换回默认主题2)禁用所有插件以查看if3)试图重置永久链接时出现冲突有人能帮忙吗?P