Altbilgide çekirdek jQuery sıkın?


22

Dosyamda bu var functions.phpve jQuery altbilgiye yüklenemedi. includesGerçi altbilgi cezası dosya yükler. Başka ne yapmam gerekiyor?

function starter_scripts() {
    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );

    wp_enqueue_script( 'jquery', '', '', '', true );

    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Eğer performans nedenleriyle bu yapıyorsanız, eklemekte düşünebiliriz defer: yerine komut etiketlerine matthewhorne.me/defer-async-wordpress-scripts
diachedelic

WP dev burada, bununla başa çıkmak için bir eklenti yaptım: wordpress.org/plugins/jquery-manager
Remzi Cavdar

Yanıtlar:


23

Bunu yapmak için önce jQuery betiğinizi tekrar kaydettirmeniz ve ardından tekrar kayıt olmanız gerekir. Eğer jQuery kullanıyorsanız, WordPress ile birlikte gelir, ardından aradığınız fonksiyon aşağıdadır.

function starter_scripts() {
    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', includes_url( '/js/jquery/jquery.js' ), false, NULL, true );
    wp_enqueue_script( 'jquery' );

    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Google CDN’nin barındırdığı jQuery sürümünü kullanıyorsanız, bu kodu Google CDN URL’si için değiştireceğimi bildirin.


5
Ne demek istiyorsun? Çözüm, jQuery'yi altbilgiye taşımakla ilgili.
Robert hue

2
Ayrıca, arka uç jQuery'de değişiklik yapmaktan kaçınmak için is_admin () 'i de kontrol etmeniz gerekebilir, sonuçta sitelerin ön yüzünü gerçekten optimize etmemiz gerekebilir :)
Tim Malone

1
@TimMalone - aslında, yapmazsınız - wp_enqueue_scriptssadece ön uçta admin_enqueue_scriptskullanılırken arka uç için kullanılır
dev_masta

1
Bence bu çözüm aslında korkunç. Bununla birlikte sürüm etiketleri kaldırılıyor mu. Bu başlangıç ​​tarzı nedir ve bu da include.min.js dosyasıdır ve jQuery ile ne alakası vardır.
NextGenThemes

2
@redanimalwar başlangıç ​​stili ve dosyaları doğrudan sorudan içerir.
tehlivi

43

Aşağıda, kayıt silme ve yeniden kaydolma zorunluluğunu ortadan kaldıran başka bir seçenek daha var:

/**
 * Move jQuery to the footer. 
 */
function wpse_173601_enqueue_scripts() {
    wp_scripts()->add_data( 'jquery', 'group', 1 );
    wp_scripts()->add_data( 'jquery-core', 'group', 1 );
    wp_scripts()->add_data( 'jquery-migrate', 'group', 1 );
}
add_action( 'wp_enqueue_scripts', 'wpse_173601_enqueue_scripts' );

Bu çözüm taklit WordPress çekirdek ayarlayarak groupiçin 1bir komut dosyası (ben muhakeme farkında değilim altbilgi veya olmaması gerektiğini eğer WordPress nasıl belirlediğini olduğunu 1açıklamalarda belirtildiği @jgraup biraz keyfi görünmektedir olarak).


1
İlginç. Komut dosyalarını altbilgiye taşımanın wp_register_scriptkullanımları gibi görünüyor add_data( $handle, 'group', 1 ). core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/… - Bunun nedenini genişletebilir misiniz? Kodunuza göz atarak, 'grup' biraz keyfi görünüyor. Fakat core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/… adresinde WP_Scripts-> 'da nasıl kullanıldığını görebiliyorum do_item. Her iki durumda da, bu en az yıkıcı cevap gibi görünüyor.
jgraup

2
Umarım birileri bu üç beğenilmiş cevap hakkında daha fazla yorum yapabilir. Hepsi farklıdır ve bir miktar WP bilgisi gerektirir. Google bu komut dosyalarının ekranın altında olmasını gerektirdiğinden, bu önemli bir konudur.
Salsalman

2
En iyi cevap! Not : WordPress 4.2.0’dan bu yana çalışır ve onu 'wp_enqueue_scripts' geri çağırma işlevinde function.php işlevinde kullanır
realmag777

Merhaba Yukarıdaki yaklaşımı denedim, ancak işe yaramadı. Biri yardım edebilir mi?
iSaumya,

1
Bu çok iyi! Çok teşekkür ederim. Ancak, kayda değer olarak @tehlivi devletlerinin olduğu gibi - WP jQuery'nin eski bir versiyonunu kullanıyor - daha yeni bir versiyonun kaydını kaldırmayı ve kayıt olmayı düşünün.
18'de

18

Daha iyi bir çözüm:

add_action( 'wp_default_scripts', 'move_jquery_into_footer' );

function move_jquery_into_footer( $wp_scripts ) {

    if( is_admin() ) {
        return;
    }

    $wp_scripts->add_data( 'jquery', 'group', 1 );
    $wp_scripts->add_data( 'jquery-core', 'group', 1 );
    $wp_scripts->add_data( 'jquery-migrate', 'group', 1 );
}

