搜索全站
插件 10 分钟阅读

Asset CleanUp 与 Perfmatters 按页面卸载资源:逐页禁用无用插件脚本

装了 20 个插件,每个页面却只用到 3 个的功能?本文讲清用 Asset CleanUp 与 Perfmatters 按页面卸载无用 CSS/JS 的方法,以及用 wp_dequeue_script 手工实现同一效果的代码方案。

U
UFO_PF 2025-06-29 · 阅读 10 分钟
As 插件
阅读提示
本文约 3,923 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:Contact Form 7 的 CSS 加载在全站每一个页面上

这是 WordPress 最典型的性能浪费场景:你在”关于我们”页放了一个联系表单,装上 Contact Form 7。结果这个插件的 CSS 和 JS 被加载到了全站 500 个页面上——包括首页、文章页、产品页,而这些页面上根本没有表单。

同理,WooCommerce 的样式会出现在博客文章页上,滑块插件的 JS 会出现在没有滑块的页面上。一个装了二十个插件的站点,首页 <head> 里可能有三十多个 CSS 和二十多个 JS,其中大半是白加载的。这些资源消耗的不只是带宽,还有浏览器解析和执行的 CPU 时间,直接反映在 LCP、INP 这类指标上。

解决思路有两个方向:用插件在后台逐页勾选卸载(Asset CleanUp、Perfmatters),或者用代码精确控制(wp_dequeue_script)。两者各有适用场景,后者的长期可维护性其实更好。

原理分析:卸载发生在什么环节

WordPress 的资源加载链路是:插件调用 wp_enqueue_style() / wp_enqueue_script() 注册资源 → 核心在 wp_head(样式)和 wp_footer(脚本)时输出标签。

“卸载”就是在输出之前的某个时机,从已注册队列里把它摘掉。可用的核心函数:

函数 作用
wp_dequeue_script( $handle ) 从队列中移除已注册的脚本
wp_dequeue_style( $handle ) 移除已注册的样式
wp_deregister_script( $handle ) 彻底注销注册
wp_script_is( $handle, 'enqueued' ) 判断是否已入队
wp_style_is( $handle, 'enqueued' ) 同上,针对样式

时机很重要:必须在插件 enqueue 之后、wp_head 输出之前。wp_print_styles / wp_print_scripts 钩子(优先级 100 以上)是常用的位置,也可以用 wp_enqueue_scripts 并给一个足够大的优先级。

Asset CleanUp 和 Perfmatters 做的正是这件事,只是把”判断条件”变成了后台的勾选框,存进 post meta。两者的差异:

项目 Asset CleanUp Perfmatters
免费版能力 免费版即可逐页/按类型卸载,功能很全 Script Manager 属付费功能
卸载粒度 按页面、按文章类型、按 URL 正则 按页面、按文章类型、按设备
调试方式 提供 Test Mode(仅管理员生效) 提供测试模式
附加功能 预加载、内联、站点级规则 与 Perfmatters 其他优化项整合
界面位置 文章编辑页下方独立面板 文章编辑页的 Perfmatters 面板

保姆级实操

方案 A:用 Asset CleanUp 逐页卸载

第一步:安装并开启 Test Mode

安装启用 Asset CleanUp Pro / Asset CleanUp(免费版)后,进入 Asset CleanUp → Settings → Plugin Usage Preferences,把 Test Mode 打开。这一步非常关键——卸载操作有风险,Test Mode 下规则只对登录管理员生效,前台访客不受影响,可以随时试错。

第二步:在文章编辑页管理资源

编辑任意文章/页面,页面下方会出现 Asset CleanUp: CSS/JS Manager 面板,列出该页加载的所有样式与脚本。每条右侧有几个选项:

  • Unload on this page:只在这一页卸载;
  • Unload site-wide (everywhere):全站卸载;
  • Unload on all pages of this post type:在该文章类型的所有页面卸载;
  • Unload via RegExp:用正则匹配 URL 卸载。

