在 WordPress Gutenberg Block 插件中包含图像资产

Posted

技术标签:

【中文标题】在 WordPress Gutenberg Block 插件中包含图像资产【英文标题】:Include image assets in a WordPress Gutenberg Block Plugin 【发布时间】:2019-12-09 17:43:46 【问题描述】:

我正在创建一个自定义 WordPress Gutenberg 块,并且我想使用我的插件文件夹中的图像资产(PNG、JPG),以便在 Gutenberg 编辑器和渲染页面上显示。

我正在使用 Webpack 为 JS 和 SCSS 捆绑我的文件。我尝试添加 webpack 图像加载器,它将图像保存到我的主插件目录中的“资产”文件夹中。

但是,当我尝试使用 Block 的主 JS 文件中的图像资产时,我无法找到一种方法来访问在我的 WordPress 服务器上运行的图像的完整 URL 路径,该服务器目前在 localhost 的 docker 容器中运行。

我希望找到一个 WordPress 方法来返回我的插件目录的路径,并使用它来指向图像资产,无论它们是如何捆绑的,但我无法在文档中找到解决方案。

可以通过 WordPress 的内置函数使用 php 获取插件目录:

function _get_plugin_directory() 
  return __DIR__;

这似乎有帮助,但是我不知道是否可以将返回的插件路径传递到我的 JS 文件中。

我的插件结构如下:

/assets // generated by Webpack
  - image.png
  - main.js
/blocks
  /block-example
    - image.png // <-- My image asset
    - index.js // <-- I want to use image.png here
  - index.js // loads in my block
blocks.php

index.js 文件是我想要显示图像的位置,使用标准的 WordPress editsave 函数:

import image from './image.png';

edit: props => 
  ...
  <img src=image />

在 WordPress Gutenberg 编辑器中,图像仅指向图像文件名(./image.pngassets/image.png 等),而不是它位于插件目录中的图像的完整路径(即 localhost:8080/plugins/my-blocks/assets/image.png)导致找不到图片。

【问题讨论】:

【参考方案1】:

我仍在研究是否有官方的 Gutenberg 方法可以做到这一点,但现在我已经在我的插件中使用 wp_localize_script。

这可以将数据从 PHP 传递到排队的 javascript 中,这样通常只能在 PHP 中访问的数据也可以在 Javascript 中访问。

因此(可能在您的示例中的 blocks.php 内部),您将有类似的内容:

wp_enqueue_script(
    'my-main-script',
    plugins_url( 'assets/main.js', __FILE__ ),
    array( 'wp-blocks', 'wp-i18n', 'wp-element', 'wp-editor', 'wp-components' ),
    '20190804',
    true
);

然后,您可以将要传递给 JS 的任何值加入队列:

wp_localize_script(
    'my-main-script',
    'js_data',
    array(
        'my_image_url' => plugins_url( 'blocks/block-example/image.png', __FILE__ )
    )
);

这将确保图像路径可供 javascript 访问。然后从你的块本身中,你可以引用它:

<img src=js_data.my_image_url />

您现在应该会看到在您的块中呈现的静态图像资产。

【讨论】:

【参考方案2】:

您也可以使用较新的 wp_add_inline_script 函数来实现相同的目标。

来自 WordPress 文档

虽然本地化是主要用途,但它 (wp_localize_script) 经常用于将通用数据从 PHP 传递到 JavaScript,因为它最初是唯一的官方方式。 wp_add_inline_script() 是在 WordPress 4.5 版中引入的,现在是该用例的最佳实践。 wp_localize_script() 只应在您真正想要本地化字符串时使用。

这是我使用wp_add_inline_script 将图像网址传递到自定义古腾堡块的代码。以下代码按照示例放在blocks.php 中。

wp_enqueue_script 代码示例中,_get_plugin_url() 是我自己的自定义函数,用于检索我的插件的路径。

wp_enqueue_script(
    'my-main-script',
    _get_plugin_url() . $block_path,
    [],
    filemtime( _get_plugin_directory() . $block_path )
);

我为我希望传入的数据设置了一个数组,例如

$js_data = array(
    'image_url' => _get_plugin_url() . '/assets/images/BACK.png',
);

然后使用wp_add_inline_script函数

wp_add_inline_script(
    'my-main-script',
    'var jsData = ' . wp_json_encode( $js_data ),
    'before'
);

在注册块并定义其行为的/block-example/index.js 文件中,我可以像这样访问该变量:

jsData.image_url

【讨论】:

以上是关于在 WordPress Gutenberg Block 插件中包含图像资产的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在主题中使用 Wordpress Gutenberg 块?

Wordpress Gutenberg 自定义列块

如何向 WordPress Gutenberg 块添加自定义块?

在 WordPress Gutenberg Block 插件中包含图像资产

WordPress Gutenberg,以编程方式更新帖子内容

Wordpress Gutenberg:前端的 React 组件