如何正确包含jQuery和JavaScript文件?


16

我现在用以下代码来做:

function uw_load_scripts() {
    // De-register the built in jQuery
    wp_deregister_script('jquery');
    // Register the CDN version
    wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', array(), null, false); 
    // Load it in your theme
    wp_enqueue_script( 'jquery' );
}
add_action( 'wp_enqueue_scripts', 'uw_load_scripts' );

这可行,但是我应该对所有人(像这样)或除admin之外的每个人执行此操作(以便后端使用WordPress版本?):

if (function_exists('load_my_scripts')) {  
function load_my_scripts() {  
    if (!is_admin()) {  
    wp_deregister_script( 'jquery' );  
    wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', array(), null, false); 
    wp_enqueue_script('jquery');   
    }  
}  
}  
add_action('init', 'load_my_scripts');

这个版本实际上根本不起作用,我得到的是WordPress jQuery版本而不是Google的版本。

因此,我应该完全注销WordPress中包含的jQuery吗?

另外,如何正确添加自己的脚本(滑块脚本,modernizr和自己的custom.js)?我想我也应该通过functions.php来做到这一点,而不是像现在那样在标头中做到这一点,但是我不确定我该怎么做。

Answers:


20

首要经验:除非绝对确定不会因版本更改而破坏主题,插件或核心本身,否则请不要注销核心捆绑的脚本并替换为其他版本。确实,除非绝对需要核心捆绑脚本的替代版本,否则请使用与核心捆绑在一起的脚本。

其次,我强烈建议您加入wp_enqueue_scripts而不是进行脚本注册和入队init。(它可以在上使用init,但从与其他人一起玩的角度来看,最好使用语义上最正确的钩子。)

第三,要使用自己的自定义脚本,请使用与上述相同的方法:

<?php
function wpse45437_enqueue_scripts() {
    if ( ! is_admin() ) {
        $script_path = get_template_directory_uri() . '/js/';
        // Enqueue slider script
        wp_enqueue_script( 'wpse45437_slider', $script_path . 'slider.js', array( 'jquery' ) );
        // Enqueue modernizr script
        wp_enqueue_script( 'wpse45437_modernizr', $script_path . 'modernizr.js', array( 'jquery' ) );
    }
}
add_action( 'wp_enqueue_scripts', 'wpse45437_enqueue_scripts' );
?>

只需添加需要排队的任何脚本即可。


4
绝对需要 +1 !太多(通常是“高级”)主题注册了jQuery的过时版本。它会破坏插件。
史蒂芬·哈里斯

将此脚本添加到我的函数文件中(因为已经存在PHP声明,所以没有php声明)会给我一个“ Http错误500(内部服务器错误)”。某处有错误吗?
Johan Dahl 2012年

是; wp_enqueue_script()调用中存在语法错误。
Chip Bennett 2012年

现在感谢它的作品!但是,它仍然输出在标题中。如果在页脚中是否更好?如果是这样,我可以修改代码吗?
Johan Dahl 2012年

您当然可以加入页脚。只需$in_footer在调用中将参数设置为true即可wp_enqueue_script()
Chip Bennett 2012年

4

希望这对您有所帮助,请查找法典以wp_enqueue_scripts获取更多信息。

  1. 不要使用init。使用wp_enqueue_scripts了前端的东西,admin_enqueue_scripts对管理方。不过,您可以init用来注册脚本。
  2. 该挂钩wp_enqueue_scripts仅在前端(而不是在登录页面)上触发-因此您无需进行检查is_admin()
  3. 除非你有特别的理由不这样做,我会建议注册和使用的脚本排队functions.php主题或插件,否则。您只需输入:

     function myprefix_load_scripts() {
       // Load scripts here
     }
     add_action( 'wp_enqueue_scripts', 'myprefix_load_scripts' );
  4. 如果目的是在使用简码时使脚本入队,则您可能希望wp_enqueue_script在简码回调中使用它以仅在需要时将其排队(这将从3.3开始在页脚中打印出来)。

  5. 您不应该在管理员端重新注册现有的jQuery。您可能会破坏某些东西:D。

  6. 插件不应重新注册现有的jQuery。

  7. 您应该权衡重新注册jQuery的利弊。例如,如果您注册旧版本,它可能会破坏某些插件(也许不是现在,但是将来...)


1
广告5)重新注册并不重要。这就是我们获得入队和注册功能的原因。:)
kaiser 2012年

2

合理的警告:以您自己的名义注销WP的打包版本的jQuery可能会导致问题,尤其是如果您不特别小心以确保在WP更新其版本时更改要指向的版本。这对于插件来说是双重的,插件通常(或者经常应该,至少应该)编写其插件,以最大程度地与WP版本的jQuery兼容。

