Dalam functions.php tema saya, saya memanggil add_action untuk mendapatkan kontrol di mana jquery dimuat (di footer bersama dengan skrip tema saya yang lain).
Masalah yang saya alami adalah ketika saya menggunakan add_action ('wp_enqueue_scripts'), itu hanya akan muncul jika tidak ada plugin yang dimuat. Namun, metode add_action ('init') berfungsi di semua kasus.
Saya tidak dapat mengingat alasannya, tetapi saya percaya bahwa add_action ('wp_enqueue_scripts') lebih disukai dalam kasus ini. Jika itu benar, bagaimana saya bisa membuatnya berfungsi dalam semua kasus?
Dalam functions.php
//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');
}
Di functions_public.php
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');
}
Metode ke-2, menggunakan add_action ('wp_enqueue_scripts') tampaknya tidak dieksekusi dalam kondisi di mana plugin hadir yang menuliskan dependensi skrip pada tema.
sumber
Jawaban:
Banyak pengembang plugin tidak melakukan hal-hal dengan cara yang benar. Cara yang benar adalah terhubung agar
wp_enqueue_scripts
menyukai yang Anda coba lakukan.Namun, inilah urutan kait yang dijalankan dalam permintaan tipikal:
Masalahnya adalah, beberapa pengembang pada awalnya diminta untuk menggunakan
init
enqueue skrip mereka. Kembali sebelum kita memiliki sebuahwp_enqueue_script
kait, itu adalah cara yang "benar" untuk melakukan sesuatu, dan tutorial yang melanggengkan praktik tersebut masih beredar di Internet merusak pengembang yang baik.Rekomendasi saya adalah membagi fungsi Anda menjadi dua bagian. Lakukan
wp_deregister_script
/wp_register_script
padainit
hook Anda dan gunakanwp_enqueue_scripts
hook saat Anda benar-benar meminta jQuery.Ini akan membuat Anda tetap berada di dunia "melakukannya dengan benar" untuk enqueue skrip Anda, dan akan membantu melindungi Anda dari ratusan pengembang yang masih "salah melakukannya" dengan menukar jQuery untuk versi gabungan Anda sebelum mereka menambahkannya ke antrian .
Anda juga ingin menambahkan
init
kait Anda dengan prioritas tinggi:sumber
priority
menambahkan tindakan. Itu semua tergantung pada bagaimana Anda melihat prioritas. Jika Anda ingin milik Anda menjalankan "pertama", maka angka yang lebih rendah lebih baik - prioritas yang lebih tinggi dalam urutan antrian eksekusi. Tetapi jika Anda ingin efek fungsi Anda diutamakan daripada yang lain, Anda akan ingin menjalankannya nanti - jadi prioritas yang lebih tinggi dengan "efek". Dan dalam hal ini, itu mungkin angka yang lebih tinggi yang Anda inginkan. Meskipun ada sedikit manfaat dalam menukar versi RTM jquery, seperti yang disarankan komentator sebelumnya.Ada beberapa masalah di sini, yang saling terkait.
wp_enqueue_scripts
wp_enqueue_script()
, atur$footer
parameter ketrue
add_action( $hook, $callback )
Panggilan Anda tidak boleh dibungkus dengan apa pun; biarkan mereka mengeksekusi langsung darifunctions.php
is_admin()
cek bersyarat Anda ke dalam panggilan balik Andawp_enqueue_scripts
sudah terlambat . Bagi deregister / kode register Anda menjadi callback yang dikaitkaninit
.get_template_directory()
daripadaTEMPLATEPATH
Menyatukan semuanya:
Tetapi sekali lagi: ini benar-benar bukan pendekatan terbaik. Taruhan Anda yang lebih baik adalah dengan hanya menghapus add_action () callback plugin yang membatalkan inti jQuery - atau menggunakan Plugins yang tidak melakukan sesuatu yang begitu ceroboh seperti mengganti jQuery yang dibundel dengan inti.
sumber
_doing_it_wrong()
untuk memanggil sesuatu yang bukan hanya jQuery "jQuery". Juga: jQuery sendiri dapat dengan mudah dikosongkan untuk memastikan tidak dimuat dua kali. Thewp_dequeue_script()
panggilan hanya perlu terjadi dengan prioritas yang cukup untuk memastikan bahwa tidak ada enqueues sesudahnya.