Add_action ('init') ile add_action ('wp_enqueue_scripts') ne zaman kullanılır?


10

Temamın function.php dosyasında, jquery'nin nerede yüklendiğini (temanın diğer komut dosyalarıyla birlikte altbilgide) kontrolünü elde etmek için bir add_action çağırıyorum.

Sahip olduğum sorun, add_action ('wp_enqueue_scripts') kullandığımda, yalnızca eklenti yüklü değilse ateş gibi görünüyor olmasıdır. Ancak, add_action ('init') yöntemi her durumda çalışır.

Neden hatırlamıyorum, ancak bu durumda add_action ('wp_enqueue_scripts') tercih olduğuna inanıyorum. Bu doğruysa, her durumda nasıl çalıştırabilirim?

Function.php içinde

//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT

if(!is_admin())
{
    require_once(TEMPLATEPATH . '/functions_public.php');   
}

Function_public.php içinde

function my_theme_init()
{

/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');

/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);

wp_enqueue_script('jquery');

}

Add_action ('wp_enqueue_scripts') kullanan 2. yöntem, temaya komut dosyası bağımlılıkları yazan bir eklentinin bulunduğu koşullarda yürütülmez.


5
Lütfen kendi jquery kopyanızı kaydetmeyin - WordPress ile gönderilen sürümü kullanın, aksi takdirde eklentileri bozabilirsiniz :)
Stephen Harris

Kabul ediyorum, aslında jQuery ile birlikte gelen bir kullanıyorum. Ben sadece http isteklerini azaltmak için, benim tema ihtiyacı diğer js dosyaları ile birlikte tek bir .js (mythemescripts.js) yüklüyorum.
N2Mystic

Tüm tarayıcılarda, komut dosyası sitenizden bir kez istendiğinde, yerel olarak önbelleğe alınır. Yalnızca ilk sayfa yüklemesinde ekstra HTTP isteğiniz olur. Tüm komut dosyalarını tek bir komut dosyasında birleştirirseniz, WP yeni bir jQuery sürümüyle her güncelleme yayınladığında bunu değiştirmek zorunda kalırsınız. Bu == bakım kabusu.
EAMann

2
@EAMann, tema ilk yüklendiğinde ve daha sonra tema seçenekleri sayfam her kaydedildiğinde, jthery kütüphanesinin en son kopyasını yükleyerek mythemescripts.js'yi yeniden yazıyorum. Kullanıcı WP sürümünü güncellerse, tema seçenekleri rutinim bununla birlikte gelen jquery'yi yükler. Her zaman güncel.
N2Mystic

Altbilgiden önce belgenin gövdesinde bir jquery çağrısı varsa sorun hala oluşur. Görünüşe göre jQuery (belge) .js komut dosyası altbilgiye yüklenmeden önce zaten tetikleniyor.
N2Mystic

Yanıtlar:


26

Birçok eklenti geliştiricisi işleri doğru şekilde yapmıyor. Doğru yolu üzerinde kanca etmektir wp_enqueue_scriptsyapmanız çalışıyorsunuz.

Ancak, kancaların sırası tipik bir istekte çalışır:

  • muplugins_loaded
  • registered_taxonomy
  • registered_post_type
  • plugins_loaded
  • sanitize_comment_cookies
  • setup_theme
  • load_textdomain
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_current_user
  • içinde
  • widgets_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_stypes
  • admin_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • posts_selection
  • wp
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_styles
  • wp_print_scripts
  • ... çok daha fazla

Mesele şu ki, bazı geliştiricilere başlangıçta initsenaryolarını sıraya koymaları için bağlandıkları söylendi . Bir wp_enqueue_scriptkancaya sahip olmadan önce , bu bir şeyler yapmanın "doğru" yoluydu ve uygulamayı devam ettiren öğreticiler hala iyi geliştiricileri bozan internette dolaşıyor.

Benim tavsiyem, fonksiyonunuzu iki parçaya bölmektir. Yapılacaklar wp_deregister_script/ wp_register_scriptüzerindeki initkanca ve kullanımı wp_enqueue_scriptsaslında jQuery enqueue zaman kanca.

Bu, komut dosyalarınızı sıralamak için sizi "doğru yapmak" dünyasında tutacak ve sıralı sürümünüz için sıraya eklemeden önce jQuery'yi değiştirerek yüzlerce geliştiriciden sizi hala "yanlış yapıyor" dan koruyacaktır. .

Ayrıca, initkancalarınızı yüksek önceliğe eklemek istersiniz :

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}

