修复 YITH Compare 只在产品页可用:让 Header 对比按钮在全站任意页面弹出对比表

很多 WooCommerce 商城在安装 YITH WooCommerce Compare 插件后会遇到一个很常见的问题:

✅ 在 产品详情页(Product page) 、产品列表页(Shop page) 点击 Compare 能正常弹出对比表

❌ 但在 Wishlist 页面、博客页、首页、About 页面 点击 Header 的 Compare 图标却没反应

比如你点 Header 图标后 Network 里可能只出现:

  • https://你的域名/cdn-cgi/rum(204 No Content)

而不是 Compare 正常工作的请求:

  • https://你的域名/?wc-ajax=yith-woocompare-reload-compare(200 OK)

这说明:点击事件没有触发 YITH Compare 的 AJAX,而是页面里根本没加载 Compare 所需脚本。

本文分享一个最简单、最稳定的解决方案:

✅ 强制 YITH Compare 脚本全站加载

让你在任何页面点 Header Compare 都能直接弹出对比表。


为什么 YITH Compare 在非产品页无法弹出?

YITH Compare 插件后台有一个设置:

Show compare in:

  • Shop page

  • Product pages

  • Both

这个选项的含义是:

"Compare 按钮显示在哪些产品相关页面上"

但问题在于:

✅ 插件会在 Shop / Product 这些页面里自动加载 Compare 所需的 JS

❌ 在 Wishlist、博客等普通页面,插件为了优化性能,可能不会加载 Compare 的核心脚本

结果就是:

  • 你的 Header 上虽然有 Compare 图标

  • 也加了正确 class:yith-woocompare-open

  • 但是插件 JS 没加载 → 点击根本打不开弹窗


解决方案:强制 Compare 脚本全站加载

✅ 适用场景

如果你希望:

  • Header Compare 图标 全站任意页面都可点开对比表

  • 不想依赖插件默认"只在产品页加载脚本"

  • 不想改插件源码(避免更新覆盖)

那么方案 C 是最稳的做法。


第一步:确保 Header Compare 按钮写法正确

你的 Header 代码类似这样是正确的 ✅:

复制代码
<a href="#" aria-label="Compare" title="Compare" class="yith-woocompare-open">
  <span class="compare-icon">
    <i class="porto-icon-compare-link"></i>
    <span class="compare-count">5</span>
  </span>
</a>

关键点只有一个:

✅ class="yith-woocompare-open"


第二步:把代码加入 functions.php(核心修复)

把下面代码加入你的 子主题 child theme 的 functions.php:

路径一般是:
wp-content/themes/你的子主题/functions.php

复制代码
/**
 * Force YITH Compare scripts to load on all pages
 * So the header compare icon works globally (Wishlist / Blog / Home etc.)
 */
add_action('wp_enqueue_scripts', function () {
    // Don't load in admin dashboard
    if (is_admin()) return;

    // Main script for YITH Compare (script handle may vary by version)
    if (wp_script_is('yith-woocompare-main', 'registered')) {
        wp_enqueue_script('yith-woocompare-main');
    }

    // Popup dependency (some versions rely on Colorbox)
    if (wp_script_is('jquery-colorbox', 'registered')) {
        wp_enqueue_script('jquery-colorbox');
    }
}, 99);

✅ 保存后清缓存,然后刷新任意页面(如 /wishlist/)

此时点击 Header Compare 图标就会正常弹出对比表。


第三步:清理缓存(非常重要)

如果你用了缓存或加速服务(非常常见):

  • WP Rocket / LiteSpeed Cache / Autoptimize

  • Cloudflare 缓存

  • 主题 Porto 的性能优化

请务必做这几步:

✅ 清 WordPress 缓存

✅ 清 Cloudflare 缓存(可用 "Purge everything" 或 Purge URL)

✅ 浏览器强制刷新(Mac:Command + Shift + R)


如何确认修复成功?

打开浏览器开发者工具(F12),点击 Header Compare 按钮,观察 Network:

✅ 成功时应该出现:

  • /?wc-ajax=yith-woocompare-reload-compare

  • 状态码 200 OK

如果你还是只看到:

  • /cdn-cgi/rum

  • 状态码 204

说明 Compare 脚本仍未生效(通常是脚本被延迟加载或未加载)。


常见问题排查(如果仍然打不开)

1)确认页面是否加载了 compare 脚本

