私はすでに自分のスクリプトを追加しましたが、望ましい方法を知りたかったのです。
テンプレートの<script>
に直接header.php
タグを追加しました。
外部またはカスタムのjsファイルを挿入するための好ましい方法はありますか?
jsファイルを単一のページにバインドする方法(ホームページを念頭に置いています)
wp_enqueue_script()
を使用します基本的な答えは、管理用のフロントエンドwp_enqueue_scripts
のadmin_enqueue_scripts
フックで wp_enqueue_script()
を使用することです。次のようになります(テーマの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" );
}
それが基本です。
ただし、jQueryとjQuery UIの両方を WordPressに含まれるデフォルトのスクリプトのリストおよびからソート可能なものに含めたいとしましょう。 ? WordPressで事前定義されたhandles を使用して最初の2つのスクリプトを含めるだけで、スクリプトに対してwp_enqueue_script()
に3番目のパラメーターを提供します各スクリプトで使用されるスクリプトハンドルの例:
<?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 );
}
また、aboveプラグインにバージョン番号を付け、wp_enqueue_script()
に4番目のパラメーターとして渡しました。バージョン番号は、スクリプトのURLのクエリ引数としてソースに出力され、バージョンが変更された場合、キャッシュされている可能性のあるファイルをブラウザに強制的に再ダウンロードさせます。
Webパフォーマンスの最初のルールはMinimize HTTP Requests であるため、可能な限り、必要な場所にのみロードするようにスクリプトを制限する必要があります。たとえば、管理でスクリプトが必要な場合は、代わりに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 );
}
スクリプトがフッターにロードする必要があるスクリプトの1つである場合、WordPressにそれを遅延させてフッターに配置するように指示するwp_enqueue_script()
の5番目のパラメーターがあります(テーマが誤動作せず、確かに すべての良いWordPressテーマのようにwp_footerフックを呼び出します ):
<?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 には How To:Load JavaScript with Your WordPress Plugin というタイトルの素晴らしい記事があります。
Justin Tadlock には スクリプトとスタイルを無効にする方法 というタイトルの素敵な記事があります:
wp_localize_script()
を使用してPHPからJSに値を渡す彼のブログVladimir Prelovacには JavaScriptコードをWordPress_プラグインに追加するためのベストプラクティス という素晴らしい記事があり、サーバーで変数の値を設定できるようにするwp_localize_script()
の使用について説明しています。 side PHPは、後でクライアント側のJavaScriptで使用されます。
wp_print_scripts()
を使用した本当にきめ細かい制御そして最後に、きめ細かな制御が必要な場合は、 Beer Planet というタイトルの投稿で説明されているようにwp_print_scripts()
を調べることができます 投稿に必要な場合にのみCSSとJavaScriptを条件付きで含める方法 。
WordPressにJavascriptファイルを含めるベストプラクティスについてはこれで終わりです。何か(おそらく持っている)を見逃した場合は、将来の旅行者のために更新を追加できるようにコメントで必ず知らせてください。
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') );
スクリプト2がスクリプト3に依存している(つまり、スクリプト3が最初にロードされる)のであれば、これは関係ありません。WordPressはそれらのスクリプトのエンキュー優先順位を決定し、正しい順序で出力します。 WordPressによるあなたのために。
スクリプトが動的に生成されるなどの理由で別のファイルに含めたくない小さなスクリプトの場合は、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を使用する必要があります。これはすべてのブラウザで利用できるわけではありません。