我已经添加了脚本,但是我想知道首选的方法。
我只是将<script>
标签直接放在header.php
模板的中。
有插入外部或自定义js文件的首选方法吗?
如何将js文件绑定到单个页面?(我想到了主页)
我已经添加了脚本,但是我想知道首选的方法。
我只是将<script>
标签直接放在header.php
模板的中。
有插入外部或自定义js文件的首选方法吗?
如何将js文件绑定到单个页面?(我想到了主页)
Answers:
wp_enqueue_script()
在您的主题中使用基本的答案是wp_enqueue_script()
在wp_enqueue_scripts
前端的钩子中使用admin_enqueue_scripts
admin。它可能看起来像这样(假设您正在从主题functions.php
文件中调用;请注意我如何引用样式表目录):
<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );
function mysite_enqueue() {
$ss_url = get_stylesheet_directory_uri();
wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js" );
}
这就是基础。
但是,假设您要同时包含WordPress附带的默认脚本列表中的 jQuery和jQuery UI Sortable,并且希望脚本依赖于它们吗?简单,只需使用WordPress中定义的预定义句柄包含前两个脚本,然后为您的脚本提供第三个参数,wp_enqueue_script()
该参数是每个脚本使用的脚本句柄数组,如下所示:
<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );
function mysite_enqueue() {
$ss_url = get_stylesheet_directory_uri();
wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js", array( 'jquery', 'jquery-ui-sortable' ) );
}
如果您想在插件中执行该操作怎么办?使用该plugins_url()
函数指定Javascript文件的URL:
<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue' );
function my_plugin_enqueue() {
wp_enqueue_script( 'my-script', plugins_url('/js/my-script.js',__FILE__), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION );
}
还要注意,在上面我们给了插件一个版本号,并将其作为第4个参数传递给wp_enqueue_script()
。版本号在源中作为脚本的URL中的查询参数在源中输出,并且如果版本更改,则可以强制浏览器重新下载可能缓存的文件。
Web Performance的第一条规则要求最小化HTTP请求,因此,只要有可能,就应限制脚本仅在需要的地方加载。例如,如果您只需要在admin中使用脚本,则使用admin_enqueue_scripts
钩子将其限制为管理页面:
<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );
function my_plugin_admin_enqueue() {
wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION );
}
如果您的脚本是需要加载到页脚中的脚本之一,则该脚本的第5个参数wp_enqueue_script()
告诉WordPress延迟它并将其放置在页脚中(假设您的主题没有行为不当,并且确实像所有主题一样调用了wp_footer钩子)好的WordPress主题应该):
<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );
function my_plugin_admin_enqueue() {
wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION, true );
}
如果您需要更精细的控制,则Ozh会撰写一篇很棒的文章,标题为“ 如何:使用WordPress插件加载Javascript”,其中详细介绍了更多内容。
贾斯汀·塔德洛克(Justin Tadlock)的文章不错,标题是如何在需要的情况下禁用脚本和样式:
wp_localize_script()
Vladimir Prelovac在他的博客上有一篇很棒的文章,名为“ 向WordPress插件添加JavaScript代码的最佳实践”,他在其中讨论了如何使用wp_localize_script()
它来设置服务器端PHP中变量的值,以供以后在客户端Javascript中使用。
wp_print_scripts()
最后,如果您需要真正的细粒度控制,可以wp_print_scripts()
按照Beer Planet上的讨论,标题为“ 如何有条件地包括CSS和JavaScript,并且仅在帖子需要时”中讨论。
关于将最佳实践包含在WordPress中的Javascript文件。如果我错过了某些事情(我可能已经知道了),请务必在评论中告知我,以便为将来的旅行者添加更新。
admin_init
而不是要求is_admin()
。如果您使用的是Google CDN,请删除version参数,否则浏览器缓存将保存两个版本:一个不包含来自其他站点的查询字符串,另一个不包含您的。
为了赞扬Mikes使用排队的奇妙插图,我只想指出,包含在依赖关系中的脚本不需要排队...
我将在Mike的答案的“插件中的脚本”标题下使用该示例。
define('MY_PLUGIN_VERSION','2.0.1');
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui-sortable');
wp_enqueue_script('my-script',plugins_url('/js/my-script.js',__FILE__),array('jquery','jquery-ui-sortable'),MY_PLUGIN_VERSION);
}
可以将其修整以读取。
define('MY_PLUGIN_VERSION','2.0.1');
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
wp_enqueue_script('my-script', plugins_url( '/js/my-script.js', __FILE__ ), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION);
}
当您设置依赖关系时,WordPress会为您的脚本找到并排队它们,因此您无需对这些脚本进行任何独立的调用。
另外,有些人可能想知道设置多个依赖关系是否可能导致脚本以错误的顺序输出,在这里让我举一个例子
wp_enqueue_script( 'first-script', 'example/path/example_script_1.js', array('second-script','third-script') );
如果第二个脚本依赖于第三个脚本(即首先加载第三个脚本),那没关系,WordPress将确定这些脚本的入队优先级并以正确的顺序输出它们,简而言之,所有这些都可以自动解决WordPress为您服务。
init
这不是分发队列的适当位置。
对于小脚本,您可能不想将其包含在单独的文件中,例如,因为它们是动态生成的,因此可以使用WordPress 4.5和其他产品wp_add_inline_script
。此功能基本上将脚本锁定到另一个脚本。
举例来说,假设您正在开发主题,并希望您的客户能够通过选项页面插入自己的脚本(例如Google Analytics(分析)或AddThis)。然后,您可以像这样wp_add_inline_script
将该脚本锁存到您的主js文件(假设mainjs
):
$custom_script = get_option('my-script')
if (!empty($custom_script)) wp_add_inline_script ('mainjs', $custom_script);
我的首选方式是获得良好的性能,因此,与其使用wp_enqueue_script
我将HEREDOC与Fetch API配合使用,不如使用异步方式来并行加载所有内容:
$jquery_script_path = '/wp-includes/js/jquery/jquery.js?ver=1.12.4';
$jquery_dependent_script_paths = [
get_theme_file_uri( '/assets/js/global.js' ),
get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ),
get_theme_file_uri( '/assets/js/skip-link-focus-fix.js' ),
get_theme_file_uri( '/assets/js/navigation.js' )
];
$jquery_dependent_script_paths_json = json_encode($jquery_dependent_script_paths);
$inline_scripts = <<<EOD
<script>
(function () {
'use strict';
if (!window.fetch) return;
/**
* Fetch Inject v1.6.8
* Copyright (c) 2017 Josh Habdas
* @licence ISC
*/
var fetchInject=function(){"use strict";const e=function(e,t,n,r,o,i,c){i=t.createElement(n),c=t.getElementsByTagName(n)[0],i.type=r.blob.type,i.appendChild(t.createTextNode(r.text)),i.onload=o(r),c?c.parentNode.insertBefore(i,c):t.head.appendChild(i)},t=function(t,n){if(!t||!Array.isArray(t))return Promise.reject(new Error("`inputs` must be an array"));if(n&&!(n instanceof Promise))return Promise.reject(new Error("`promise` must be a promise"));const r=[],o=n?[].concat(n):[],i=[];return t.forEach(e=>o.push(window.fetch(e).then(e=>{return[e.clone().text(),e.blob()]}).then(e=>{return Promise.all(e).then(e=>{r.push({text:e[0],blob:e[1]})})}))),Promise.all(o).then(()=>{return r.forEach(t=>{i.push({then:n=>{"text/css"===t.blob.type?e(window,document,"style",t,n):e(window,document,"script",t,n)}})}),Promise.all(i)})};return t}();
fetchInject(
$jquery_dependent_script_paths_json
, fetchInject([
"{$jquery_script_path}"
]));
})();
</script>
EOD;
然后将它们插入头部,有时还带有如下样式:
function wc_inline_head() {
global $inline_scripts;
echo "{$inline_scripts}";
global $inline_styles;
echo "{$inline_styles}";
}
产生如下所示的瀑布,立即加载所有内容,但控制执行顺序:
注意:这需要使用Fetch API,并非所有浏览器都提供此API。