Neden daha iyi kabul edildi cevap IMO

  1. Başka bir şeyle uğraşabileceği daha sonraki bir aşamada değil, özünde değiştirir.
  2. Sürüm dizesi yerinde kaldı ve kaldırılmadı!
  3. Bir betiğin kaydını kaldırır ve yeniden kaydettirmez, ancak yalnızca betiğin kayıtlı olacağıyla aynı olan grup değerini ayarlar $footer = true.

Bunu yöneticiye yapmamak hakkında

Eklentiler wp_head'e satır içi jquery eklerse, jquery bu noktada yüklenmediğinde başarısız olur, bu yüzden sitenizi düzenleyen milyonlarca kişiyi düzenleyene ve performansı optimize etmeye çalışıncaya kadar bundan kaçmanızı öneririm. Bu, ön uç için de geçerlidir, bu nedenle satır içi jQuery kodunu kullanarak kötü kodlanmış temalara veya kafada jquery varsayan eklentilere dikkat etmelisiniz. WP ve eklentiler deposunda jquery ile diğer komut dosyalarını yönetici kafasına kaydediyor, bu yüzden yine de işe yaramayacağını düşünüyorum.

Bu konuda çalışmıyor

Başka bir betiğin, bağımlılıklarında jQuery olan kafasına yüklenmiş olması durumunda, jQuery'nin başından hemen önce kafasına yükleneceğini de bilmeniz gerekir. Ve bu iyi ve beklenen, wp_enqueue sisteminin var olmasının nedeni. Bu, birisinin kafaya atılması nedenini gerektirecek birkaç eklenti kullanırsanız yakında öğreneceğiniz anlamına gelir. Ne yazık ki, sıkıştırılmış komut dosyaları için varsayılan.

Radikal Çözüm

Sanırım jquery'yi varsayan tüm satır içi JS'leri frenleyeceğini ama bunun nadir olması gerektiğini düşünüyorum. Bu , nasıl yazıldığına bakılmaksızın tüm komut dosyalarını altbilgiye zorlar .

add_action( 'wp_enqueue_scripts', 'js_to_footer' );

function js_to_footer() {
  remove_action( 'wp_head', 'wp_print_scripts' );
  remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
  remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
}

2
Bu soruya cevap verebilir ve çiğnemek için bazı iyi noktalara sahip olsa da, cevapta çok fazla gürültü (kabarıklık var) var ve küçük kod iyileştirmelerinde daha önce yayınlanan cevaplara çok benziyor. Düzenlenmiş ve daha bilgilendirici bir sürümde inceltilmişse daha iyi karşılanabilir. Ayrıca belirli kullanıcıları veya cevapları çağırmaya da gerek yoktur (gelecekte ne nedenle olursa olsun olmayabilirler).
Howdy_McGee

Tamamen belirtilmemiş ve muhtemelen daha iyi, "küçük kod geliştirmeleri" başlıklı diğer cevaplarda belirtilenlerden daha iyi diyorsunuz. Peki bu sadece yanlış. Ayrıca kimseyi "söylemedim", kodlama stilini geliştirmeyi ve okuyucuları daha iyi kod yazmaları için eğitmeyi bildiğim gerçeklerden bahsettim. Cidden en iyi cevabı buraya kadar yazmak için biraz zaman harcadım ve bunun için aldım.
NextGenThemes 21:16

4
Diğer cevaplar, jQuery'i başa zorlayan başka senaryolar hakkında hiçbir şeyden bahsetmiyor, aslında cevabım karışıklığı neden işe yaramadığını bilmeyen insanlardan uzaklaştırıyor. Diğer cevapların hiçbiri potansiyel risklerden bahsetmiyor ...
NextGenThemes

Bu kod (yukarıdaki cevabın kodu olarak) bana 500 hatası verdi. WordPress 4.9.9
Marco Panichi,

Bu kodun 500'e neden olduğuna inanmak zor, muhtemelen kodunuzda bunu uygulamakta bir hata yaptınız. Bu gerçekten sormak için doğru bir yer değil ve eski WP sürümünüz yeterli bilgi değil.
NextGenThemes

2

Bu özel problem için bir eklenti geliştirdim. Bu eklenti WordPress jQuery ile karışmaz, çünkü sadece ön tarafa yüklenir. Bakınız: WordPress için jQuery Yöneticisi

Neden başka bir jQuery Güncelleyici / Yönetici / Geliştirici / Hata Ayıklama aracı?

Çünkü geliştirici araçlarından hiçbiri, belirli bir jQuery ve / veya jQuery Migrate sürümünü seçmenize izin vermez. Hem sıkıştırılmış küçültülmüş / üretim hem de sıkıştırılmamış / geliştirme sürümünün sağlanması. Aşağıdaki özelliklere bakın!

