使用 Gutenberg 组件制作“插件选项页面”

plugin options page gutenberg

为插件构建选项面板从来都不是一件有趣的事情。这通常是开发人员在最后做的事情,大多数开发人员在设计选项面板时并没有投入太多精力。但是你能用 Gutenberg 的组件制作一个选项页面吗?

构建选项页面的过程几乎千篇一律。通常是相同的旧 PHP 代码,以及这里或那里使用框架的几个插件。

直到最近,插件开发者才开始使用 React 和其他现代 React UI 框架 为他们的插件构建选项页面,Jetpack 是最著名的例子之一

jetpack

在前面的两篇系列文章中,我讨论了如何使用 Block API 为 Gutenberg 构建块,也就是现在所说的块编辑器,我们还探索了 Gutenberg 的另一个组成部分——Gutenberg 的侧边栏 API。但整个块体验的精彩之处并不止于前端——博客文章和页面。

我们也可以用 Gutenberg 的组件制作选项页面。虽然这听起来很复杂,但实际上这是一个简单的过程,比标准做法需要的时间更少。

这是 Otter 的 Gutenberg 块和模板库(我们的插件)的截图,我们用 Gutenberg 的组件构建了一个选项页面:

Otter Options Page 1

简单干净,对吧?以下是构建此类页面的方法:

这些组件是什么?

好问题!Gutenberg 组件其实就是 React 组件,只是加了一层抽象层,让你感觉像是在使用 React。但从技术上来说,它就是 React。

此外,我们将使用 JSX 来编写代码。如果你刚接触 JSX,你会爱上它的。

代码文件 + 注释

👉 在继续之前,你可以在这里找到我们使用的所有代码,存放在这个 GitHub 仓库中。你可以安装这个插件来查看本教程的最终效果。

在本文中,我不会交替使用 Block Editor 和 Gutenberg。我所说的 Block Editor 仅指 Gutenberg 编辑器的部分。

设置“插件选项页面”

我们项目的设置非常简单。就像人心一样,它有两个部分:选项页面和构建文件。

首先,我们需要像往常一样注册我们的插件和选项页面:

define( 'CODEINWP_AWESOME_PLUGIN_VERSION', '1.0.0' );

function codeinwp_options_assets() { wp_enqueue_script( 'codeinwp-awesome-plugin-script', plugins_url( '/', FILE ) . 'build/build.js', array( 'wp-api', 'wp-i18n', 'wp-components', 'wp-element' ), CODEINWP_AWESOME_PLUGIN_VERSION, true ); wp_enqueue_style( 'codeinwp-awesome-plugin-style', plugins_url( '/', FILE ) . 'build/build.css', array( 'wp-components' ) ); }

