geo
  • 0
Новичок

Как заменить обычные вызовы jquery вызовами CDN от Google?

  • 0

Я хотел бы реализовать несколько функций стандартного шаблона в одном из моих экземпляров WordPress.

Я пытаюсь понять, как обменять обычные вызовы jquery ниже

<script type='text/javascript' src='http:/.../wp-includes/js/jquery/jquery.js?ver=1.4.4'></script>
<script type='text/javascript' src='http://.../wp-includes/js/jquery/ui.core.js?ver=1.8.9'></script>

к этому:

<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script>
<script>window.jQuery || document.write("<script src='js/libs/jquery-1.5.1.min.js'>\x3C/script>")</script>
Share
  1. Вы должны загружать jQuery с помощью wp_enqueue_script('jquery') — таким образом, вы не получите несколько экземпляров, если плагины тоже попытаются загрузить его.

    Чтобы использовать Google CDN, поместите это в свой functions.php ;

    wp_deregister_script( 'jquery' );
    wp_register_script(
        'jquery',
        'https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js', 
        null, // Dependencies - none
        null  // Version - use null to prevent WP adding version argument "?ver" in URL
    );
    

    Обновление: лично я знаю, что это звучит как отговорка, но я бы не стал проверять CDN. Google чертовски надежен, и более чем вероятно, что он уже находится в кеше браузера пользователя (многие сайты используют CDN Google).

    Однако я обязан ответить, что у вас есть один из двух вариантов;

    1. Проверьте серверную часть с помощью удаленного получения и, если это не удастся, обслуживайте локальную копию (дорого и не рекомендуется).
    2. Запустите скрипт на стороне клиента, который проверяет наличие jQuery и при необходимости печатает запасной вариант.

    Проблема с 2) заключается в том, что вам нужно внедрить этот скрипт сразу после jQuery и до того, как любые другие плагины, которые зависят от него, запускают свои скрипты. Я знаю, что единственный способ сделать это — «прослушать» jQuery, а затем вывести JavaScript при следующем вызове.

    Магия? Бросьте это в свой functions.php ;

    /**
     * Print fallback script right after jQuery is printed from queue.
     *
     * @param   string $src
     * @return  string
     */
    function wpse_12448_fallback_jquery( $src, $handle = null ) {
        static $run_next = false;
    
        if ( $run_next ) {
            // Defaults to WP bundled jQuery, but you should use your own that
            // matches the version loaded via CDN.
            $local = includes_url( 'js/jquery/jquery.js' );
    
            echo <<<JS
    <script>window.jQuery || document.write( '<script src="$local"></script>' );</script>
    
    JS;
            $run_next = false;
        }
    
        if ( $handle === 'jquery' )
            $run_next = true;
    
        return $src;
    }
    
    add_action( 'wp_head', 'wpse_12448_fallback_jquery', 2 );
    if ( ! is_admin() )
        add_filter( 'script_loader_src', 'wpse_12448_fallback_jquery', 10, 2 );
    

    Для тех, кто в курсе, это также подключается wp_head сразу после wp_print_scripts запуска, на случай, если больше не будет сценариев для печати после jquery (функция работает при следующем вызове, а не при вызове экземпляра с помощью jQuery).

    • 0
    • только что заметил, что этот приятный маленький хак был добавлен в тему WordPress Roots — мило github.com/retlehs/roots/blob/master/lib/scripts.php

      • 0
    • Этот ответ ДЕЙСТВИТЕЛЬНО плохой. Он жестко кодирует версию jQuery, поэтому он никогда не будет обновляться при обновлении WordPress. Например, текущая версия 1.12.4, это хардкоды 1.11.3. Кроме того, удалив jQuery из управления зависимостями WordPress, другие плагины не смогут его контролировать.

      • 0
    • @JPollock Действительные точки, но вопрос заключался в том, как использовать jQuery из CDN с запасным вариантом, и поэтому я ответил. ИМО, это бывает по-разному — если вы создаете тему для выпуска, то да, это может представлять опасность. Но если вы создаете на заказ для себя/клиентов, то мне нравится идея использования явной версии jQuery в сочетании с преимуществами CDN. Я думаю, что сказать, что этот ответ «ДЕЙСТВИТЕЛЬНО плохой», немного подстрекательски и не касается другой стороны медали (полагаясь на связанный jQuery, JS вашей темы подвергается риску взлома в будущих обновлениях).

      • 0
    • Я думаю, что ответ действительно плохой. чтобы быть более конкретным, это действительно плохо для прямой совместимости с плагинами, которые ожидают, что версия jQuery будет версией, которую объединяет ядро ​​​​WordPress. Даже на клиентских сайтах вещи обновляются, часто годы спустя, людьми, не понимающими, в чем может быть разница между версиями jQuery.

      • 0
    • Я создал и поддерживал (в течение многих лет) очень много тем WordPress, используя жестко закодированные CDN jQuery, и у меня никогда не было проблем. Если бы я сделал то же самое в общедоступной теме? Может и не та история. И хотя я согласен с вашей точкой зрения о прямой совместимости, вы, кажется, игнорируете контраргумент, что полагаясь на пакетный пакет, вы по-прежнему подвергаетесь риску. Дело в том, что это зависит, и я не думаю, что вы меня убедите в обратном. Но я ценю обратную связь, как всегда.

      • 0
    • Мне пришлось использовать, 'window.jQuery||document.write("<script src='.esc_url(includes_url('/js/jquery/jquery.js')).'><\/script>");' потому что wordpress переписывал мои цитаты, и я использую ядро ​​в комплекте в качестве запасного варианта.

      • 0
  2. Для WordPress 4.5.0+ : wp_add_inline_script() #

    function jquery_enqueue_with_fallback() {
        wp_deregister_script( 'jquery' );
        wp_register_script( 'jquery' , '//ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js', false, '3.1.1', true );
        wp_add_inline_script( 'jquery', 'window.jQuery||document.write('<script src="'.esc_url(get_template_directory_uri()).'/libs/js/jquery.js"><\/script>')' );
        wp_enqueue_script( 'jquery' );
    }
    add_action( 'wp_enqueue_scripts' , 'jquery_enqueue_with_fallback' );
    

    Примечание. Измените версию и собственный локальный источник jQuery.

    • 0
  3. Две вещи, которые следует помнить об этом ответе:

    • Никогда не делайте этого в плагине или теме для выпуска.
    • Плагины WordPress полагаются на предоставленную правильную версию jQuery, поэтому я не использую jQuery 3 и не жестко кодирую номера версий. Вместо этого я позволяю WordPress устанавливать номер версии для версии, загруженной из CDN.

    «`

    add_action( 'init', function(){
        //Only act if in admin
        if (  ! is_admin()) {
            //set protocol dynamically
            if( is_ssl() ){
                $protocol = 'https';
            }else {
                $protocol = 'http';
            }
    
            /** @var WP_Scripts $wp_scripts */
            global  $wp_scripts;
            /** @var _WP_Dependency $core */
            $core = $wp_scripts->registered[ 'jquery-core' ];
            $core_version = $core->ver;
            $core->src = "$protocol://ajax.googleapis.com/ajax/libs/jquery/$core_version/jquery.min.js";
    
            ///Use jQuery migrate if WP_DEBUG
            if ( WP_DEBUG ) {
                /** @var _WP_Dependency $migrate */
                $migrate         = $wp_scripts->registered[ 'jquery-migrate' ];
                $migrate_version = $migrate->ver;
                $migrate->src    = "$protocol://cdn.jsdelivr.net/jquery.migrate/$migrate_version/jquery-migrate.min.js";
            }else{
                /** @var _WP_Dependency $jquery */
                $jquery = $wp_scripts->registered[ 'jquery' ];
                $jquery->deps = [ 'jquery-core' ];
            }
    
        }
    
    
    }, 11 );
    

    «`

    Обратите внимание, что я все еще использую систему управления зависимостями WordPress. Кроме того, устанавливает использование HTTPS и HTTP is_ssl(), чтобы избежать ошибок смешанного содержимого, и позволяет WordPress диктовать номер версии.

    • 0

Оставить ответ

You must login to add an answer.