首页指南Wix 的 Embed Code 为什么装不下评论区?

Wix 的 Embed Code 为什么装不下评论区?

看着最像为这件事准备的那个元件,正是让它跑不起来的那个。入口在 Body - end 的 Custom Code。

更新

Wix 上是可以跑一个真正的评论区的,只是不能走 Embed Code 那个看着像专为此准备的元件。它是从 Wix 域名下发的沙盒 iframe,而一个要确认自己身处哪个网站、还要请访客用 Google 登录的小部件,在里面读到的来源不是你的,于是停在那里。走得通的那条路是 放在 Body - end 的 Custom Code:加载器,再加上几行代码,把挂载元素造出来并挂到你指定的容器下面。Custom Code 要求网站已发布并接上域名,所以付费的 Wix 套餐是入场券。

先过套餐这一关

Wix 从来没写过“自定义代码需要 X 套餐”这句话。它写的是另外两句,加起来就是这个意思。开发者文档说,自定义代码要跑起来,网站必须已发布并接上域名。帮助中心说,接自己的域名要先买域名,再买一个 Wix 的网站套餐。所以免费的 wixsite.com 网站用不了 Custom Code:面板看得见,代码就是不执行。

不过也不需要更高的等级。Wix 列出 Light、Core、Business 和 Business Elite,并写着 "All plans allow you to have a custom domain",所以最入门的那一档就已经过关。Light 是这个序列里的入门档,说的是它在名单上的位置,不是价格上的判断:本文查到的这几个帮助页面上,Wix 没有登出任何金额,还说明 Premium 的价格因地区而异,所以按价格给等级排序不是这篇文章能诚实做到的事。关卡是自有域名,而每个付费套餐都带一个。Wix Studio 的网站按同样的逻辑走另一套 Studio 等级。真正的数字请在自己的账户里看,那里的价格是按你所在的地区标的。

你要装的到底是什么

小部件本身就在这个页面上跑着。想看完整的一圈,随手发一条试试。挂对了位置,它在 Wix 页面上长得一模一样,因为到那时它不过是你网站上的一个 div。

预览

2 条评论

添加评论…
以 Alex 身份评论发布
  • M
    Maya2 小时前

    真的一行就搞定了,没想到安装这么简单!

  • J
    Jordan昨天

    连登录都是共享的,不用再额外接入。👍

带示例回复的一段评论。Google 登录和控制台里的审核跟着安装一起来,不在这段预览里。

Embed Code 元件为什么跑不了它

编辑器有两个,走到同一个元件的路却不一样,所以照着别人的步骤做之前,先认清自己用的是哪一个。在 Wix Editor 里:Add Elements,然后 Embed Code,然后 Popular Embeds,然后 Embed HTML,接着 Enter Code 并 Apply。在 Wix Studio 里:Add Elements,然后 Embed & Social,然后 Embed Code,接着 Enter Code 并 Apply。带 Embed & Social 这一组的是 Studio;老的 Editor 把同一样东西归在 Popular Embeds 下面,名字叫 Embed HTML。顺带交代一下本文的写法:Wix 帮助中心的中文版只有繁体,没有简体,所以这里的面板名和按钮名一律保留英文原样,括号里写的是那一步在做什么,不是简体标签。无论走哪一条路,画布上都会落下一个方框,你把 HTML 粘进去,HTML 就渲染出来,看上去正是任何“必须待在某个具体位置”的东西该住的地方。

Wix 自己的文档给的是相反的说法:HTML 元件创建的是一个沙盒环境,也就是一个 iframe,它无法直接访问页面上的其他元素,需要访问页面其余部分的小部件在里面不会工作。在那个方框里,你并不在自己的网站上,你在一个画进你版式里的 Wix 沙盒来源上。

这一下把评论小部件断了两次。它读 location.hostname,拿去和登记在你 site id 名下的域名比对,这正是别人没法把你的嵌入代码搬到自己站上的原因。在 iframe 里,那个 hostname 属于 Wix,比对不通过。Google 登录另外还要校验发起请求那个页面的来源,而来源是沙盒,不是你的域名。两条都补不了。沙盒存在的意义,恰恰就是让里面的代码没法自称是你的页面。

失败是安静的,这才是要搭进去半天的地方。编辑器里不会红。已发布的网站上是一个空框,或者一个弹出来又关上、访客照旧没登录的登录窗。

问题Custom Code,Body - endEmbed Code 元件(HTML iframe)
代码在哪里执行你真正的页面,在你的域名上Wix 来源上的一个沙盒 iframe
location.hostname 读出来是你的域名吗不是,读出来是沙盒
Google 登录能不能走完不能,来源不是你的
能不能精确摆进版式只能靠脚本,用选择器能,直接拖元件
能不能碰页面的其余部分不能,只有 postMessage 能越界
需要什么套餐带已接域名的付费 Wix 套餐文档没写,免费网站能否使用也没写
编辑器或预览里看得见吗看不见,只有已发布的网站上有看得见,点了 Apply 之后
能不能承载托管式评论小部件不能
Wix 把一次普通的小部件安装拆到两个功能上,而只有其中一个装得下它。