第三步:用正则批量处理

比如只在含 /blog/ 的页面上卸载电商样式:

Unload via RegExp: ^/blog/.*

第四步:验证并关闭 Test Mode

# 对比卸载前后的资源数量
curl -s https://mimangfei.com/about/ | grep -c 'rel="stylesheet"'
curl -s https://mimangfei.com/about/ | grep -c '<script'

确认前台功能正常后关掉 Test Mode 让规则对所有人生效。

方案 B:用代码精确卸载(推荐长期维护)

<?php
add_action( 'wp_print_scripts', function () {
    // 只有单篇文章才加载评论回复脚本
    if ( ! is_singular( 'post' ) || ! comments_open() ) {
        wp_dequeue_script( 'comment-reply' );
    }

    // 没有联系表单的页面不加载 CF7
    if ( ! is_page( array( 'contact', 'about' ) ) ) {
        wp_dequeue_script( 'contact-form-7' );
        wp_dequeue_style( 'contact-form-7' );
    }

    // 非 WooCommerce 页面卸载电商样式
    if ( function_exists( 'is_woocommerce' ) && ! is_woocommerce() && ! is_cart() && ! is_checkout() ) {
        wp_dequeue_style( 'woocommerce-general' );
        wp_dequeue_style( 'woocommerce-layout' );
        wp_dequeue_style( 'woocommerce-smallscreen' );
        wp_dequeue_script( 'wc-add-to-cart' );
    }

    // 全站都不用的:emoji
    wp_dequeue_script( 'concatemoji' );
}, 100 );

handle 名字怎么找?用命令列出来:

# 在模板里临时打印所有已注册的 handle
wp eval "
add_action('wp_print_scripts', function(){
    global \$wp_scripts;
    foreach (\$wp_scripts->queue as \$h) { echo \$h . PHP_EOL; }
}, 999);
" 2>/dev/null

更实用的方式是在浏览器装 Query Monitor 插件,打开任意页面的 “Scripts & Styles” 面板,handle、来源插件、依赖关系一目了然。

常见踩坑

  1. handle 名字猜错。wp_dequeue_script('woocommerce') 可能根本不存在,正确名字要从已注册列表里查。
  2. 卸载时机太早。在 wp_enqueue_scripts 默认优先级(10)上调用,插件还没来得及 enqueue,卸载无效。用 wp_print_scripts 优先级 100。
  3. 卸载了依赖项。某个脚本依赖 jQuery,你只卸载了目标脚本还好;反过来把 jQuery 卸了,依赖它的全崩。
  4. 案例:某站点用 Asset CleanUp 全站卸载了一个”看起来没用”的脚本,结果是主题的移动端菜单依赖它,桌面端测试一切正常,移动端菜单彻底打不开,一周后才被用户反馈。教训是:每卸载一项都要在移动端和桌面端各验证一次,并且先在 Test Mode 下跑满一周。
  5. 插件更新后 handle 改名。代码方案需要跟着更新,插件方案不受影响——这是插件的优势。
  6. 卸载规则存在 post meta 里,换主题会丢失部分配置。迁移时要把规则一起备份。
  7. Test Mode 忘了关。前台访客仍然加载全部资源,白配置一场。

总结

选择建议:站点上有几十个插件、需要频繁按页面微调时,用 Asset CleanUp(免费版就够),务必开 Test Mode 并按”先单页、再类型、最后正则”的顺序推进;只需要几条固定规则(卸载 emoji、卸载评论脚本、非电商页卸载 WooCommerce 样式)时,十几行 wp_dequeue_script 代码更干净、更可控、也不受插件更新影响。无论哪种方案,唯一可靠的验证方式是:改完后逐页点一遍所有交互功能,并在移动端复测。

资源卸载之外,合并压缩可以配合 Autoptimize 合并压缩 CSS/JS 的正确姿势;缓存层建议参考 LiteSpeed Cache 插件完整配置教程。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。