EP07. "elementor-deploy-verify 部署与注册验证"
🔒 登录后可标记已读- Widget 写完了、代码看起来没问题,但真的丢到 WordPress 后台会不会注册成功?不实际部署到 staging 站跑一遍,永远不会知道——
elementor-deploy-verify就是把「写完代码」和「真的能用」之间那段验证工作标准化 - 这是
mekko-digital/elementor-skills开源 skill 包里的其中一个,负责把elementor-widget-create(或elementor-form-action、elementor-dynamic-tag、elementor-theme-builder-location)产出的代码部署到 staging 站,用 wp-cli 或 MCP runtime 确认真的注册成功 - 核心是一套「五步流程」:选运行环境 → 把文件放到对应目录 → 按类型跑对应的注册验证 → 确认渲染不报错 → 清 CSS 缓存
- 前置知识:知道 wp-cli 基本用法(
wp eval、wp plugin等命令),了解 mu-plugin 跟一般 plugin 的差别
重点内容
这个 Skill 是做什么的
elementor-deploy-verify 不写业务代码,它验证别人写好的代码。同一个 skill 包里负责「写代码」的是 elementor-widget-create(widget)、elementor-form-action(表单动作)、elementor-dynamic-tag(动态标签)、elementor-theme-builder-location(Theme Builder 位置);写完之后交给这个 skill 部署 + 验证。
适合用在:
- 刚脚手架出来的 widget/表单动作/动态标签/Theme Builder 位置,要确认真的注册成功
- 怀疑某段代码「看起来对但没生效」,想在 staging 环境实测
- 需要给客户交付前,最后一道「真的能跑」的把关
不适合用在:
- 从零开始写 widget 逻辑——那是
elementor-widget-create的工作,这个 skill 只管验证已经写好的东西 - 渲染报错了要排查为什么坏——那是
elementor-debug-render接手的范围,这个 skill 负责发现问题(RENDER_FAIL),不负责深入排查 - 判断某功能是不是要 Pro 才有——先查
elementor-feature-lookup
📌 官方文档原话强调了一条安全底线:「Never deploy unverified code to production. Confirm the target is non-prod before writing files or activating plugins.」——动手部署前,先确认目标是 staging 不是正式站。
运行环境三选一
| 环境 | 说明 |
|---|---|
| MCP runtime(如 Novamira) | 首选,一套工具就能写文件、跑 wp-cli、执行 PHP,不用切换终端 |
| wp-cli 直连 | 备选,本机 shell 或 docker exec 进容器跑 |
| 都没有 | 把文件内容和确切命令写清楚交给用户自己跑 |
容器化站点的典型写法:
docker exec <wp-container> sh -c 'cd /var/www/html && wp <command> --allow-root'
# 把插件/mu-plugin 拷进容器:
docker cp ./my-ext <wp-container>:/var/www/html/wp-content/plugins/my-ext
📌 wp-cli 在容器里常常是用 root 身份跑,需要加 --allow-root。
文件该放哪
| 类型 | 放哪 |
|---|---|
| 单文件扩展(一个 widget 一个 .php) | wp-content/mu-plugins/<slug>.php,会自动加载,不用手动激活 |
| 多文件插件 | wp-content/plugins/<slug>/ 整个目录,放完还要 wp plugin activate <slug> |
注册验证:按类型跑对应的断言
每种扩展类型验证方式不一样,核心都是问 Elementor 的管理器「这个东西你真的登记了吗」:
Widget 是否注册成功:
wp eval '
$w = \Elementor\Plugin::instance()->widgets_manager->get_widget_types("NAME");
echo $w ? "REGISTERED title=".$w->get_title().PHP_EOL : "MISSING".PHP_EOL;
' --allow-root
📌 get_widget_types("NAME") 这个调用本身会触发 widget 初始化,所以 elementor/widgets/register 这个 hook 在 CLI 环境下也会照样触发,不需要额外跑前台流程。
动态标签是否注册成功:
wp eval '
$info = \Elementor\Plugin::instance()->dynamic_tags->get_tag_info("NAME");
echo $info ? "REGISTERED class=".$info["class"].PHP_EOL : "MISSING".PHP_EOL;
' --allow-root
Pro 表单动作是否注册成功(要用没被弃用的存取方式——get_form_actions() 从 3.5.0 起已弃用):
wp eval '
$reg = \ElementorPro\Modules\Forms\Module::instance()->actions_registrar;
$a = $reg->get("NAME");
echo $a ? "REGISTERED".PHP_EOL : "MISSING (have: ".implode(",", array_keys($reg->get())).")".PHP_EOL;
' --allow-root
Theme Builder 位置是否注册成功:
wp eval '
$locs = \ElementorPro\Modules\ThemeBuilder\Module::instance()->get_locations_manager()->get_locations();
echo isset($locs["NAME"]) ? "REGISTERED".PHP_EOL : "MISSING (have: ".implode(",", array_keys($locs)).")".PHP_EOL;
' --allow-root
📌 NAME 要换成扩展的 get_name() 回传值,而且必须是纯粹的 [a-z0-9_-]+ 格式——这段值是直接拼进 PHP 字符串字面量里的,如果 slug 里混了 " 或 $ 会直接把 eval 语法搞坏。Elementor 的 get_name() slug 本来就满足这个格式,如果自己取的 slug 不满足,应该去改 slug,不要去改这段验证脚本。
渲染验证:证明 render() 真的跑得动
光「注册成功」不够,还要确认渲染真的能输出内容。做法是建一个临时草稿页、塞进 _elementor_data、无头渲染一次、检查完再删掉页面:
wp eval '
$data = [[
"id" => "a1b2c3d", "elType" => "container", "elements" => [[
"id" => "d4e5f6g", "elType" => "widget", "widgetType" => "NAME",
"settings" => [ /* required settings, e.g. "title" => "MARK_OK" */ ],
]],
]];
$pid = wp_insert_post([ "post_title"=>"verify", "post_status"=>"draft", "post_type"=>"page" ]);
if ( ! $pid || is_wp_error($pid) ) { echo "INSERT_FAIL".PHP_EOL; return; }
update_post_meta($pid, "_elementor_edit_mode", "builder");
update_post_meta($pid, "_elementor_data", wp_slash(json_encode($data)));
\Elementor\Plugin::instance()->files_manager->clear_cache();
$html = \Elementor\Plugin::instance()->frontend->get_builder_content_for_display($pid);
echo ( strpos($html, "MARK_OK") !== false ) ? "RENDER_OK len=".strlen($html).PHP_EOL : "RENDER_FAIL".PHP_EOL;
wp_delete_post($pid, true);
' --allow-root
📌 把 MARK_OK 换成这个 widget 在给定 settings 下保证会输出的字符串。如果结果是 RENDER_FAIL 但 len 不是 0,通常是渲染成功了但标记字符串对不上;如果 len=0 或日志里有 PHP fatal,代表 render() 本身就坏了——这种情况交给 elementor-debug-render 接手排查,这个 skill 到「发现问题」为止,不负责深入 debug。
最后别忘了跑 wp elementor flush-css 清一下缓存的 CSS,不然改动可能因为缓存看不出效果。
wp-cli 能力边界:Elementor 原生没有「放置 widget」的命令
📌 一个容易误解的地方:Elementor 自带的 wp-cli 命令(wp elementor … 免费版 / wp elementor-pro … Pro 版)没有任何一条能直接把 widget 摆进页面或搭建版面——那些操作要嘛靠写 PHP(脚手架类 skill 的工作),要嘛靠改 _elementor_data(页面搭建,通常是 MCP 的工作),然后才用这里的验证片段确认结果。
Elementor 原生命令表(部分):
| 命令 | 用途 |
|---|---|
wp elementor flush-css | 清 CSS 缓存 |
wp elementor system-info | 系统信息 |
wp elementor experiments status | 查看实验性功能(比如 atomic e_atomic_elements)开关状态 |
wp elementor-pro license activate | Pro 授权 |
其他常用检查命令:
wp plugin get elementor --field=version # 确认 Elementor 版本
wp option get elementor_experiment-<feature> # 查单个实验开关
📌 4.0 atomic 元素、表单类 atomic 元素受实验开关和(表单类)Pro 授权双重限制——如果某个 e-* 元素怎么都注册不上,先跑 wp elementor experiments status 确认对应实验是不是真的开了。
反查免费/Pro 归属:跟 elementor-feature-lookup 联动
想知道一台站点当下真正注册了哪些 widget(不是理论上的免费/Pro 归属,是这台站实际启用的),列清单:
wp eval 'echo implode("\n", array_keys(\Elementor\Plugin::instance()->widgets_manager->get_widget_types()));' --allow-root
这条命令产出的清单可以拿去跟 elementor-feature-lookup 的静态矩阵对照,交叉验证授权状态、WooCommerce 有没有装、atomic 实验有没有开。
怎么安装
这个 skill 是 mekko-digital/elementor-skills 这个开源仓库打包的 8 个技能之一,用 Claude Code 的插件市场机制安装,装一次全部到位:
Claude Code(推荐:走插件市场):
claude plugin marketplace add mekko-digital/elementor-skills
claude plugin install elementor-skills@elementor-skills-marketplace
Claude Code(手动方式): 把 skills/elementor-deploy-verify 这个文件夹复制到 ~/.claude/skills/(所有项目都能用)或专案底下的 ./.claude/skills/(只想在这个项目用)。
Claude Desktop / claude.ai: 走 Settings → Capabilities → Skills,上传 skills/elementor-deploy-verify 这个文件夹(打包成 zip,内含 SKILL.md)——插件市场机制是 Claude Code 专属的,Desktop 端目前只能手动上传单个 skill。
常见错误
- ❌ 拿旧的
get_form_actions()去查 Pro 表单动作有没有注册——这个存取方式从 3.5.0 就已经弃用,该用actions_registrar属性的get()方法 - ❌ 直接对着正式站点跑部署验证——官方原文明确要求先确认目标是非正式环境(non-prod)再写文件或激活插件
- ❌
RENDER_FAIL就直接当成「代码写错了」去改业务逻辑——先看len是不是 0:非 0 通常只是标记字符串对不上(验证脚本问题),真正的渲染崩溃才需要交给elementor-debug-render - ❌
NAME传进带"或$的 slug——这段值是直接拼进 PHP 字符串字面量的,格式不对会把整个wp eval命令搞坏 - 💡 验证完别忘了
wp elementor flush-css,不然可能因为 CSS 缓存看起来像没生效 - 💡 4.0 atomic 元素注册不上,先查
wp elementor experiments status,很多时候只是实验开关没开
Sources
官方文档:
- elementor-skills(GitHub 仓库)— https://github.com/Mekko-Digital/elementor-skills
- elementor-deploy-verify SKILL.md — https://github.com/Mekko-Digital/elementor-skills/blob/main/skills/elementor-deploy-verify/SKILL.md
- verify-snippets.md — https://github.com/Mekko-Digital/elementor-skills/blob/main/skills/elementor-deploy-verify/resources/verify-snippets.md
- wp-cli-reference.md — https://github.com/Mekko-Digital/elementor-skills/blob/main/skills/elementor-deploy-verify/resources/wp-cli-reference.md