✅ Yalnızca ön uçta yürütülür, WordPress admin / backend ve WP customizer ile etkileşime girmez (uyumluluk nedeniyle) Bkz. Https://core.trac.wordpress.org/ticket/45130 ve https: // core. trac.wordpress.org/ticket/37110

J jQuery ve / veya jQuery Migrate'ı açın / kapatın

J jQuery ve / veya jQuery Migrate'ın belirli bir sürümünü etkinleştirin

Ve daha fazlası! Kod açık kaynaktır, bu yüzden çalışabilir, ondan öğrenebilir ve katkıda bulunabilirsiniz.


Neredeyse herkes yanlış tanıtıcı kullanıyor

WordPress aslında jquery'yi değil, jquery-core tanıtıcısını kullanır:

https://github.com/WordPress/WordPress/blob/f84ab5e19f0038a3abec71821c9b8f47a4272942/wp-includes/script-loader.php#L1017

// jQuery
$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4-wp' );
$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4-wp' );
$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );

Jquery kolu yük sadece bir takma addır jquery-çekirdekli ile jquery-göç

takma adları hakkında daha fazla bilgiyi bakınız: wp_register_script birden fazla tanımlayıcı?

Bunu yapmanın doğru yolu

Aşağıdaki örnekte https://code.jquery.com adresindeki resmi jQuery CDN’ini kullanıyorum. Ayrıca bazı CDN niteliklerini ekleyebilmek için script_loader_tag dosyasını kullanıyorum .
Aşağıdaki kodu kullanabilirsiniz:

// Front-end not excuted in the wp admin and the wp customizer (for compatibility reasons)
// See: https://core.trac.wordpress.org/ticket/45130 and https://core.trac.wordpress.org/ticket/37110
function wp_jquery_manager_plugin_front_end_scripts() {
    $wp_admin = is_admin();
    $wp_customizer = is_customize_preview();

    // jQuery
    if ( $wp_admin || $wp_customizer ) {
        // echo 'We are in the WP Admin or in the WP Customizer';
        return;
    }
    else {
        // Deregister WP core jQuery, see https://github.com/Remzi1993/wp-jquery-manager/issues/2 and https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226
        wp_deregister_script( 'jquery' ); // the jquery handle is just an alias to load jquery-core with jquery-migrate
        // Deregister WP jQuery
        wp_deregister_script( 'jquery-core' );
        // Deregister WP jQuery Migrate
        wp_deregister_script( 'jquery-migrate' );

        // Register jQuery in the head
        wp_register_script( 'jquery-core', 'https://code.jquery.com/jquery-3.3.1.min.js', array(), null, false );

        /**
         * Register jquery using jquery-core as a dependency, so other scripts could use the jquery handle
         * see /wordpress/283828/wp-register-script-multiple-identifiers
         * We first register the script and afther that we enqueue it, see why:
         * /wordpress/82490/when-should-i-use-wp-register-script-with-wp-enqueue-script-vs-just-wp-enque
         * /programming/39653993/what-is-diffrence-between-wp-enqueue-script-and-wp-register-script
         */
        wp_register_script( 'jquery', false, array( 'jquery-core' ), null, false );
        wp_enqueue_script( 'jquery' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_jquery_manager_plugin_front_end_scripts' );


function add_jquery_attributes( $tag, $handle ) {
    if ( 'jquery-core' === $handle ) {
        return str_replace( "type='text/javascript'", "type='text/javascript' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_jquery_attributes', 10, 2 );

0
add_action("wp_enqueue_scripts", "myscripts");

function myscripts() { 
   wp_enqueue_script( 'jquery' , '', array(), true); //true for footer
   wp_enqueue_script( 'someScript-js', 'https://domain.com/someScript.js' , '', '', true );
}

-3

Hey, kodunu sadece bunun gibi bir şekilde değiştir

function starter_scripts() {
        wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
        wp_enqueue_script('jquery');
        wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', array( 'jquery' ) );
    }
    add_action( 'wp_enqueue_scripts', 'starter_scripts' );

bence iyi çalışıyor

Bu satırları functions.php dosyasına ekleyin.

remove_action('wp_head', 'wp_enqueue_scripts', 1);
add_action('wp_footer', 'wp_enqueue_scripts', 5);

sonra altbilgiye komut dosyası ekler


Bu, jQuery'i kafanın içine sokuyor. Altbilgiye ihtiyacım var.
Desi

Hey Desi lütfen düzenlenmiş cevabı kontrol edin Size yardımcı olacağını düşünüyorum
Amit Mishra

6
Bunun berbat bir fikir olduğundan eminim - herhangi bir şeyin yalnızca jQuery yerine komut dizileri yüklemesini etkili bir şekilde engellediniz ve çift-kodlu komut dosyaları (çok derin bakmadım) olabilir. Aslında, muhtemelen bu şekilde yapacaksanız remove_action/ add_actionkısmına ihtiyacınız olacaktır.
drzaus

1
Gerçekten de korkunç bir fikir, bunu yapma!
NextGenThemes 26:16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.