如何在古腾堡扩展画廊?


16

我正在与Gutenberg一起使用,而不是将其包含在核心中,并且我想知道如何扩展现有的图库块以更改其显示。例如,我要显示幻灯片而不是缩略图网格。可能吗?如果是这样,怎么办?任何帮助,将不胜感激。


1
《古腾堡手册》中有一章关于可扩展性,这可能是第一步,看看是否可以将“ 修改块”部分中的那些过滤器用于这种情况
。.– birgire

似乎本章是最近添加的。我以前没看过 无论如何,由于被标记为实验性,此功能易于更改。我会等到稳定为止。谢谢!
leemon

Answers:


16

好的,我已经玩了一点,并设法更改了Gallery块的输出,但要注意以下几点:

  • 预览与输出不匹配。我认为这是可能的,但似乎涉及更多。
  • 输出中需要某些类和标记,以便该块能够解析内容并使之可编辑。这些类具有需要处理的前端样式。我现在还不确定是否有一种方法可以过滤该块如何执行此操作。如果可能的话,这意味着当停用主题或插件时,画廊画廊被打破,甚至不是一个好主意。对于需要这种情况的情况,可能是一个全新的障碍。
  • 我不确定在此阶段图像大小如何工作。
  • 在最终版本中,所使用的JavaScript挂钩方法可能无关紧要。古腾堡@wordpress/hooks在讨论正在使用哪种钩子系统的同时进行讨论。
  • 由于块的输出保存为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()方法处理。您可以在此文件中看到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块实例的属性。在我们的示例中,这包括图库中的图像以及诸如列数之类的设置。

因此,我们的回调函数需要:

  • 返回非块画廊的原始元素。
  • 选取属性(尤其是图像),并从其中创建一个新的React元素来表示图库。

下面是简单地输出一个完整的例子ul与类,my-gallery以及liS代表与类中的每个图像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在每个图像上循环并返回一个子元素数组作为主元素的内容。在这些元素内部,还有图像本身的另一个子元素。

2

在这里提供更新的答案。我发现这篇文章对回答如何扩展画廊街区非常有帮助

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

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

上面的链接还引用了Create-Guten_Block插件,这是一个命令行工具,它将生成启动Block创建所需的一切。该工具非常易于使用,并且易于安装。

有了这些资源,我就能弄清楚如何在短时间内开发自定义图库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.