如何在一个插件中创建多个古登堡区块

时间:2021-11-14 作者:user8463989

我已经创建了一个自定义块,可以在同一个插件中创建另一个自定义块,但如果我继续,它会变得一团糟,因为所有事情都必须在同一个索引中完成。js文件和php文件,似乎是这样。这对我来说是新的,所以也许有一种简单的方法可以做到这一点。

但我尝试创建一个blocks文件夹,然后在其中放置一个src文件夹和一个索引。js文件,因此每个块文件夹基本上都有自己的css文件和js文件等。但当我运行npm run start时,它不会像在根目录中那样在子文件夹中创建构建文件夹。

因此,我当前的文件夹结构如下所示:

build 
index.php
package.json
src
 - index.js
 - index.scss
我想知道我是否可以有多个街区

build
index.php
hero.php
call-to-action.php
package.json
blocks
 - hero
  -- src
    --- index.js
    --- index.scss
 - call-to-action
  -- src
   --- index.js
   --- index.scss

package.json

{
  "name": "custom-blocks",
  "version": "1.0.0",
  "description": "",
  "main": "index",
  "scripts": {
    "build": "wp-scripts build",
    "start": "wp-scripts start",
    "test": "echo \\"Error: no test specified\\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@wordpress/scripts": "^19.1.0"
  }
}

index.php

<?php
/*
Plugin Name: custom blocks
Description: custom blocks
Version: 1.0
Author: ...
Author URI: ...
License: GPLv2 or later
*/

if ( ! defined( \'ABSPATH\' ) ) exit;

class myCustomBlocks {
    function __construct() {
        add_action(\'init\', array($this, \'adminAssets\'));
    }
    
    function adminAssets() {
        wp_register_style(\'quizeditcss\', plugin_dir_url(__FILE__) . \'build/index.css\');
        wp_register_script(\'ournewblocktype\', plugin_dir_url(__FILE__) . \'build/index.js\', array(\'wp-blocks\', \'wp-element\', \'wp-editor\'));
        register_block_type(\'ourplugin/hero-block\', array(
            \'editor_script\' => \'ournewblocktype\',
            \'editor_style\'  => \'quizeditcss\',
            \'render_callback\' => array($this, \'theHTML\')
        ));
    }

    function theHTML($attributes) {
       ob_start(); ?>
            <p>Here is some data: <?php echo esc_html($attributes[\'someAttribute\']); ?></p>
       <?php return ob_get_clean();
    }
}

$myCustomBlocks = new myCustomBlocks();

index.js

import "./index.scss";
import {
  TextControl,
  Flex,
  FlexBlock,
  FlexItem,
  Button,
  Icon,
} from "@wordpress/components";

wp.blocks.registerBlockType("ourplugin/hero-block", {
  title: "Hero block",
  icon: "smiley",
  category: "common",
  attributes: {
    title: {
      type: "string",
    },
  },
  edit: EditComponent,
  save: function () {
    return null;
  },
});

function EditComponent(props) {
  return (
    <div className="some-jsx">
      Some block jsx here
    </div>
  );
}

1 个回复
SO网友:stokesman

我用不止一种方法更新了这个答案。虽然可能不用说这些的上下文是使用@wordpress/scripts 开发包。

适用于所有块的单束

此设置最适合构建具有父/子关系(如列/列)的块的某些组合,因此,如果没有另一个块,则无法使用其中一个块。

在中指定多个入口点buildstart 脚本。开头示例:

"start": "wp-scripts start --entry ./hero/src/index.js ./call-to-action/src/index.js"
将js捆绑到main.js 与违约相反index.js 所以editorScript 块的json中的路径需要更新。(由于只输出一个bundle,因此实际上只需要一个块的json文件来指定它)。

要为每个块输出单独的文件,我知道有两种方法。

Provide your own webpack config file

这最终将是最灵活的选择,可能非常简单。对于问题中的块,应使用如下配置:

const defaultConfig = require(\'@wordpress/scripts/config/webpack.config\');

module.exports = {
    ...defaultConfig,
    entry: {
        \'hero\': \'./blocks/hero/src\',
        \'call-to-action\': \'./blocks/call-to-action/src\',
    },
};
Ryan Welcheran example repo 和avideo walk-through of its creation (该链接指向有关创建自定义网页包配置的部分)。

在中指定多个入口点buildstart 未使用的脚本(--entry)这是official docs 当前演示:

"build:custom": "wp-scripts build entry-one.js entry-two.js --output-path=custom"
最新版本的@wordpress/scripts (19.1.0,可能回到18)每个入口点的文件名必须是唯一的,否则文件将被排除在构建之外。因此,对于问题中所示的项目结构,它将无法同时包含这两个块,因为它们都已命名index.js. 在早期版本中@wordpress/scripts 这两个文件都将包含在内,但会捆绑到一个文件中。此行为可能会改变。

相关推荐