也就是说,您的第一个版本是正确的-已连接到 wp_enqueue_scripts。您的第二个功能已挂接到init,这可能就是为什么它无法正常工作的原因。

以类似的方式添加自己的脚本:

function bbg_enqueue_scripts() {
    // You should probably do some checking to see what page you're on, so that your
    // script only loads when it needs to
    wp_enqueue_script( 'bbg-scripts', get_stylesheet_directory_url() . '/js/bbg-scripts.js', array( 'jquery' ) );
}
add_action( 'wp_enqueue_scripts', 'bbg_enqueue_scripts' );

我在这里假设您正在从js当前主题目录中的目录中加载脚本;如果不正确,请更改URI参数。第三个参数array( 'jquery' )表示bbg-scripts取决于jquery,因此应在以后加载。有关更多详细信息,请参见https://codex.wordpress.org/Function_Reference/wp_enqueue_script


1
if (function_exists('load_my_scripts')) {  
function load_my_scripts() {  
    if (!is_admin()) {  
    wp_deregister_script( 'jquery' );  
    wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', array(), null, false); 
    wp_enqueue_script('jquery');   
    }  
}  
}  
add_action('init', 'load_my_scripts');

这不会做任何事情...我怀疑你是说

if (!function_exists('load_my_scripts')) {

您的示例将仅加载函数load_my_scripts(如果已经存在)(不存在,因此不会,并且如果存在则会创建错误)。


0

如果出于性能原因要从CDN加载jquery和其他核心js文件,请确保加载相同版本,以防止核心功能和插件功能发生令人讨厌的事情。像这样:

$wp_jquery_version = $GLOBALS['wp_scripts']->registered['jquery-core']->ver;
$jquery_version = ( $wp_jquery_version == '' ) ? '1.8.3' : $wp_jquery_version; // fallback, just in case 
wp_deregister_script('jquery');
wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/'. $jquery_version .'/jquery.min.js', $jquery_version, false );
wp_enqueue_script('jquery');

-2

在检查了用于加载jquery的所有不同方法之后(不仅在本篇文章中),我意识到它们都不可以完成所有这些操作:

  1. 使用function注册(或排队)jquery,以便插件可以使用它。
  2. 使用协议相关网址从Google CDN加载它。
  3. 如果Google离线,则回退到本地副本。

列表中有很多替代版本在执行其中一些操作,但不是全部,因此我编写了合并和修改某些可用方法的版本。这里是:

function nautilus7_enqueue_scripts() {

    // Load jquery from Google CDN (protocol relative) with local fallback when not available
    if ( false === ( $url = get_transient('jquery_url') ) ) {

        // Check if Google CDN is working
        $url = ( is_ssl() ? 'https:' : 'http:' ) . '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
        $resp = wp_remote_head($url);

        // Load local jquery if Google down
        if ( is_wp_error($resp) || 200 != $resp['response']['code'] ) {

            $url = get_template_directory_uri() . '/js/vendor/jquery-1.7.2.min.js';
        }

        // Cache the result for 5 minutes to save bandwidth
        set_transient('jquery_url', $url, 60*5);
    }

    // Deregister Wordpress' jquery and register theme's copy in the footer
    wp_deregister_script('jquery');
    wp_register_script('jquery', $url, array(), null, true);

    // Load other theme scripts here

}
add_action('wp_enqueue_scripts', 'nautilus7_enqueue_scripts');

为了节省带宽并在每次重新加载页面时不对Google进行ping操作,它会使用Wordpress Transient API记住Google CDN是否在线5分钟。


不建议。现在,您必须在每次WordPress更新后更新脚本,以匹配WordPress使用的确切jQuery版本。另外,在某些情况下,Google无法发送压缩的库,因此您的页面加载速度现在变慢。
fuxia

我没有使用wordpress的jquery。请阅读代码。我正在使用主题的版本。如果您不喜欢Google,则可以使用其他CDN。
nautilus7

但这就是重点:您应该使用WordPress jQuery来确保版本正确。
fuxia

我不跟着你。我从Google取得了我需要的任何版本,并将相同的版本与主题捆绑在一起。这就是每个人的做法。WordPress可以使用(在管理部分中)其附带的任何版本。
nautilus7

1
您可以使用所需的任何版本的jQuery,但如果将其与主题捆绑在一起,则会将其强加给用户。从现在开始的几年后,当每个人都使用jQuery 1.8.2时,除非用户保持主题最新,否则您的用户将停留在过时的版本上。
Chris_O
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.