問題描述
在我的主題的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。