web-dev-qa-db-ja.com

WordPressスクリプトのロード/アンロード - wp_deregister_script( 'jquery')

WordPressのJavaScriptツールのロード/アンロードに関していくつか質問があります。 Pieter Goosenによる質問に対するきちんと書かれた回答を読んだ後、それは私が私のライブラリをロードするのに使っているコードのちょっとした勉強とクリーンアップをするようになった。このコードは私の子供のテーマのfunction.phpファイルからのものです。私は私のサイトに日付ピッカーカレンダーツールを使ういくつかの機能を持っています。さらにjQueryを使っていると思うプラグインがいくつかあります。

function jquery_loadup() {
        //wp_deregister_script('jquery');    <--- ?H
        wp_enqueue_script('jquery');
        //wp_enqueue_script('jquery-migrate');
        wp_enqueue_script('jquery-ui-core');
        wp_enqueue_script('jquery-ui-datepicker');
        wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css');
}
add_action('wp_enqueue_scripts','jquery_loadup');

私は、wp_deregister_script('jquery')という行がjqueryスクリプトに対する以前のすべての「要求」を本質的にリセット/クリアするので、それらが互いに干渉しないという印象を受けました。その行の後にwp_enqueue_script('jquery');が続くと、WordPressの一般的に使用されるスクリプト登録ハンドル/スクリプトパスシステムを介したjQueryの最小限のクリーンロードになるはずです。私は登録抹消がjqueryのための前の 'install'の存在をテストすると思います、そしてそれが1つ以上見つけたならば、ロードを停止します、何も登録されていなければ何もしません。

私が見ているのは、wp_deregister_script('jquery')を使用すると、ウェブシー"ReferenceError: jQuery is not defined"でエラーが発生するということです。これが起こると、私のJavaScript関数はすべて失敗します。一体何ですか?コメントアウトすると、サイトは正常に機能します。

質問:私は何かが足りないのですか?登録解除の電話について何を理解していないのですか。エラーメッセージが表示されるのはなぜですか。

jquery-migrateのその中の行は、古いバージョンのjQueryを使っているソフトウェアのためのものであることに注意してください。私はそれをテストしましたが、私のサイトでは何もしないことがわかりましたので、ダウンロードと応答時間を改善するために取り出しました。質問:それは悪い考えですか?

参照先

2
zipzit

Wordpressには、スクリプトを処理するための基本的に2つのメソッドグループがあります。どちらも使用する必要があります。

  • wp_register_script Wordpressにスクリプトを登録します。それは呼ばれません、それが必要とされるなら、それはWordpressのためにただ利用可能です。
  • wp_deregister_scriptは正反対です。これは、wp_register_scriptで作成された定義を削除します。スクリプトは依存関係としてもエンキューにも使用できなくなりました。

登録されたスクリプトはコードで何も出力しません。 WPが依存関係やエンキューに反応できるように、スクリプトでプログラム的に定義するだけです。

  • wp_enqueue_scriptは、実際にはHTMLページのヘッダー/フッターに出力するためのスクリプトを定義してキューに入れます。
  • wp_dequeue_scriptは正反対を出力し、出力用のスクリプトをデキューします。

実際の印刷は、レジスターの詳細に応じて、アクション 'wp_head'または 'wp_footer'で行われます。

例:

wp_deregister_script('jquery');
wp_register_script('jquery', ("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"), false, '1.9.1', true);

wp_enqueue_script( 'script-1', get_template_directory_uri() . '/js/example1.js', array('jquery'), '1.0.0', false );
wp_enqueue_script( 'script-2', get_template_directory_uri() . '/js/example2.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-3', get_template_directory_uri() . '/js/example3.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-4', get_template_directory_uri() . '/js/example4.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-5', get_template_directory_uri() . '/js/example5.js', array('jquery'), '1.0.0', true );

この例では、jQueryを登録解除します。それはもう利用できません、そして、私が再びそれを登録しないならば、私はあなたと同じエラーを受けるでしょう。 (今回はGoogle CDNからの希望で、私のページがスピードアップすることを望んでいます。)

しかし3行目ではjQueryは表示されません。どこにも現れません。しかし、4行目から私は一連のスクリプトを呼び出します。これらはすべて依存関係としてjqueryを持っています。最初のものはヘッダーにあり、他のものはフッターにあります。依存関係のため、jQueryはヘッダーに自動的にエンキューされます。これは最初に必要になるためです。

そのため、Wordpressのスクリプトシステムは非常に堅牢であり、干渉や以前の要求を処理する必要はありません。登録済みスクリプトは、一度必要になったときに呼び出され、必要なときにのみ呼び出されます。

この例では、関数の1行目でスクリプトを登録解除し、2行目で再度呼び出します。ただし、Wordpressは登録解除のため、URL、バージョン、依存関係などの詳細をすべて忘れています。あなたのロジックの中の正しい関数はwp_dequeue_scriptでしたが、それでも必要ではありません。 Wordpressは、キューに登録されたスクリプトまたは依存関係を調べることによってニーズを評価します。

編集する

wordpressはどのようにして8種類のプラグインがすべて異なるバージョンのjqueryを追加しようとすることによる混乱を防ぐ方法を知っていますか?

wp_print_scriptsアクションの前にjqueryを登録した最後のインスタンスが表示されるものです。それが基本的にアクション/フィルタの優先システムです。

3

チップインするために、まず第一に、補完してくれてありがとう、感謝しています。

あなたは子テーマを使用していますが、その親テーマであるでワードプレスに組み込まれているjqueryライブラリをエンキューしているはずです。私があなたが言及している記事で述べたように、どの親テーマにとってもデフォルトでjqueryをエンキューしないことは悪い習慣です。

あなたのコードにはいくつか問題があります。まず第一に、デフォルトのjqueryライブラリの登録を解除しないでください、後で失敗するでしょう。正しい方法は wp_dequeue_scripts を使用してスクリプトをデキューすることです。

ここでも質問が1つありますが、なぜあなたはjqueryをデキューしてそれを再キューイングする必要があるのですか。これは通常、jqueryが2回読み込まれないようにするためだけにプラグインの作成者が使用します。その理由は、プラグインがすべてのテーマで機能するためです。したがって、ユーザーがプラグインで使用しているテーマにjqueryが読み込まれているかどうかはわかりません。あなたはその特定の親テーマでのみ動作する子テーマを実行しているので、親テーマにjqueryがロードされているかどうかがわかります。そのため、デキューして再キューイングする必要はありません。

第二に、あなたは優先順位を見なければならないでしょう。 add_action には4つのパラメータがあり、3番目のパラメータは優先度($priority)です。通常、プラグインと子テーマは、親テーマの後にスクリプトをロードして、後でオーバーランしないようにします。それで、あなたの行動を最後に実行するのは賢明で良い習慣です。これには、あなたは非常に低い優先順位、すなわち非常に高い数を必要とするでしょう。

  add_action( 'wp_enqueue_scripts', 'jquery_loadup', 999 );
2
Pieter Goosen