各家建站工具在这里并不一样,这也是同一个小部件每换一个平台就要换一套安装法的原因。Webflow 的嵌入元件没有沙盒,所以那边的挂载 div 直接落在页面上,Webflow 的安装步骤就是这个故事的简短版。

真正能用的那套装法

Custom Code 能够到三个位置:<head>、body 开头和 body 结尾。没有一个是“文章正文下面”。所以脚本自己造一个挂载元素,再把它放到你想要的地方。整个诀窍就是这个,加在加载器上大约五行。

  1. 把 Wix 已经替你定好的那个已接域名登记进来

    在别的建站工具上,这一步是个选择题:预发布主机还是正式主机,裸域还是 www,网站能应答的好几个地址里挑一个。Wix 把这道选择题拿走了,这一次反倒帮了忙。自定义代码在网站发布并接上域名之前不会执行,所以打开这项功能的域名,和小部件必须认得的域名是同一个,而且只有一个。到 BootSignal 控制台里,照地址栏里解析出来的样子把这个主机名加进去,www 也照写,控制台随即发给你下面那段代码要用的 site id。wixsite.com 那个地址不是可以拿来替代登记的选项:那是自定义代码还没醒过来时你所在的地址。

  2. 在网站控制台里打开 Custom Code

    这个面板在网站的 dashboard(控制台)里,不在编辑器画布上,而且 Wix Editor、Wix Studio 和 Wix Harmony 的路径完全一样。进 Settings,在 Development & integrations 里找到 Custom Code,再点右上角的 + Add Custom Code。

  3. 两段代码粘进同一条记录

    加载器和挂载脚本放进同一个文本框。把 data-site-id 换成你的 site id,把 TARGET 换成评论区该挂在其下的那个元素的 CSS 选择器。给这条记录起个以后认得出来的名字,比如“BootSignal comments”。

    代码
    <script src="https://bootsignal.com/bootsignal.js"
            data-site-id="YOUR_SITE_ID" data-lang="zh-cn" defer></script>
    
    <script>
    (function () {
      // CSS selector for the element the thread should be appended to.
      var TARGET = '#comments';
      var timer;
    
      function mount() {
        var host = document.querySelector(TARGET);
        if (!host) return;
        if (host.querySelector('[data-bootsignal="comments"]')) return;
        var el = document.createElement('div');
        el.setAttribute('data-bootsignal', 'comments');
        // One thread per URL. On Wix Blog this is the post slug.
        el.setAttribute('data-thread-id', location.pathname);
        host.appendChild(el);
        // Ask the loader to scan again, in case it already ran.
        if (window.BootSignal && window.BootSignal.activate) window.BootSignal.activate();
      }
    
      function schedule() { clearTimeout(timer); timer = setTimeout(mount, 150); }
    
      // Wix warns its renderer may re-render elements, so watch instead of firing once.
      schedule();
      new MutationObserver(schedule).observe(document.body, { childList: true, subtree: true });
    })();
    </script>
  4. 选页面,也选位置

    在 Add Code to Pages 下面选 All pages,连以后新建的页面也包含在内;只有博客需要评论区的话就选 Choose specific pages。在 Place Code in 下面选 Body - end。选了 All pages 时 Wix 还多给一个选择,用它自己的话说,是让代码 "only once per visit, or on each page your visitor opens" 加载。Wix 只把这个选择写了出来,没写什么时候该选哪一个,所以把它当成一颗可以拧的旋钮,而不是一条规则:先从每次访问加载一次开始,如果新打开一个页面时评论区在、从列表点进去时不在,就改成每个页面都加载,然后重新发布。

  5. Apply、发布,然后打开线上的网站

    自定义代码在编辑器里不生效,只在已发布的网站上执行,而且这些代码片段不会作为元件出现在画布上,所以在网站上线之前根本没有东西可看。Apply,发布,打开真实网址,滚到你的目标位置。

2025 年 12 月那一层安全措施

还有一件事得和“粘上去、发布”放在同一口气里说,因为它决定了粘进去的代码到底跑不跑。Wix 的自定义代码页面上挂着这条通告:"In December 2025, Wix introduced new frontend security measures for custom code on Wix sites. This means that some code snippets that previously worked may now be blocked until the provider updates them. This change affects all types of custom code, including dashboard custom code, embedded code, and Velo code." 这里面没有一句是冲着我们来的。它对每一段被人粘进 Wix 网站的第三方脚本都成立。

