如何移除WordPress插件添加的script与style标签的type属性?
解决WordPress插件脚本/样式标签type属性无法移除的问题
你的现有代码只对主题文件生效,核心原因是:style_loader_tag 和 script_loader_tag 这两个过滤器仅作用于通过WordPress官方脚本/样式加载器(wp_enqueue_style/wp_enqueue_script)注册的资源。而不少插件为了实现快速加载或者兼容旧版本,会直接在模板里硬编码输出 <script> 或 <style> 标签,完全不走WordPress的队列加载流程,所以你的过滤器根本抓不到这些标签。
要解决这个问题,我们可以用全局输出缓冲的方法,直接拦截整个页面的HTML输出,统一移除所有符合条件的type属性——不管是主题还是插件输出的标签,只要出现在最终页面里,都会被处理。
以下是完整的解决方案代码:
// 启动输出缓冲,统一处理页面输出 add_action('wp_loaded', 'codeless_init_output_buffer'); function codeless_init_output_buffer() { ob_start('codeless_remove_all_type_attr'); } // 回调函数:移除所有script和style标签的type属性 function codeless_remove_all_type_attr($output) { // 处理type属性在标签开头的情况 $output = preg_replace('/<script\s+type=["\']text\/javascript["\']/', '<script', $output); $output = preg_replace('/<style\s+type=["\']text\/css["\']/', '<style', $output); // 处理type属性在标签其他位置的情况 $output = preg_replace('/\s+type=["\']text\/(javascript|css)["\']/', '', $output); return $output; }
补充说明:
- 为什么这个方法有效?
输出缓冲会把页面生成的所有HTML先暂存到内存里,直到页面全部生成完毕,再通过我们的回调函数对整个HTML内容进行正则替换,覆盖了所有来源的标签输出。 - 现有代码还能保留吗?
可以保留,它会继续处理走WordPress队列的资源,和新方法形成互补——不过其实新方法已经覆盖了所有场景,你也可以只保留新代码。 - 注意事项:
如果你的网站使用了缓存插件,修改代码后一定要清空缓存才能看到效果;另外,正则表达式已经覆盖了常见的属性写法,比如type属性在标签中的不同位置。
内容的提问来源于stack exchange,提问作者Elichy
相关产品推荐
相关产品推荐

