修复 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)

  • 搜索 woocomparecompare

  • 找到脚本文件名,再针对性 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);
相关推荐
Web极客码4 天前
如何在 WordPress 中设置会员内容:简单两步实现注册用户专属访问
运维·wordpress·网站管理·网站维护
WordPress学习笔记5 天前
经典免费的wordpress模板
wordpress
Web极客码6 天前
修复WordPress“Cookies Are Blocked Due to Unexpected Output”错误的全攻略
wordpress·wordpress主题·网站运维
gpldock2228 天前
The ROI-Driven Agency‘s Secret Weapon: 2024 WordPress Stack for Conversions
wordpress
WordPress学习笔记9 天前
简洁易用适合新手的wordpress主题模板
wordpress
探索宇宙真理.9 天前
WordPress FS注册密码漏洞 | CVE-2025-15001 复现&研究
经验分享·开源·wordpress·安全漏洞
WordPress学习笔记10 天前
给wordpress网站的图片加alt标签
wordpress
凉风听雪10 天前
WordPress+Elementor+Woocommerce配置产品聚合页和分类页多项筛选产品功能
wordpress·外贸·独立站·b to b
凉风听雪10 天前
WordPress+Elementor+ACF+Premium Addons PRO实现字段判定组件显隐
wordpress