通告背后那个开发者页面列出了到底改了什么。fetchXMLHttpRequest 被换成加固过的版本,用 Wix 的说法是 "Can't be replaced or reassigned"。通过 document.cookie 写 Wix 的 cookie 会静默失败。同域上的 window.open 返回一个空对象。前端代码在同域创建的 iframe 会被自动沙盒化,srcdoc 属性被禁用。URLJSONStringObjectaddEventListenerremoveEventListenerEventTarget 以及 Service Worker 那几个 API 被锁住,改不动。setTimeoutsetInterval 不再接受字符串作为第一个参数。

把这份清单和上面那段代码放在一起看,就能看出它是照着什么形状写的。它创建一个普通的 div,把它追加进去,观察文档,交给 setTimeout 的是一个函数而不是字符串。它不给任何全局对象打补丁,也不自己造 iframe。这份清单仍然值得留在视野里:去年还能在某个 Wix 网站上跑、今年在同一个网站上不跑了的脚本,第一个要查的就是它;而且不管出自谁手,只要一个小部件去改写 fetch 或者手写 cookie,它在这里的日子就是借来的。

挑一个 Wix 不会改名的选择器

Wix 动态生成类名和元素 id,它自己的文档也提醒,冲着这些标识写的 CSS 或 JavaScript 可能在网站重新发布之后失效。#comp-abc123 是一个带保质期的选择器。真要用,就从线上网站的开发者工具里复制,并且在每次大改编辑器之后重新核对一遍。

更耐久的做法是锚在你自己掌握的内容上,而不是 Wix 掌握的标记上。在评论区该在的位置放一个文本元件,往里打一串标记文字,然后由脚本找到这串文字并把它换掉。这串字符是你的,重新发布也活得下来,访客也永远看不见它。

标记版:把找选择器那一段换成这个
<script>
(function () {
  // Type this exact text into a Wix text element where the thread belongs.
  var MARKER = '[[comments]]';
  var timer;

  function slot() {
    var all = document.body.getElementsByTagName('*');
    for (var i = 0; i < all.length; i++) {
      var n = all[i];
      if (!n.children.length && n.textContent.trim() === MARKER) {
        return n.closest('[id^="comp-"]') || n.parentElement || n;
      }
    }
    return null;
  }

  function mount() {
    var host = slot();
    if (!host) return;
    host.textContent = '';
    var el = document.createElement('div');
    el.setAttribute('data-bootsignal', 'comments');
    el.setAttribute('data-thread-id', location.pathname);
    host.appendChild(el);
    if (window.BootSignal && window.BootSignal.activate) window.BootSignal.activate();
  }

  function schedule() { clearTimeout(timer); timer = setTimeout(mount, 150); }
  schedule();
  new MutationObserver(schedule).observe(document.body, { childList: true, subtree: true });
})();
</script>

这段脚本为什么是一直看着,而不是只跑一次

关于自己的渲染方式,Wix 写明了一件事,而这件事塑造了每一次手工挂载:"may re-render elements in ways that conflict with direct DOM manipulation, especially during page transitions or viewport changes." 这是厂商在说,你亲手挂上去的节点,脚下的地是会动的,并且点名页面切换就是它动的时刻之一。Wix 在任何地方都没写清楚的是:访客从博客列表走进一篇文章时,粘进去的代码片段会变成什么样。第 4 步里那个加载选择也是以同样的方式给出的,一个选项,不附带任何建议。所以诚实的说法是,挂载的时机和挂载的存活,两样都没有对你做出承诺。

所以这段脚本不押注于一次全新的页面加载,也不押注于 div 会一直待在放它的地方。它是一个观察者,不是一次性动作:观察者注意到新的页面内容,超时把一连串变动收拢成一次尝试,而挂载函数在目标里已经有评论区时提前退出。加载器会给自己挂过的东西打上标记,所以重新扫描不会画出第二份。data-thread-id 在创建 div 的时候从 location.pathname 读出来,于是每篇文章自动拿到自己的对话,模板那边一点活都不用干;而一次把 div 移走的重渲染,本身就是观察者听得见的变动。

在 Wix 之外还要花多少

Wix 按网站套餐收你的钱。BootSignal 按已登记域名收费,而在一个 Wix 网站上这两者是同一个“一”:每个已登记域名每月 $20 或每年 $200。它覆盖目录里全部 38 个小部件,也覆盖你订阅之后新加的那些,账单不会随流量动。再多一个 Wix 网站,是控制台里多一个域名,而不是换一个更大的套餐。细节在价格页

有一条和 Wix 有关的域名提醒,它咬人的时候多半是在你测试的时候,而不是安装的时候。如果你为了检查成果而用 wixsite.com 那个地址打开已发布的网站,主机名比对不会认这个地址,评论区就一声不响。那里什么都没坏,那是你登记域名换来的白名单在做它该做的事。请在已接的域名上检查,访客本来也只会出现在那个地址上。

