問題描述
在我的主題的 functions.php 中,我正在呼叫一個 add_action,以便獲得 jquery 載入的位置的控制 (在頁尾中以及我的主題的其他指令碼) 。
我遇到的問題是,當我使用 add_action(‘wp_enqueue_scripts’) 時,如果沒有載入外掛,它只會觸發。然而,add_action(‘init’) 方法在所有情況下都有效。
我不記得為什麼,但我相信 add_action(‘wp_enqueue_scripts’) 在這種情況下是首選。如果是這樣,在所有情況下如何才能使其工作?
In 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');
}
In 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');
}
使用 add_action(‘wp_enqueue_scripts’) 的第二種方法顯然不會在存在寫入與主題相關的指令碼的外掛的情況下執行。
最佳解決方案
很多外掛開發人員不會做正確的事情。正確的方法是掛鉤到 wp_enqueue_scripts,就像你想要做的那樣。
但是,以下是在典型請求中執行的鉤子的順序:
-
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
-
在裡面
-
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
-
… 多很多
事情是,幾個開發人員最初被告知要掛接到 init 的 enqueue-ing 他們的指令碼。在我們有一個 wp_enqueue_script 鉤子之前,那就是”correct” 的做法,而這些練習的教學工作依然浮在網際網路上,破壞了其他好的開發者。
我的建議是把你的功能分成兩部分。在 init 鉤子上執行 wp_deregister_script /wp_register_script,並在實際插入 jQuery 時使用 wp_enqueue_scripts 鉤子。
這將使您進入 enqueue-ing 您的指令碼的 「正確」 的世界,並將幫助您保護您免受數百名開發人員在將其新增到佇列之前,將 jQuery 交換為並置版本,「做錯了」 。
您還需要新增高優先順序的 init 鉤子:
add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
// ...
}
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。