限制插件仅在选定页面上加载其CSS和JS?


9

我想使一个插件将其CSS样式表和JavaScript JS文件的加载限制为仅需要它们的那些页面。

我的问题的一个示例是插件Contact Form 7,我曾在网站的一个页面(“ 与我联系 ”页面)上创建了一个表单。但是,它将以下行添加到网站上的每个页面/帖子:

<link rel='stylesheet' id='contact-form-7-css'  href='http://www.r-statistics.com/wp-content/plugins/contact-form-7/styles.css?ver=2.3.1' type='text/css' media='all' /> 

<script type='text/javascript' src='http://www.r-statistics.com/wp-content/plugins/contact-form-7/scripts.js?ver=2.3.1'></script> 

这使我怀疑该插件是否会损害我的网站的加载时间,因为该扩展名仅使我对网站的一个页面感兴趣。

因此,我的问题是如何从“联系我”页面之外的所有页面中删除这些多余的行,而又不停用插件?

Answers:


9

样式和脚本始终由函数wp_enqueue_script()和设置,而函数和wp_enqueue_style()必须绑定到特定的动作挂钩才能起作用。我花了偷看联系表7中,它看起来像它使用的动作标签wpcf7_enqueue_scripts,并wpcf7_enqueue_styles把它们添加到wp_print_scriptswp_print_styles钩。

所以,你需要做的是取消勾从每一个页面的脚本和样式,但您的联系页面。该wp_head操作在脚本和样式操作之前触发,因此您需要在主题的functions.php文件中添加以下内容:

function remove_wpcf7_extras() {
    remove_action('wp_print_scripts', 'wpcf7_enqueue_scripts');
    remove_action('wp_print_styles', 'wpcf7_enqueue_styles');
}

if( ! is_page('contact me') ) {
    add_action('wp_head', 'remove_wpcf7_extras');
}

当您在联系页面上时(假设名称为“与我联系”),is_page()函数将返回true。您还可以使用页面slug和页面ID作为过滤器。在所有其他页面上,if()条件语句将向操作添加脚本/样式删除功能,该功能wp_headwp_print_scriptswp_print_styles操作之前触发。

这应该从页面上删除多余的代码,并且您不必停用插件或编辑任何核心文件。如果您以后删除联系表格7,我上面列出的功能和代码也不会导致您的主题中断,因此也不必担心将来的升级兼容性。


您好,EAMann。很好的解决方案-谢谢!您是否认为可以将这种方法封装到一个插件中,以检查使用了哪些挂钩,然后允许某人根据页面位置停用它们?
塔尔·加利利

不幸的是,WordPress中动态使用了很多钩子。因此,您无法可靠地检测到正在使用哪些钩子……但是您可能会以这种方式捕获大多数钩子。
EAMann

凉。你只是给了我一个想法一个新的问题: wordpress.stackexchange.com/questions/698/...
塔尔加利利

请注意,您也给了我开始开发此插件的想法:-)
EAMann 2010年

3
@EAMann和@Tal Galili-实际上,您可以捕获所有钩子,甚至可以使用钩子捕获动态all钩子,请参见wordpress.stackexchange.com/questions/307
MikeSchinkel,2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.