尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Elementor MCP create-preview-link:用签名限时链接实现 Agent 对草稿内容的匿名自验证

Elementor MCP create-preview-link:用签名限时链接实现 Agent 对草稿内容的匿名自验证 Elementor MCP create-preview-link用签名限时链接实现 Agent 对草稿内容的匿名自验证【免费下载链接】elementorThe most advanced frontend drag drop page builder. Create high-end, pixel perfect websites at record speeds. Any theme, any page, any design.项目地址: https://gitcode.com/GitHub_Trending/el/elementor在 Elementor 的 MCPModel Context Protocol模块中create-preview-link是一个面向 AI Agent 的自验证能力它为一篇文章的当前 Elementor 内容生成一个签名的、限时的、匿名可访问的预览 URL让 Agent 在修改页面后无需登录 WordPress 就能抓取该链接、截图并确认渲染结果符合预期。阅读本文后你将理解该能力的输入/输出契约、url与edit_url两个返回字段的边界、底层 revision 快照 HMAC 签名 token 的实现机制以及匿名渲染器如何在不发布内容的情况下把冻结快照渲染出来。能力定位为 Agent 的验证闭环而生的只读快照该能力由 Create_Preview_Link_Ability 实现能力 ID 为elementor/create-preview-link。其核心目标见能力自带的提示词资源 create-preview-link.md生成签名限时 URL渲染当前 Elementor 内容的快照且无需 WordPress 登录仅供 Agent 自验证在变更类调用如elementor/build-composition、elementor/manage-elements、elementor/update-page-settings返回后立刻调用用浏览器/截图工具 fetch 返回的url验证渲染是否符合预期url禁止分享给用户该字段是一次性的——限时、冻结在某个快照上、过期即失效只服务于 Agent 自身的验证循环。需要用户看链接时应分享同一次调用返回的edit_url字段。编辑器链接具备三个特性跨会话持续有效、反映实时变更而非冻结快照、要求用户以具备编辑权限的 WordPress 身份登录——这正是谁有权查看草稿内容的正确访问模型。输入输出契约一次调用拿到什么从 Create_Preview_Link_Ability 的get_definition()可以看到完整的 JSON Schema输入只有一个必填参数参数类型说明post_idinteger必填要快照的文章 ID输出type: object字段类型说明urlstring (uri)匿名限时预览 URL仅供 Agent 自验证渲染不要分享给用户edit_urlstring (uri)Elementor 编辑器 URL用户需要链接时分享这个需以编辑者身份登录post_idinteger文章 IDrevision_idinteger本次快照对应的修订版本 IDexpires_atstring (date-time)ISO 8601 过期时间expires_at_unixintegerUnix 时间戳形式的过期时间能力标注annotations为readonly: false、idempotent: false、destructive: false且is_exposed_via_proxy()返回false即该能力不出现在代理通道中。权限守卫逻辑要求调用方满足current_user_can( edit_post, $post_id )。执行流程校验、快照、签发三步走execute()方法create-preview-link-ability.php#L77-L109按固定顺序执行校验文章validate_postpost_id必须存在且文章必须is_built_with_elementor()否则返回invalid_post404或not_elementor_post400校验权限check_edit_permission不满足编辑权限时返回rest_cannot_edit403提示语为 Sorry, you are not allowed to share a preview of this post.创建修订快照snapshot_revision调用wp_save_post_revision( $post_id )把当前内容冻结成一个 revision若 WordPress 返回空值内容未变化导致未产生新修订则回退到wp_get_post_revisions()取最新一条 revision 的 ID两者皆无则返回revision_failed500。快照的意义在于预览 URL 渲染的是签发时刻的内容此后用户再怎么编辑都不会影响这个链接的输出签发 token过期时间取time() TTL_MINUTES * MINUTE_IN_SECONDS其中TTL_MINUTES 5即链接存活5 分钟随后用Preview_Token::encode()生成 token拼接url字段为home_url(/)上附加elementor_preview_token查询参数edit_url取文档对象的get_edit_url()。token 结构base64url 载荷 HMAC-SHA256 签名token 的编解码实现在 Preview_Token格式为payload.signature两段以.分隔payload将{p: post_id, r: revision_id, e: expires_at}三个声明claimsJSON 化后做 base64url 编码signature对 payload 用hash_hmac( sha256, ..., true )计算签名后再 base64url 编码密钥来源secret()返回wp_salt( auth ) . elementor_preview_link_v1SECRET_NAMESPACE常量。站点盐值不同意味着 token 无法跨站点伪造命名空间后缀则把密钥用途与其他 Elementor 签名区分开验签decode()用hash_equals()做恒定时间比较任何篡改都会使签名校验失败而返回null解码后强制校验p、r、e三个字段齐全。这个设计的直接效果是拿到链接的任何人包括 Agent 的无头浏览器都不需要任何登录态即可访问但链接既不能伪造、也不能指向签发者未曾快照过的 post/revision 组合。匿名渲染Public_Preview_Handler 如何把快照发布出来url之所以匿名可用靠的是 Public_Preview_Handler。它在模块构造时被注册module.php#L68通过parse_request钩子优先级 1在请求解析早期介入激活条件从$_GET[elementor_preview_token]读取原始 token依次完成验签、is_expired()过期检查、is_valid_post()post 存在且非 revision 本身、且为 Elementor 构建的文档、is_valid_revision()确为revision类型且post_parent匹配。任一环节失败就静默退出请求按普通 404/正常路由处理——这是无效 token 不产生任何副作用的安全边界重写主查询把query_vars改写为指向目标 post且post_status白名单包含publish、draft、pending、private、future、auto-draft从而让未发布的文章也能被前台查询命中注入渲染过滤器get_post_metadata过滤器对OVERRIDDEN_META_KEYS中的 8 个 Elementor 元键_elementor_data、_elementor_page_settings、_elementor_css、_elementor_edit_mode、_elementor_template_type、_elementor_version、_elementor_pro_version、_elementor_element_cache用 revision 上预热的元数据替换父文章的值——这就是渲染冻结快照而不是渲染当前 live 内容的机制revision 上没有的键则回落到父文章原值posts_results与the_preview过滤器把目标 post 的post_status临时改写为publish绕过仅已发布内容可前台渲染的限制隐私头响应带上X-Robots-Tag: noindex, nofollow, noarchive、Cache-Control: private, no-store, max-age0、Referrer-Policy: no-referrer防止这种临时内容被搜索引擎收录或缓存。提示词资源如何进入 Agent 的工具描述create-preview-link.md 并不只是一个说明文档它会被 Prompt_Loader 在构建Ability_Definition时通过Prompt_Loader::load( create-preview-link )读入成为该能力暴露给 MCP 客户端的工具描述description。Prompt_Loader还会在 Elementor Pro 存在时合并ELEMENTOR_PRO_PATH/modules/mcp/static-resources-extra/abilities/下的同名扩展文档——即自由版给出基础说明Pro 版可追加补充指引。模块在wp_abilities_api_init时遍历 Ability_Registry 中的全部能力Create_Preview_Link_Ability在 module.php#L143 注册逐一register()能力 ID 前缀即 MCP 工具名中的elementor/。测试验证安全边界都有对应断言tests/phpunit/elementor/modules/mcp/preview/test-public-preview-handler.php 覆盖了渲染器的全部安全边界无 token、garbage.token伪造 token、过期 tokentime() - 10、post 不存在、非 Elementor 文章、revision 父级不匹配——六种情况均断言元数据过滤器什么都不做有效 token 场景断言返回的_elementor_data是 revision 快照值[snapshot]而非 live 值liverevision 未覆盖的键如_elementor_css回落到父文章其他 post ID 完全不受影响无关元键如_thumbnail_id不被篡改query_vars被正确重写且post_status白名单包含draft。token 编解码另有独立用例 test-preview-token.php能力层本身则有 test-create-preview-link-ability.php。实战要点小结调用时机紧跟在build-composition、manage-elements、update-settings等变更类能力之后作为验证闭环的一环链接生命周期固定 5 分钟TTL_MINUTES过期后is_expired()判死、请求按普通路由处理重新调用能力即可换新链接分享纪律对用户永远只给edit_urlurl是 Agent 内部验证专用快照语义token 绑定的是签发时的 revision验证期间页面被并发编辑也不会污染验证结果安全模型HMAC 签名 站点盐防伪造元键白名单覆盖防内容串写parse_request早期激活失败即静默降级隐私头防止临时内容进入索引与缓存。【免费下载链接】elementorThe most advanced frontend drag drop page builder. Create high-end, pixel perfect websites at record speeds. Any theme, any page, any design.项目地址: https://gitcode.com/GitHub_Trending/el/elementor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表