WordPress引入了 古腾堡 技术,用来现代化内容编辑,支持块功能,对许多网站来说效果不错。但如果你是在构建 自定义页面构建器、 SaaS编辑器,或者 一个具备完整HTML/CSS控制的可视化工具,古腾堡往往会成为局限而非解决方案。
这时 GrapesJS 就登场了。
在本文中,我们将比较 GrapesJS 与 Gutenberg,解释每种方法的合理性,然后带你了解一种 真实且面向生产 环境的 GrapesJS 构建自定义 WordPress 页面构建器的方法。
本指南面向:
- WordPress 开发者与代理机构
- 前端工程师
- SaaS构建者创建页面、文档或电子邮件编辑器
没有花哨。没有营销炒作。只有实用的架构和实际决策。
古腾堡与葡萄JS——核心区别
在比较特征之前,重要的是要明白 Gutenberg和GrapesJS解决的是不同的问题。
一句话说古腾堡
Gutenberg 是一个基于块的内容编辑器,紧 密结合 WordPress。
GrapesJS 一句话
GrapesJS 是一个 与框架无关的可视化 HTML/CSS 编辑器 ,可以纯粹将 WordPress 作为后端使用。
这种差异塑造了其他一切。
快速对比:GrapesJS 与 Gutenberg

当古腾堡是正确的选择时
古腾堡在以下情况下表现良好:
- 你正在构建 内容密集的网站
- 编辑者是非技术用户
- 你需要与WordPress核心深度集成
- 布局灵活性次于一致性
如果你正在构建博客、营销网站或新闻门户——古腾堡通常就足够了。
当GrapesJS是更好的选择时
GrapesJS 在以下情况下成为更好的选择:
- 你需要 完整的HTML和CSS控制
- 你正在构建一个自定义页面构建器
- 你想导出WordPress以外的内容
- 你正在构建一个 SaaS风格的编辑器
- 你想设计 文档、邮件、提案、着陆页
换句话说:如果WordPress是你的 后端,而不是 编辑器,GrapesJS非常适合你。
真实世界架构:WordPress + GrapesJS
我们来看一个 生产准备的设备,而不是演示。
高级架构
WordPress 管理员 ↓自定义编辑器页面 ↓ GrapesJS(iframe) ↓ REST API ↓ Database / Media Library
职责分工
- WordPress
- 认证与权限
- 存储(HTML、CSS、JSON)
- 媒体上传
- REST API
- 葡萄JS
- 视觉编辑
- 组件与布局
- 风格
- 导出 HTML/CSS
这种分离保持系统清洁且可扩展。
步骤1:在WordPress管理中嵌入GrapesJS
创建一个 自定义管理员页面 或 自定义帖子编辑器。
安全地重新排队脚本
add_action('admin_enqueue_scripts', 函数 () {
wp_enqueue_script(
'grapesjs',
'https://unpkg.com/grapesjs',
[],
null,
true
);
wp_enqueue_style(
'grapesjs-css',
'https://unpkg.com/grapesjs/dist/css/grapes.min.css');
wp_enqueue_script(“
我的编辑”,
plugin_dir_url(__FILE__) 。'editor.js',
[''葡萄'],
'1.0',
true);
wp_localize_script('我的编辑器', 'WP_EDITOR', [
'nonce' => wp_create_nonce('wp_rest'),
'api' => rest_url('custom/v1'),
]);
});
为什么iframe很重要
GrapesJS 在 iframe 内渲染内容:
- 防止WordPress管理员CSS冲突
- 保持前端风格的独立性
- 让输出变得可预测
这是 优点,不是缺点。
步骤2:初始化GrapesJS
editor.js年:
const editor = grapesjs.init({
container: '#editor',
height: '100vh',
fromElement: false,
storageManager: false,
canvas: {
styles: [
'/wp-content/themes/your-theme/style.css'
]
}
});
禁用默认存储管理器——我们会手动处理保存。
步骤3:正确保存内容
你应该保存什么?
推荐阅读:
- HTML →最终输出
- CSS →风格
- projectData → GrapesJS JSON(用于重新编辑)
REST API 端点(PHP)
register_rest_route('custom/v1', '/save', [
'methods' => 'POST',
'permission_callback' =>函数 () {
return current_user_can('edit_posts');
},
'callback' =>函数 ($request) {
$post_id = intval($request['post_id']);
update_post_meta($post_id, '_gjs_html', $request['html']);
update_post_meta($post_id, '_gjs_css', $request['css']);
update_post_meta($post_id, '_gjs_project', wp_json_encode($request['project']));
返回 ['成功' => true];
}
]);
保存按钮(JS)
async 函数 savePage() {
waitit fetch('${WP_EDITOR.api}/save', {
方法: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': WP_EDITOR.nonce
},
body: JSON.stringify({
post_id: 123,
html: editor.getHtml(),
css: editor.getCss(),
project: editor.getProjectData()
})
});
}
步骤4:将内容重新加载到编辑器中
editor.loadProjectData(projectJson);
这实现 了真正的往返编辑,而古腾堡在复杂布局时对此颇为困难。
步骤5:WordPress媒体库集成
使用原生媒体选择器:
const frame = wp.media({
title: 'Select image',
multiple: false
});
frame.on('select', () => {
const file = frame.state().get('selection').first().toJSON();
编辑。AssetManager.add({
src: file.url,
type: 'image'
});
});
frame.open();
现在,WordPress上传的图片直接出现在GrapesJS中。
安全性与权限
千万不要错过。
清单:
- ✅ REST nonces
- ✅ current_user_can() 检验
- ✅ 渲染时消毒,而不是保存
- ✅ 按角色限制编辑访问
重要提示:
如果用户导出 HTML, 不要 过度净化存储内容——只有在公开渲染时才进行净化。
性能最佳实践
- 只有在编辑器打开时才启动 GrapesJS 进行懒散加载
- 只注入必要的CSS 到画布里
- 避免重新初始化编辑器
- 每页使用一个编辑器实例
- 积极管理缓存资产
常见陷阱
❌ “我的风格不适用。”
你忘了把CSS加载到iframe(canvas.styles)里。
❌ “编辑很慢”
插件太多或自动保存了。
❌ “内容在加载时中断”
你只保存 HTML,而不是项目 JSON。
最终决定:GrapesJS还是古腾堡?
如果有以下条件,选择 古腾堡 :
- 你正在构建以内容为先的WordPress网站
- 你需要原生的WP UX
选择 GrapesJS 时:
- 你正在构建一个自定义页面构建器
- 你需要 完整的 HTML/CSS 控制
- WordPress是你的后台,不是你的编辑器
- 你正在构建一个SaaS或高级编辑器
总结
古腾堡是一位出色的 内容编辑。
GrapesJS 是一个 构建框架。
如果你的目标是打造更接近 Webflow、Elementor、Notion或文档编辑器的软件,GrapesJS搭配WordPress是一个强大且灵活的基础。
WordPress 处理它最擅长的部分——用户、权限、存储。
GrapesJS擅长的部分是视觉编辑和布局。
这种分离是实现可扩展、专业建筑的关键。