这个页面上找不到竞品价格,因为对比表里一个过期的数字比没有更糟。备选方案那一栏收着它们,带出处和核对日期。

在已发布的 Wix 页面上放一段评论

登记已接的域名,在 Body - end 粘一条 Custom Code 记录,发布。

同一个加载器把其余的也一起带上

其他每一个小部件都复用你刚粘好的加载器和同一套挂载手法,所以第二个的代价只是把挂载函数复制一份,换一个 data-bootsignal 的值。意见箱在 Wix 上很搭:那些不肯在公开场合发言的人,往往愿意私下告诉你点什么。

预览
留下你的意见…
发送

意见箱小部件。安装的形状一样,挂载的值不一样。更多写在意见箱页面

有一个小部件值得单独说一句,因为 Wix 网站常常是在卖东西的。社会认同提示只重放你的网站真实拥有的活动:已经存在你域名下的评论、表情、评分和投票。它造不出俄亥俄州的某位买家,也不会去试。还没有活动的时候它什么都不显示,这是设计好的行为。

已发布的页面上一片空白时

按顺序走一遍下面这张单子。Wix 明说了他们不会陪你一起走:"We cannot provide support for external codes that were not created or tested by Wix. If you are experiencing an issue with your code snippet, please contact the provider directly." 知道是哪一步断的,能把这句话变成发给我们的两行消息,而不是一场猜谜。

  1. 你打开的是已发布的网站吗?自定义代码在编辑器和预览里从不执行。
  2. Network 面板里有 bootsignal.js 吗?没有的话,这条 Custom Code 记录没有覆盖到这个页面。
  3. 在线上页面的控制台里执行 document.querySelector(TARGET),它返回元素了吗?返回 null 就是选择器写错了,或者 Wix 改了名字。
  4. 控制台里有没有关于 site id 或 thread id 缺失的告警?那说明 div 挂上了,属性没挂上。
  5. 地址栏里的域名和登记的那个一致吗,www 也一致吗?差一点也算不一致。
  6. 这段一模一样的代码,在 2025 年 12 月之前在这个网站上跑过吗?Wix 说新的前端安全措施会拦下以前能跑的代码,直到提供方更新它。
  7. 检查那块空白:如果你的 div 待在一个 <iframe> 里面,那说明代码粘进了 Embed Code 元件,在那里它永远跑不起来。

常见问题

直接粘进 Embed Code 元件不行吗?
不行。Wix 自己的文档把那个元件写成一个沙盒 iframe,无法直接访问页面的其余部分,而且它是从 Wix 的来源下发的,不是你的。域名比对过不去,Google 登录也走不完。你拿到的是一个空框而不是一条报错,所以它才这么费时间。
Wix 编辑器和预览里会不会显示评论?
不会。Wix 说明,自定义代码在编辑器里不生效,只在已发布的网站上执行,而且代码片段不会作为元件出现在编辑器里。请先发布,打开线上网址,用浏览器的开发者工具去看。这件事没有编辑器内的预览可用。
我的 Google Analytics 代码从 Custom Code 里也一直没触发,是同一个原因吗?
不是,那一条是写明的例外,既不是沙盒,也不是安全措施拦的。Wix 说明,Google Analytics、Google Tag Manager 以及 Facebook 和 TikTok 像素这类跟踪脚本不通过自定义代码工作,它们要走 Wix 自己的营销集成。评论小部件不是跟踪脚本,从 Body - end 的记录里正常执行,所以一个不动的分析代码并不能证明这个面板坏了。
每篇博客文章怎么各自拿到自己的对话?
脚本在创建 div 的时候用 location.pathnamedata-thread-id 赋值,于是每个文章网址自动成为一段独立的对话。以后改了文章网址,它的对话还留在旧路径上,所以在攒下大量留言之前,先把网址结构定下来。
这会给一个 Wix 页面本来的加载量增加多少?
加载器标签带 defer,不挡渲染,而且只有在页面上找到挂载元素时才去取评论模块。挂载脚本是几十行,带一个防抖的观察者。没有东西是白来的,不过这比一个普通 Wix 页面上的图片轻。
Wix 页面上露出来的 site id 算不算机密?
不算,也不可能算。Wix 提醒,注入的代码任何查看页面源码的人都看得到,任何前端嵌入都是如此。保护 site id 的是域名白名单:小部件只在登记给它的域名上应答,所以抄走的代码片段在别处什么也做不了。真正的 API 密钥仍然不该出现在 Custom Code 片段里。
登记 Wix 域名,拿到 site id

一个主机名要登记,一条 Custom Code 记录要粘。把两者接起来的就是 site id。

数据来源