问题描述
在我的主题的 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。