2
Ben bunu tavsiye edecekti, ama sonra OP aslında jQuery kayıtlarını silmek ve sonra tamamen farklı bir komut dosyası kayıt ve "jquery" olarak adlandırdığını fark ettim. Bunun teşvik etmek için iyi bir uygulama olduğunu düşünmüyorum ve daha iyi bir yolun jQuery'yi tamamen aldatmak ve daha sonra özel bir tanıtıcı kullanarak özel komut dosyasını sıralamak olacağını düşünmüyorum .
Chip Bennett

priorityEylem ekleme hakkında not alın . Her şey önceliği nasıl gördüğünüze bağlıdır. Sizinkinin "önce" çalışmasını istiyorsanız, daha düşük bir sayı daha iyidir - yürütme kuyruğu sırasında daha yüksek bir öncelik. Ancak, işlevinizin etkisinin diğerlerine göre daha öncelikli olmasını istiyorsanız, daha sonra çalışmasını istersiniz - böylece "efekt" ile daha yüksek bir öncelik. Ve bu durumda, muhtemelen istediğiniz daha yüksek bir sayıdır. Önceki yorumcunun önerdiği gibi, jquery'nin RTM sürümünü değiştirmenin az bir değeri olsa da.
Paul G.

3

Burada birbiriyle ilişkili birden fazla sorun var.

  1. Komut dosyalarını sıralamak için kullanılacak doğru eylem kancası wp_enqueue_scripts
  2. Altbilgideki komut dosyalarını ile yazdırmak wp_enqueue_script()için $footerparametreyitrue
  3. Kişisel add_action( $hook, $callback )çağrılar şey sarılmış edilmemelidir; doğrudanfunctions.php
  4. is_admin()Koşullu kontrollerinizi geri aramanıza koymalısınız
  5. Herhangi bir nedenden ötürü bir Temanın temel paketli komut dosyalarını silmemelisiniz. Amacınız komut dosyası birleştirme olsa bile, bu Eklenti bölgesi .
  6. Eğer varsa gerekir jQuery sildirebilirsin ardından wp_enqueue_scriptsise çok geç . Kayıt silme / kayıt kodunuzu bağlanmış bir geri aramaya bölün init.
  7. Bazı çağrılması diğer komut dosyası "jquery" muhtemelen de iyi bir uygulama değildir. Daha iyi bir bahis jQuery'yi ayıklamak ve sonra özel betiğinizi yüklemek olacaktır.
  8. Eklentileri geçersiz kılmak için geri aramanıza düşük bir öncelik koyduğunuzdan emin olun.
  9. Kullanmak get_template_directory()yerineTEMPLATEPATH

Hepsini bir araya koy:

<?php
function wpse55924_enqueue_scripts() {
    if ( ! is_admin() ) {

        // Dequeue jQuery
        wp_dequeue_script( 'jquery' );

        // Register/enqueue a custom script, that includes jQuery
        wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
        wp_enqueue_script( 'mythemescripts' ); 
    }
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );

Ama yine de: bu gerçekten en iyi yaklaşım değil. Yapmanız gereken en iyi şey, çekirdek jQuery'nin kaydını silen eklenti add_action () geri çağrılarını kaldırmak veya çekirdekle birlikte verilen jQuery'yi değiştirmek kadar pervasız bir şey yapmayan Eklentileri kullanmaktır.


OP, jQuery'nin WP dağıtılmış sürümünü diğer bazı komut dosyalarıyla programlayarak birleştirir, böylece teması tarafından tüm JS dosyalarını yüklemek için yalnızca bir HTTP isteği yapılır. Bu nedenle özel komut dosyaları jQuery içerir ve bu şekilde yüklenirse hiçbir şeyi bozmaz. JQuery'nin iki kez yüklenmesini önlemek için kayıtlı 'jquery' tanıtıcısının üzerine yazılması gerekir - bir kez birleşik JS dosyasında ve yine jQuery'yi kendi başlarına sıralamaya çalışan herhangi bir eklenti tarafından.
EAMann

Anlamsal ve pratik _doing_it_wrong()olarak sadece jQuery "jQuery" olmayan bir şeyi çağırmaktır . Ayrıca: jQuery , iki kez yüklenmemesini sağlamak için basitçe ayıklanabilir . wp_dequeue_script()Çağrı sadece sonradan hiçbir şeyin enqueues bunu sağlamak için yeterli bir önceliğe sahip olması gereken.
Chip Bennett
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.