WordPress脚本加载/卸载--wp_deregister_script(‘jQuery’)

时间:2014-07-03 作者:zipzit

我有几个关于WordPress加载/卸载javascript工具的问题。在阅读了彼得·古森(PieterGoosen)对一个问题的漂亮书面回复后,我开始了一些研究,并清理了我用来加载库的代码。此代码来自my child主题的函数。php文件。我的网站上有一些使用datepicker日历工具的功能。此外,我确信还有一些插件使用jQuery。

function jquery_loadup() {
        //wp_deregister_script(\'jquery\');    <--- ?H
        wp_enqueue_script(\'jquery\');
        //wp_enqueue_script(\'jquery-migrate\');
        wp_enqueue_script(\'jquery-ui-core\');
        wp_enqueue_script(\'jquery-ui-datepicker\');
        wp_enqueue_style(\'jquery-style\', \'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css\');
}
add_action(\'wp_enqueue_scripts\',\'jquery_loadup\');
我的印象是wp_deregister_script(\'jquery\') 本质上重置/清除jquery脚本之前的所有“请求”,以便它们不会相互干扰。该行后跟wp_enqueue_script(\'jquery\'); 是否应该通过WordPress常用脚本注册句柄/脚本路径系统将jQuery的干净负载降至最低?我认为注销调用会测试jquery是否存在以前的“安装”,如果找到一个或多个,则停止加载,如果没有注册,则什么也不做。

我看到的是当我使用wp_deregister_script(\'jquery\') 我在网页上出错了"ReferenceError: jQuery is not defined". 发生这种情况时,我的所有JavaScript函数都会失败。搞什么鬼?当被评论出来时,该网站功能良好。

问题:我遗漏了什么吗?我对注销电话有什么不理解?为什么会收到错误消息?

注意,此处的行用于jquery-migrate 应该是用于使用jQuery旧版本的软件。我对它进行了测试,但我看不出它在我的网站上有什么作用,所以我把它拿出来以改进下载和响应时间。问:这是个坏主意吗?

参考文献:

2 个回复
最合适的回答,由SO网友:Hendrik Luehrsen 整理而成

Wordpress基本上有两组方法来处理脚本,这两种方法都应该使用:

  • wp_register_script 在Wordpress中注册脚本。它不会被调用,只要Wordpress需要,它就可以使用
  • wp_deregister_script 正好相反。它删除了wp\\U register\\u脚本中的定义,该脚本不再作为依赖项或用于排队
注册的脚本不会输出任何代码。它们只是以编程方式定义脚本,以便WP可以对依赖项和排队作出反应。

  • wp_enqueue_script 实际上定义了一个脚本并将其排队,以便在HTML页面的页眉/页脚中输出
  • wp_dequeue_script执行完全相反的操作,并将用于输出的脚本出列
实际打印发生在动作“wp\\u head”或“wp\\u footer”上,具体取决于寄存器的详细信息。

例如:

wp_deregister_script(\'jquery\');
wp_register_script(\'jquery\', ("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"), false, \'1.9.1\', true);

wp_enqueue_script( \'script-1\', get_template_directory_uri() . \'/js/example1.js\', array(\'jquery\'), \'1.0.0\', false );
wp_enqueue_script( \'script-2\', get_template_directory_uri() . \'/js/example2.js\', array(\'jquery\'), \'1.0.0\', true );
wp_enqueue_script( \'script-3\', get_template_directory_uri() . \'/js/example3.js\', array(\'jquery\'), \'1.0.0\', true );
wp_enqueue_script( \'script-4\', get_template_directory_uri() . \'/js/example4.js\', array(\'jquery\'), \'1.0.0\', true );
wp_enqueue_script( \'script-5\', get_template_directory_uri() . \'/js/example5.js\', array(\'jquery\'), \'1.0.0\', true );
在本例中,我注销了jQuery。它不再可用,如果我不再注册它,我将得到与您相同的错误。(这次来自Google CDN,希望它能加速我的页面。)

但在第三行,jQuery将不会被打印出来。它不会出现在任何地方。但从第四行开始,我调用了一组脚本,它们都以jquery作为依赖项。第一个位于页眉,其他所有位于页脚。由于依赖关系,jQuery会自动在标头中排队,因为首先需要它。

因此,Wordpress的脚本系统非常可靠,无需处理干扰或之前的请求。注册的脚本只在需要时调用一次,并且仅在需要时调用。

在您的示例中,取消注册函数第1行中的脚本,并在第2行再次调用它。但由于注销,Wordpress忘记了URL、版本、依赖项等所有细节。逻辑中正确的功能应该是wp_dequeue_script, 但即使这样也不需要。Wordpress通过查看排队脚本或依赖项来评估需求。

编辑:

wordpress如何知道如何阻止8个不同插件都试图添加不同版本的jquery所留下的混乱?

wp_print_scripts 行动是印刷出来的。这就是行动/筛选中的优先级系统的基本用途。

SO网友:Pieter Goosen

我只是想插一句话,首先,谢谢你的补充,非常感谢。

您正在使用子主题,其中父主题should have 将内置在wordpress中的jquery库排队。正如我在你提到的帖子中所说的,我强调,默认情况下,任何父主题都不将jquery排队是一种不好的做法。

您的代码有几个问题。首先,永远不要取消注册默认jquery库,稍后会出现一些问题。正确的方法是使用wp_dequeue_scripts.

这里只有一个问题,为什么需要将jquery出列并重新对其进行排队。插件作者通常使用这一点只是为了确保jquery不会加载两次,原因是,插件适用于所有主题,因此不可能知道用户与插件一起使用的主题是否加载了jquery。您正在运行一个子主题,该子主题只适用于特定的父主题,因此您将知道父主题是否加载了jquery。因此,无需排队和重新排队。

其次,你必须考虑优先权。add_action 有4个参数,第三个是优先级($priority). 通常插件和子主题会在父主题之后加载脚本,以确保稍后不会溢出。因此,明智且良好的做法是将行动排在最后。为此,您需要一个非常低的优先级(非常高的数字)。

  add_action( \'wp_enqueue_scripts\', \'jquery_loadup\', 999 );

结束

相关推荐

JQuery自动完成:在选择术语名称时检索术语块

我正在尝试设置一个定制的searchform,允许访问者搜索链接到几个分类法术语的帖子。自动完成部分似乎工作正常,但我不知道如何获取术语slug,以便在访问者选择术语名称后构建查询字符串。以下是HTML: <fieldset> <div class=\"\"> <label for=\"collection\">Collections : </label> <input i