function codeinwp_menu_callback() { echo '

'; }

function codeinwp_add_option_menu() { $page_hook_suffix = add_options_page( __( 'Awesome Plugin', 'textdomain' ), __( 'Awesome Plugin', 'textdomain' ), 'manage_options', 'awesome', 'codeinwp_menu_callback' );

add_action( "admin_print_scripts-{$page_hook_suffix}", 'codeinwp_options_assets' );

}

add_action( 'admin_menu', 'codeinwp_add_option_menu' );


- 参考资料:[*index.php* 第 13-36 行](https://github.com/HardeepAsrani/my-awesome-plugin/blob/master/index.php#L13-L36)

`codeinwp_add_option_menu` 函数使用 [`add_options_page`](https://developer.wordpress.org/reference/functions/add_options_page/) 将我们的选项页面挂钩到 WordPress 的设置菜单中。`codeinwp_menu_callback` 回调在页面上打印一个 div,我们使用 DOM 在其中渲染组件。最后,我们使用 `codeinwp_options_assets` 函数将脚本/样式入队到选项页面。

现在让我们讨论一下我们入队的脚本。如您在上方代码中看到的,*build.js* 将包含我们选项页面的所有代码。

经过这么多代码后,您的选项页面应该可以在 WordPress 的**设置**菜单下看到。它将是空的,只有一个 div,其余部分稍后将由 JavaScript 添加。

现在我们需要注册我们将要放在插件选项页面中的插件选项。让我们为选项页面注册两个选项,一个布尔值和一个字符串:

function codeinwp_register_settings() { register_setting( 'codeinwp_settings', 'codeinwp_analytics_status', array( 'type' => 'boolean', 'show_in_rest' => true, 'default' => false, ) );

register_setting(
	'codeinwp_settings',
	'codeinwp_analytics_key',
	array(
		'type'         => 'string',
		'show_in_rest' => true,
	)
);

}

add_action( 'init', 'codeinwp_register_settings' );


- 参考资料:[*index.php* 第 38-59 行](https://github.com/HardeepAsrani/my-awesome-plugin/blob/master/index.php#L38-L59)

这就是我们需要的全部 PHP 代码。现在让我们讨论一下 JavaScript 方面的内容。

## Gutenberg 中的 React 渲染

在块编辑器中,您不需要处理块的渲染。您只需要注册它们,其余的由编辑器负责。

使用 Gutenberg,React 被抽象为 `wp-element` 包,可以用来完成 React 和 ReactDOM 所做的所有事情。

让我们尝试在我们的选项页面上渲染一个示例标题。我们需要从 wp-element 包中导入 render,类似于 [ReactDOM.render](https://reactjs.org/docs/react-dom.html#render),来渲染我们的标题:

/**

  • WordPress dependencies */ const { render } = wp.element;

render(

Hello World

, document.getElementById( 'codeinwp-awesome-plugin' ) );


- 参考资料:[*index.js* 第 174-177 行](https://github.com/HardeepAsrani/my-awesome-plugin/blob/master/src/index.js#L174-L177)

## 从 Gutenberg 渲染组件

就像我们使用 wp-element 的 render 函数一样,我们也可以在选项页面上使用其他组件。类似于我们在[第一个 Gutenberg 教程](https://wpshout.com/adapt-your-plugin-for-gutenberg-block-api/)中使用 PanelBody 组件的方式,我们也将在选项页面中使用它:

/**

  • WordPress dependencies */ const { __ } = wp.i18n;

const { PanelBody, PanelRow, ToggleControl } = wp.components;

<PanelBody title={ __( '设置' ) }

<PanelRow>
	<ToggleControl
		label={ __( '追踪管理员用户?' ) }
		help={ '您是否要追踪已登录管理员账户的查看情况?' }
		checked={ true }
		onChange={ () => {} }
	/>
</PanelRow>
“`

这些组件看起来很不错,但它们无法单独工作。我们需要某种机制来在选项页上更改时获取和更改数据库中的选项。

状态管理

我们可以在 componentDidMount 生命周期 中使用 WordPress 的 Backbone API 来获取和更新组件状态的值。这样我们就不需要编写 REST 路由或使用 AJAX 了。

constructor() {
	super( ...arguments );

	this.state = {
		isAPILoaded: false,
		isAPISaving: false,
		codeinwp_analytics_status: false,
		codeinwp_analytics_key: ''
	};
}

async componentDidMount() {
	wp.api.loadPromise.then( () => {
		this.settings = new wp.api.models.Settings();

		if ( false === this.state.isAPILoaded ) {
			this.settings.fetch().then( response => {
				this.setState({
					codeinwp_analytics_status: Boolean( response.codeinwp_analytics_status ),
					codeinwp_analytics_key: response.codeinwp_analytics_key,
					isAPILoaded: true
				});
			});
		}
	});
}

现在 componentDidMount 生命周期从数据库中获取选项并将它们设置到状态中。我们可以在控件中使用这些状态来设置值。

最后,我们需要编写一个 onChange 函数来将状态更新到数据库。

changeOptions( option, value ) {
	this.setState({ isAPISaving: true });

	const model = new wp.api.models.Settings({
		// eslint-disable-next-line camelcase
		[option]: value
	});

	model.save().then( response => {
		this.setState({
			[option]: response[option],
			isAPISaving: false
		});
	});
}

一旦你 将其绑定到 thischangeOptions 函数就可以用于更改状态。像这样:

<ToggleControl
	label={ __( '追踪管理员用户?' ) }
	help={ '您是否要追踪已登录管理员账户的查看情况?' }
	checked={ this.state.codeinwp_analytics_status }
	onChange={ () => this.changeOptions( 'codeinwp_analytics_status', ! this.state.codeinwp_analytics_status ) }
/>

这就是如何使用 Gutenberg 组件创建插件选项页!使用这种方法有无限的可能性。

在我的 代码示例 中,我还为选项页添加了一个输入字段和页脚部分:

Options Panel 1

但使用 Gutenberg 组件并不是全部;你还可以使用第三方 React 库,例如使用 react-chartjs2 包在页面中添加图表。

Gutenberg 已成为 WordPress 核心不可分割的一部分,它将一直存在。它为我们开发者带来了许多可以在项目中使用工具。

在 Themeisle,我们一直在 WordPress 自定义器中使用 Gutenberg 组件来增强体验,例如在 Neve 主题中。

进一步阅读:

那么,您是否尝试过在编辑器外部使用 Gutenberg 组件?在评论中告诉我们!

别忘了参加我们的 WordPress 网站加速速成课程。继续往下看:

如何加速您的 WordPress 网站

通过一些简单的修复,您可以将加载时间减少甚至 50-80% 🚀

通讯表单 – 侧边栏

名 *

您的邮箱 *

立即订阅!

如果你是人类,请留空此字段。

Δ

输入您的邮箱,即表示您订阅了我们的每周通讯。您可以随时更改主意。我们尊重您的收件箱和隐私。

分享你的喜爱

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注