标签: 区块开发

  • 构建自定义古腾堡区块:权威WordPress区块开发教程

    构建自定义古腾堡区块:权威WordPress区块开发教程

    许多人抱怨开始构建古腾堡区块和应用程序的障碍。学习曲线陡峭,主要是由于开发环境的安装和配置困难。此外,扎实的JavaScript、Node.js、React和Redux知识是这个相当复杂的秘诀的必备要素。

    官方的WordPress区块编辑器手册为开发人员提供了大量信息,但您可能会发现自己迷失在这些细节的海洋中。

    值得一提的是,Gutenberg项目的首席架构师Matías Ventura在接受WP Tavern采访时所报告的内容:

    虽然有些人可以快速学习它,但这对人们来说仍然是一个很大的障碍。我认为这有几个层次;文档在组织和演示方面可能要好一个数量级。我希望我们可以在那里做更多的事情。

    考虑到这一点,我们决定提供一个分步教程,旨在帮助我们的读者开始使用Gutenberg区块开发。

    1. 古腾堡区块开发先决条件
    2. 什么是古腾堡区块?
    3. 设置您的WordPress开发环境
    4. 初学者区块脚手架的演练
    5. 项目:建造你的第一个古腾堡区块

    古腾堡区块开发先决条件

    对于本教程,唯一需要的技能是对WordPress插件开发有很好的了解,并且至少对HTML、CSS、JavaScript和React有基本的了解。

    这会是一个雄心勃勃的项目吗?你打赌它会的!

    在完整性和简单性之间找到正确的折衷方案或决定包含哪些主题和省略哪些主题并不容易。

    希望中高级读者能原谅我们没有深入研究某些概念,例如React状态Redux存储高阶组件等。这些主题需要额外的空间和注意力,并且可能对于开始区块开发来说太高级了(除非您是 React 开发人员)。

    出于同样的原因,我们不会涵盖与Gutenberg区块开发相关的一些更高级的主题,例如动态区块元框

    有了本文结尾您将获得的知识,您将能够立即开始享受乐趣并提高工作效率。

    一旦您开始构建区块,您将准备好进一步提高您的技能并自行构建更高级的古腾堡区块。

    什么是古腾堡区块?

    自2018年12月首次发布以来,区块编辑器在各个方面都得到了极大的改进:更强大的API、更高级的用户界面、改进的可用性、大量新区块、全站点编辑的首次实现等等.

    简而言之,即使古腾堡仍在大力开发中,它也已经走过了漫长的道路——如今,区块编辑器已成为可靠的功能性页面和网站构建器的成熟候选者。

    从开发人员的角度来看,Gutenberg是一个基于React的单页应用程序(SPA),它允许WordPress用户在WordPress中创建、编辑和删除内容。但是,这不应该让您想到传统内容编辑器的增强版。

    我们想明确这一点:

    Gutenberg不是常规的WYSIWYG编辑器。相反,它重新定义了WordPress中的整个编辑体验。

    在古腾堡,内容被划分为区块,这些区块是用户可以用来创建文章和页面或整个网站的“砖块”。

    但从技术上讲,什么是区块?

    我们喜欢WordPress的定义

    “区块”是用于描述标记单元的抽象术语,这些标记单元组合在一起形成网页的内容或布局。这个想法将我们今天在WordPress中实现的概念与短代码、自定义HTML和嵌入发现结合到一个一致的API和用户体验中。

    标题、段落、列、图像、画廊以及构成编辑器界面的所有元素,从侧边栏面板到区块工具栏控件,都是React组件。

    那么,什么是React组件?W3Schools提供以下定义

    组件是独立且可重用的代码。它们的用途与JavaScript函数相同,但独立工作并通过render()函数返回HTML。

    在WordPress 5.8中使用Gutenberg区块

    在WordPress 5.8中使用Gutenberg区块

    虽然Gutenberg提供的编辑体验与经典的WordPress编辑器相比是全新的,但WordPress将您的内容片段存储在数据库中的方式根本没有改变。这是因为Gutenberg是一个在WordPress中运行的应用程序,但不会改变CMS的核心工作方式。

    使用Gutenberg创建的文章(包括文章、页面和自定义文章类型)仍存储在wp_posts表中,与经典编辑器完全相同。

    但是在使用Gutenberg创建的文章中,您会在表格中找到更多信息,这些信息代表了通过Classic Editor与Gutenberg创建的文章之间的根本区别。

    这些信息看起来像HTML注释,它们有一个特定的功能:分隔区块:

    代码编辑器视图中的博客文章

    代码编辑器视图中的博客文章。

    区块分隔符告诉WordPress要在屏幕上呈现什么区块。它们还为JSON对象中的区块属性提供值。这些道具决定了区块应该在屏幕上呈现的方式:

    wp_posts存储在表中的博客文章

    wp_posts存储在表中的博客文章

    设置您的WordPress开发环境

    设置现代JavaScript开发环境需要扎实的高级技术知识,例如WebpackReactJSXBabelESLint等。

    被吓倒了?不要!WordPress社区已经通过提供强大的工具来帮助您避免混乱的手动配置过程。

    为简单起见,我们不会在本文中介绍转译(不过,我们建议您在了解区块开发的基础知识后熟悉一下)。相反,我们将介绍两种替代工具,您可以使用它们在几分钟内快速轻松地设置现代JavaScript开发环境。您可以选择对您的项目最方便的一个。

    设置JavaScript开发环境以构建Gutenberg区块是一个三步过程:

    1. 安装Node.js和npm
    2. 设置开发环境
    3. 设置区块插件

    让我们开始吧。

    1. 安装Node.js和npm

    在安装您的开发环境并注册您的第一个区块之前,您需要安装Node.js和Node包管理器 (npm)。

    注:Node.js是基于Chrome的V8 JavaScript引擎构建的JavaScript运行时。npm,通常被称为Node包管理器,被认为是“世界上最大的软件注册表”。

    您可以通过几种不同的方式安装Node.js和npm。但首先,您可能需要检查该软件是否已安装在您的计算机上。

    为此,请启动终端并运行以下命令:

    node -v
    node -v
    node -v

    如果结果为command not found,则您的计算机上未安装Node.js,您可以继续安装。

    对于本文,我们选择了最简单的安装选项,即Node Installer。您需要做的就是下载与您的操作系统相对应的版本并启动安装向导:

    Node.js下载页面

    Node.js下载页面

    安装Node.js后,再次在终端中运行node -v命令。您还可以运行npm -v命令以确认您有可用的npm包。

    您现在配备了以下工具:

    • npxNode.js包运行器(请参阅文档)。这允许您运行npm命令而无需先安装它。
    • npmNode.js包管理器(请参阅文档)。这用于安装依赖项和运行脚本。

    下一步是安装开发环境。

    2. 设置你的开发环境

    在本地计算机上安装最新版本的Node.js和npm后,您将需要一个WordPress开发环境。

    您可以使用本地开发环境,也可以使用官方WordPress工具。让我们来看看这两种选择。

    选项 1:本地开发环境

    您可以选择不同的本地开发工具,例如MAMPXAMPP

    在本地环境中创建一个新的WordPress网站

    在本地环境中创建一个新的WordPress网站。

    选项 2:wp-env

    您也可以选择官方wp-env工具,它提供了一个本地WordPress开发环境,您可以直接从命令行启动。Noah Alen将其定义如下

    本地WordPress环境现在就像运行单个命令一样简单。wp-env是用于本地WordPress环境的零配置工具。它提供有关选项的决策,以便用户可以快速启动WordPress而不会浪费时间。事实上,我们的目标是让所有人都能轻松访问这些环境——无论您是开发人员、设计师、经理还是其他任何人。

    如果您决定试一试,安装wp-env所需的工作量很小。只需按照以下步骤操作:

    第 1 步:确认Docker和Node.js安装

    为了满足技术要求,您首先需要在您的计算机上安装Docker和Node.js。那是因为wp-env创建了一个运行WordPress网站的Docker实例。对代码所做的任何更改都会立即反映在WordPress实例中。

    第 2 步:从命令行安装@wordpress/env

    在您的计算机上运行Docker和Node.js,您可以继续安装WordPress开发环境

    您可以全局或本地安装wp-env。要在全局范围内执行此操作,您需要从插件目录中运行以下命令(更多信息请参见下面的“重要”通知框):

    npm install -g @wordpress/env
    npm install -g @wordpress/env
    npm install -g @wordpress/env

    让我们分解一下:

    提示:默认情况下,在Mac或Linux上,节点包安装/usr/local/lib/node_modules中。

    如果当前用户对该目录没有写权限,则会发出EACCES错误。了解有关在全局安装包时解决EACCES权限错误的更多信息。

    要确认wp-env已成功安装,请运行以下命令:

    wp-env –version
    wp-env –version
    wp-env --version

    您应该会看到当前wp-env版本,这意味着您现在可以使用插件文件夹中的以下命令启动环境:

    wp-env start
    wp-env start
    wp-env start

    您可以使用以下地址访问WordPress仪表盘:

    • http://localhost:8888/wp-admin/

    默认凭据如下:

    • 用户名:admin
    • 密码:password

    设置你的区块插件

    现在您需要一个入门区块插件来构建。但是,无需手动创建包含所有必要文件和文件夹的开发区块插件,您只需运行一个开发工具,即可提供开始区块开发所需的所有文件和配置。

    同样,您有几个选项可供选择。让我们来看看每一个。

    选项 1:使用@wordpress/create-block设置区块插件

    @wordpress/create-block是用于创建Gutenberg区块的官方零配置工具:

    创建区块是一种官方支持的创建区块的方法,用于为WordPress插件注册区块。它提供了一个没有配置的现代构建设置。它生成PHP、JS、CSS代码以及启动项目所需的所有其他内容。

    它很大程度上受到create-react-app的启发。向@gaearon、整个Facebook团队和React社区致敬。

    本地环境启动并运行后,您可以通过简单地运行命令npx @wordpress/create-block 来设置起始区块,它将提供创建插件脚手架和注册新区块所需的所有文件和文件夹。

    让我们运行一个测试,看看它是如何工作的。

    从命令行工具导航到/wp-content/plugins/目录并运行以下命令:

    npx @wordpress/create-block my-first-block
    npx @wordpress/create-block my-first-block
    npx @wordpress/create-block my-first-block

    当要求确认时,输入y继续:

    使用@wordpress/create-block创建一个区块

    使用@wordpress/create-block创建一个区块

    该过程需要一些时间。完成后,您应该得到以下响应:

    区块插件已创建

    区块插件已创建

    现在启动您的WordPress开发环境并转到WordPress仪表盘中的插件屏幕。一个名为“My First Block”的新插件应该已添加到您的插件列表中:

    区块插件已成功安装

    区块插件已成功安装

    注:如果您使用wp-env工具并从包含插件的目录运行wp-env start,它将自动挂载并激活该插件。如果您从任何其他目录运行wp-env start,将创建一个通用的WordPress环境(另请参阅WordPress开发站点)。

    如果需要,激活插件,创建一个新的博客文章,向下滚动区块插入器到小工具部分,然后选择你的新区块:

    使用@wordpress/create-block创建的示例区块

    使用@wordpress/create-block创建的示例区块

    现在返回终端并将当前目录更改为my-first-block

    cd my-first-block
    cd my-first-block
    cd my-first-block

    然后运行以下命令:

    npm start
    npm start
    npm start

    这使您能够在开发模式下运行插件。要创建生产代码,您应该使用以下命令:

    npm run build
    npm run build
    npm run build

    选项 2:使用create-guten-block设置区块插件

    create-guten-block是用于构建古腾堡区块的第三方开发工具:

    create-guten-block零配置开发工具包 (#0CJS) 可在几分钟内开发WordPress Gutenberg区块,无需配置React、webpack、ES6/7/8/Next、ESLint、Babel等。

    就像官方工具create-block一样,create-guten-block基于create-react-app,可以帮助您轻松生成您的第一个区块插件。

    该工具包提供了创建现代WordPress插件所需的一切,包括以下内容

    • React、JSX和ES6语法支持。
    • 幕后的webpack开发/生产构建过程。
    • ES6之外的语言附加功能,例如对象扩展运算符。
    • 自动前缀CSS,因此您不需要 -webkit或其他前缀。
    • 一个构建脚本,用于将JS、CSS和图像与源映射捆绑在一起进行生产。
    • 使用单个依赖项cgb-scripts对上述工具进行无忧更新。

    请注意以下警告:

    权衡是这些工具已预先配置为以特定方式工作。如果您的项目需要更多自定义,您可以“eject” 并自定义它,但是您需要维护此配置。

    一旦你手头有一个本地WordPress网站,启动你的命令行工具,导航到你安装的/wp-content/plugins文件夹,然后运行以下命令:

    npx create-guten-block my-first-block
    npx create-guten-block my-first-block
    npx create-guten-block my-first-block

    在创建项目结构并下载依赖项时,您必须等待一两分钟:

    使用create-guten-block创建Gutenberg区块

    使用create-guten-block创建Gutenberg区块

    该过程完成后,您应该会看到以下屏幕:

    使用create-guten-block成功创建Gutenberg区块

    使用create-guten-block成功创建Gutenberg区块

    下一张图片显示了在Visual Studio Code中运行终端的项目结构:

    Visual Studio Code中的区块插件

    Visual Studio Code中的区块插件

    现在回到您的WordPress仪表盘。插件屏幕中应该会列出一个新项目——它是my-first-block插件:

    使用create-guten-block创建的新插件的插件屏幕

    使用create-guten-block创建的新插件的插件屏幕

    激活插件并返回终端。将当前目录更改为my-first-block,然后运行npm start

    cd my-first-block
    npm start
    cd my-first-block
    npm start
    cd my-first-block
    npm start

    您应该得到以下响应:

    npm启动

  • 如何为古腾堡创建动态区块

    如何为古腾堡创建动态区块

    你还在为古腾堡感到困惑吗?或者您是那些坚信区块编辑器的潜力并想知道使用区块编辑器可以将他们的创造力推到多远的人中的一员?

    无论您属于哪种类型的用户,古腾堡都会留下来,这篇文章将让您深入了解 WordPress 块编辑器幕后发生的事情。但这还不是全部!

    我们之前的教程中我们提供了对Gutenberg区块开发的一般介绍之后,本文超越了基础知识,介绍了更高级的区块类型。这些块被称为动态区块。

    今天,您将了解什么是动态区块、它们是如何工作的,以及从头开始创建动态区块所需了解的一切。

    那么,什么是Gutenberg动态区块,静态区块和动态区块之间的主要区别是什么?

    1. 什么是动态区块?一个例子
    2. 从开发人员的角度来看Gutenberg动态区块
    3. 如何访问文章数据
    4. 如何创建动态区块:示例项目
    5. 在编辑器中构建要渲染的区块
    6. 构建要在页面上呈现的区块
    7. 动态区块开发的推荐资源

    什么是动态区块?一个例子

    使用静态区块时,用户在编辑文章或页面时手动添加内容,而使用动态区块时,内容会在页面加载时动态加载和处理。使用动态区块,区块内容从数据库中提取并按原样显示或由任何类型的数据操作产生。

    让我们用一个例子来解释一下。假设您要创建一组嵌套区块,显示文章作者详细信息以及来自同一作者的最新文章的选择。

    包括文章作者和最新文章组区块

    包括文章作者和最新文章组区块

    作为Gutenberg用户,您可以使用以下区块:

    • 标题核心区块
    • 文章作者核心区块
    • 最新文章核心区块

    您还可以创建一个包含这些区块的组,并将该组添加到可重复使用的区块中以供将来使用。

    将组区块添加到可重用区块

    将组区块添加到可重用区块

    这很简单,不是吗?您可以创建一个动态区块并将其添加到您的文章和页面中。

    WordPress 5.9开始,区块编辑器提供了90多个不同的区块,您很可能会立即找到适合您的区块。而且,如果您需要更多,请在WordPress插件目录中快速搜索,您会发现很多免费插件提供了额外的区块

    但是,如果您是WordPress开发人员,或者您正计划从事WordPress开发人员的职业怎么办?也许您有非常特定的需求,找不到您正在寻找的区块,或者您只是想获得新的专业技能。在这种情况下,您可能想学习如何创建动态区块。

    从开发人员的角度来看Gutenberg动态区块

    动态区块有两个主要用例。

    第一个用例是当包含区块的页面尚未更新时,您需要更新区块的内容。例如,当区块包含最新文章或评论的列表时会发生这种情况,并且通常每当区块的内容是使用从数据库检索的数据动态生成时。

    添加查询循环区块

    添加查询循环区块

    第二个用例是需要立即在前端显示对区块代码的更新。使用动态区块而不是静态区块会导致更改立即应用于所有出现的区块。

    另一方面,如果您要更改由静态区块生成的HTML,用户将看到一个无效对话框,直到该区块的先前版本的每个实例都被删除并替换为新版本,或者您将旧版本标记为不推荐使用的版本(另请参阅弃用区块验证、弃用和迁移经验)。

    意外或无效的内容

    意外或无效的内容

    话虽如此,在开始构建动态区块之前,您需要了解一些概念。

    1. 应用程序状态和数据存储
    2. Gutenberg中的模块化、包和数据存储
    3. WordPress数据存储

    应用程序状态和数据存储

    Gutenberg是一个React SPA应用程序,Gutenberg中的所有内容都是一个React组件。编辑器中的文章标题、标题、段落、图像和任何HTML内容块都是React组件,以及侧边栏和区块工具栏控件。

    在我们之前的文章中,我们只使用属性来存储数据。在本文中,我们将通过引入state的概念更进一步。

    简单地说,state对象是一个普通的JavaScript对象,用于包含有关组件的信息。组件的state可以随着时间而改变,并且任何时候改变,组件都会重新渲染。

    state对象类似,属性是普通的JavaScript对象,用于保存有关组件的信息。但是props和state之间有一个关键区别

    props传递给组件(类似于函数参数),而状态在组件内管理(类似于在函数中声明的变量)。

    您可以将状态视为在给定时间点获取的数据快照,应用程序存储这些数据以控制组件的行为。例如,如果块编辑器设置侧边栏打开,则一条信息将存储在state对象的某个位置。

    当信息在单个组件内共享时,我们称之为本地状态。当信息在应用程序内的组件之间共享时,我们称之为应用程序状态

    Application State与store的概念密切相关。根据Redux文档

    一个store保存着应用程序的整个状态树。更改其内部状态的唯一方法是在其上分派一个操作

    因此,Redux将应用程序状态存储在单个不可变对象树(即存储)中。对象树只能通过使用actionsreducers创建新对象来更改。

    在WordPress中,商店由WordPress数据模块管理。

    Gutenberg中的模块化、包和数据存储

    Gutenberg存储库从头开始构建在几个可重用且独立的模块上,这些模块组合在一起构建了编辑界面。这些模块也称为

    官方文档列出了两种不同类型的包

    • 生产包组成了在浏览器中运行的生产代码。WordPress中有两种类型的生产包:
    • 开发包用于开发模式。这些包包括用于linting、测试、构建等的工具。

    在这里,我们最感兴趣的是带有数据存储的包,用于检索和操作数据。

    WordPress数据存储

    WordPress 数据模块建立在Redux之上,并共享三个Redux核心原则,尽管有一些关键区别

    Info Redux是JavaScript应用程序的状态管理器。Redux的工作方式总结为三个基本原则

    • 单一事实来源:应用程序的全局状态存储在单个存储中的对象树中。
    • 状态是只读的:改变状态的唯一方法是发出一个动作,一个描述发生了什么的对象。
    • 使用纯函数进行更改:要指定状态树如何通过操作进行转换,您可以编写纯reducer。

    官方文档提供了以下定义

    WordPress的数据模块用作管理插件和 WordPress 本身的应用程序状态的中心,提供工具来管理不同模块内和模块之间的数据。它被设计为一种用于组织和共享数据的模块化模式:简单到足以满足小型插件的需求,同时可扩展以服务于复杂的单页应用程序的需求。

    默认情况下,Gutenberg在应用程序状态中注册多个数据存储。这些商店中的每一个都有特定的名称和用途:

    通过这些商店,您将能够访问一大堆数据:

    1. 与当前文章相关的数据,例如文章标题、摘录、类别和标签、区块等。
    2. 与用户界面相关的数据,即开关是打开还是关闭。
    3. 与整个WordPress安装相关的数据,例如注册分类法、文章类型、博客标题、作者等。

    这些存储存在于全局wp对象中。要访问商店的状态,您将使用select函数。

    要查看它是如何工作的,请创建一个新文章或页面并启动浏览器的检查器。找到控制台并输入以下代码行:

    wp.data.select(“core”)
    wp.data.select(“core”)
    wp.data.select("core")

    结果将是一个对象,其中包含可用于从core数据存储中获取数据的函数列表。这些函数称为选择器并充当访问状态值的接口。

    核心WordPress数据存储对象

    核心WordPress数据存储对象

    Info selectors对象包括一组用于访问和导出状态值的函数。选择器是一个接受状态和可选参数并从状态返回一些值的函数。调用选择器是从您的状态中检索数据的主要机制,并作为对原始数据的有用抽象,这些原始数据通常更容易更改并且不太容易用作规范化对象。(来源:Github

    WordPress数据存储通常包含有关WordPress的信息,选择器是您获取该信息的方式。例如,getCurrentUser()返回当前用户的详细信息:

    wp.data.select(“core”).getCurrentUser()
    wp.data.select(“core”).getCurrentUser()
    wp.data.select("core").getCurrentUser()

    检查getCurrentUser响应

    检查getCurrentUser响应

    另一个可用于从数据存储中检索用户详细信息的选择器是getUsers():

    wp.data.select(“core”).getUsers()
    wp.data.select(“core”).getUsers()
    wp.data.select("core").getUsers()

    下图显示了响应对象:

    检查getUsers响应

    检查getUsers响应

    要获取单个用户的详细信息,您只需键入以下行:

    wp.data.select(“core”).getUsers()[0]
    wp.data.select(“core”).getUsers()[0]
    wp.data.select("core").getUsers()[0]

    使用相同的选择器,您还可以检索author分配了角色的站点用户:

    wp.data.select( ‘core’ ).getUsers({ who: ‘authors’ })
    wp.data.select( ‘core’ ).getUsers({ who: ‘authors’ })
    wp.data.select( 'core' ).getUsers({ who: 'authors' })

    您还可以检索已注册的分类法:

    wp.data.select(“core”).getTaxonomies()
    wp.data.select(“core”).getTaxonomies()
    wp.data.select("core").getTaxonomies()

    检查getTaxonomies响应

    检查getTaxonomies响应

    已注册的文章类型列表:

    wp.data.select(“core”).getPostTypes()
    wp.data.select(“core”).getPostTypes()
    wp.data.select("core").getPostTypes()

    或插件列表:

    wp.data.select(“core”).getPlugins()
    wp.data.select(“core”).getPlugins()
    wp.data.select("core").getPlugins()

    现在让我们尝试访问不同的数据存储。为此,您仍将使用select函数,但提供不同的命名空间。让我们尝试以下方法:

    wp.data.select(“core/edit-post”)
    wp.data.select(“core/edit-post”)
    wp.data.select("core/edit-post")

    现在您将获得以下响应对象。

    访问编辑器的UI数据

    访问编辑器的UI数据

    如果您想知道设置侧边栏是否打开,您可以使用isEditorSidebarOpened选择器:

    wp.data.select(“core/edit-post”).isEditorSidebarOpened()
    wp.data.select(“core/edit-post”).isEditorSidebarOpened()
    wp.data.select("core/edit-post").isEditorSidebarOpened()

    如果侧边栏打开,则此函数返回true

    侧边栏已打开

    侧边栏已打开

    如何访问文章数据

    您现在应该对如何访问数据有了基本的了解。现在我们将仔细研究一个特定的选择器getEntityRecords函数,它是提供对post数据的访问权限的选择器。

    在块编辑器中,右键单击并选择Inspect。在控制台选项卡中,复制并粘贴以下行:

    wp.data.select(“core”).getEntityRecords(‘postType’, ‘post’)
    wp.data.select(“core”).getEntityRecords(‘postType’, ‘post’)
    wp.data.select("core").getEntityRecords('postType', 'post')

    这会向Rest API发送请求,并返回与上次发布的博客文章相对应的记录数组。

    getEntityRecords返回文章列表

    getEntityRecords返回文章列表

    Info 请注意,第一次将请求发送到Rest API时,响应将一直持续为null到请求完成。所以,如果你得到null了,不用担心,然后再试一次。

    getEntityRecords接受三个参数

    • kind 字符串:实体类型(即postType)。
    • name 字符串:实体名称(即post)。
    • query ?Object:可选术语查询(即{author: 0})。

    您可以使用arguments对象构建更具体的请求。

    例如,您可以决定响应应该只包含指定类别的文章:

    wp.data.select