在不弹窗的页面(比如 wishlist 页面)按 F12 → Console 输入:

复制代码
document.querySelectorAll('.yith-woocompare-open').length

返回值应该 > 0

如果返回 0,说明你的按钮没真正输出或 class 没生效。


2)性能插件延迟 JS 导致 Compare 失效

如果你启用了 "延迟 JS / 合并 JS / 延迟执行",建议把以下关键词加入排除列表:

  • woocompare

  • yith-woocompare

  • colorbox

这一步很关键,因为 Compare 弹窗属于强交互功能,最怕脚本执行顺序被打乱。


这个方案会影响页面加载速度吗?

很多人担心:全站加载 Compare 脚本会不会变慢?

✅ 结论:一般影响非常小,且可接受。

原因是:

  • Compare 脚本通常几十 KB

  • 只是让页面具备 Compare 能力

  • 真正的 AJAX 请求只会在你点击 Compare 时触发

    (平时不会不断请求数据)

对于 B2B/询盘型网站来说,全站可用的体验比这点资源开销更重要。


推荐设置:让体验更像 Alibaba

如果你想让体验更专业,建议你在 YITH Compare 设置里选择:

Show table when:

✅ The user manually clicks on view anchor

因为 Header 图标就相当于 "View compare table" 入口,点击立即弹出最符合用户预期。


FAQ:YITH Compare 全站弹窗常见问题

Q1:我必须用子主题吗?

强烈建议 ✅

因为主主题更新可能会覆盖 functions.php 修改。


Q2:我的版本脚本句柄不是 yith-woocompare-main 怎么办?

不同版本确实可能不同,但你这次能成功,说明你站点版本已经匹配。

如果你未来遇到句柄不一致的情况,最简单方法是:

  • 打开页面源代码(view-source)

  • 搜索 woocompare 或 compare

  • 找到脚本文件名,再针对性 enqueue


Q3:Compare 图标显示数量怎么自动更新?

compare-count 的数字通常可以通过 JS 或 shortcode 动态刷新。

如果你想做成更像电商的"实时数量徽标",我也可以帮你加一段轻量脚本自动同步。


总结

如果你安装了 YITH WooCommerce Compare,并希望:

✅ Header Compare 图标在 Wishlist / Blog / Home 等任何页面都能弹出对比表

最稳的办法就是:

强制 Compare 脚本全站加载

把下面核心代码加入 functions.php 即可:

复制代码
add_action('wp_enqueue_scripts', function () {
    if (is_admin()) return;
    if (wp_script_is('yith-woocompare-main', 'registered')) {
        wp_enqueue_script('yith-woocompare-main');
    }
    if (wp_script_is('jquery-colorbox', 'registered')) {
        wp_enqueue_script('jquery-colorbox');
    }
}, 99);
相关推荐
李纲明14 小时前
WordPress 前台改完还是旧页:浏览器、CDN、页面缓存、对象缓存怎么分层清
缓存·cdn·wordpress·devdiy
李纲明2 天前
WordPress 结账页一直转圈不跳支付:AJAX、缓存排除、支付回调和 REST 怎么逐层核
运维·ajax·缓存·wordpress·woocommerce·devdiy·结账
李纲明3 天前
WordPress 安装或更新插件提示「无法创建目录」:权限、磁盘空间与 FS_METHOD 排查
wordpress·插件安装·devdiy·无法创建目录·fs_method
李纲明3 天前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie
用户60968624266083 天前
页面构建器做的页面翻译:短代码、区块、动态内容各自会踩什么坑
php·wordpress
李纲明4 天前
WordPress 挂上 Cloudflare 后询盘和后台异常:缓存规则、SSL 模式和真实 IP 怎么核
运维·缓存·https·cdn·wordpress·cloudflare
DEVDIY5 天前
WordPress TTFB 高怎么排查:7 步定位服务端瓶颈
wordpress
李纲明5 天前
WordPress 媒体库上传图片报「HTTP 错误」:php.ini、临时目录、安全插件和 CDN 怎么逐层查
运维·php·上传·cdn·wordpress·媒体库
李纲明8 天前
WordPress 古腾堡点「更新」报「不是有效的 JSON 响应」:我按 REST 接口一路查下来的顺序
运维·nginx·php·wordpress·rest api
李纲明8 天前
WordPress 首页正常、内页全 404:固定链接与伪静态规则排查步骤(Apache / Nginx)
nginx·apache·wordpress