wp_enqueue_scriptはうまくいくように見えますが、それほどエレガントではありません。私は現在MVC(backbone.js)を使用し、文字通り30以上の別々のModel/View/Collection/Controllerスクリプトを持つWPフロントエンドを作っています、そして私は数を増やし続けます。私はrequire.jsを以前からよく使っていて、とても気に入っていますが、ワードプレスのロジックを完全に壊しているようです。
ワードプレスでjsスクリプトローダを使用するクリーンな方法を誰かに教えてもらえますか?それともこれは絶望的な仕事ですか?
ありがとう
WordPressには基本的な.js API(登録およびエンキュースクリプト付き)が既にありますが、少なくともモジュールレベルでrequire.jsと組み合わせて使用できない理由はわかりません。
私が知ることができる(それを使用したことはない)ことから、ロードする必要があるだけなので、
wp_enqueue_script(
$handle,
'...folder../require.js',
$deps,
$ver,
$in_footer
);
次に、推奨されるrequireフォルダー構造とjsコードを使用して、それを利用します。 require.jsはフレームワークに依存しないと信じていますが、競合を避けるための独自の名前空間関数があります。
そうは言っても、使用しているプラグインやテーマではなく、独自のコードで使用することに制限されます。
つまり、プラグインまたはテーマの作成者が正しい方法でスクリプトをwp_dequeue_script
し、require.jsで管理することができますが、そうでない場合はどうでしょうか。ある種のハッキーなプラグインを書いたり、コードを手動で変更したりする以外にできることはあまりありません。
このため、wordpressでjsフレームワークを使用することは、プラグインとテーマをゼロから制御して制御しない限り、おそらく効果がありません。
Require JSを使うためには頭に追加する必要があります
<!-- Delayed execution of inline jQuery scripts with ready waiting event -->
<script type="text/javascript">(function(w, d, u){w.readyQ = []; w.bindReadyQ = []; function p(x, y){if (x == "ready"){w.bindReadyQ.Push(y); } else{w.readyQ.Push(x); }}; var a = {ready:p, bind:p}; w.$ = w.jQuery = function(f){if (f === d || f === u){return a} else{p(f)}}})(window, document)</script>
<!-- Loading require.js -->
<script async data-main="/wp-content/theme/default/js/requirejs.config" src="/wp-content/theme/default/js/requirejs.min.js"></script>
次に、Require.JS設定ファイルを作成してfunctions.phpを更新します。
/* Delayed loading of all JS files */
add_filter('script_loader_tag', function($tag, $handle, $src) {
if (isAdmin()) return $tag;
if (stripos($src, 'jquery.min') !== FALSE) return '';
global $wp_scripts;
$dependencies = $wp_scripts->query($handle, 'registered')->deps;
$dependenciesList = empty($dependencies) ? "'jquery'" : "'" . implode("','", $wp_scripts->query($handle, 'registered')->deps) . "'";
return "<script>$(document).ready(function(){ define('{$handle}', [{$dependenciesList}], function(){require(['{$src}']);}); require(['{$handle}']); });</script>\n";
}, 10, 3);
そして最後に、あなたはあなたの設定ファイルに次のように遅延jqueryイベントの初期化を加える必要があります:
requirejs.config({
paths: {
jquery: 'jquery.min'
}
});
//loading jquery as dependency
require(["jquery"], function ($) {
(function($,d){$.each(readyQ,function(i,f){$(f)});$.each(bindReadyQ,function(i,f){$(d).bind("ready",f)})})(jQuery,document);
});