AI TOOLS

EP07. "elementor-deploy-verify 部署与注册验证"

首页 AI 工具 Claude · Skills · Elementor Skills · EP07
约 22 分钟· #EP07#Claude#Elementor Skills
🔒 登录后可标记已读
  • Widget 写完了、代码看起来没问题,但真的丢到 WordPress 后台会不会注册成功?不实际部署到 staging 站跑一遍,永远不会知道——elementor-deploy-verify 就是把「写完代码」和「真的能用」之间那段验证工作标准化
  • 这是 mekko-digital/elementor-skills 开源 skill 包里的其中一个,负责把 elementor-widget-create(或 elementor-form-actionelementor-dynamic-tagelementor-theme-builder-location)产出的代码部署到 staging 站,用 wp-cli 或 MCP runtime 确认真的注册成功
  • 核心是一套「五步流程」:选运行环境 → 把文件放到对应目录 → 按类型跑对应的注册验证 → 确认渲染不报错 → 清 CSS 缓存
  • 前置知识:知道 wp-cli 基本用法(wp evalwp 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_FAILlen 不是 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 activatePro 授权

其他常用检查命令:

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

官方文档:

  1. elementor-skills(GitHub 仓库)— https://github.com/Mekko-Digital/elementor-skills
  2. elementor-deploy-verify SKILL.md — https://github.com/Mekko-Digital/elementor-skills/blob/main/skills/elementor-deploy-verify/SKILL.md
  3. verify-snippets.md — https://github.com/Mekko-Digital/elementor-skills/blob/main/skills/elementor-deploy-verify/resources/verify-snippets.md
  4. wp-cli-reference.md — https://github.com/Mekko-Digital/elementor-skills/blob/main/skills/elementor-deploy-verify/resources/wp-cli-reference.md