jQueryが古い場合にAmazonJSが動かない件について

AmazonJSが動かない、くるくるローディングしたまま表示されてないという報告がよくあります。原因はいろいろあるのですが、他のプラグインやテーマが古いjQueryを差し替えてきて互換性の問題で動かなくなるというケースが増えています。

WordPress 3.6ではjQuery 1.10が同梱されています。ためしにWordPress 3.6 + Twenty ThirteenでjQuery 1.4に置き換えるとどうなるでしょう。

これはGoogle Chromeのツール > Javascript コンソールを表示してページを表示したときの画面です。

Javascript コンソール

何やらエラーがでていますね。このオブジェクトは on なんてメソッドは持ってないよと書いてあります。

jQueryで .on が実装されたのはバージョン 1.7 からなのでそれより古いjQueryを使うとこのようなエラーが起きます。そしてエラーが起きるとその後の処理が中断されてしまい、AmazonJSの処理が実行がされず商品の表示がされない(ローディングしたまま)ということになります。

エラーが起きているthickbox.jsはAmazonJSがAmazonのレビューを表示するために使っています。これもWordPressが同梱しているライブラリなので当然、WordPressが同梱しているjQueryより古いもので動く保証はありません。とは言え、あまりにこの問題が多いならAmazonのレビューを表示する機能(thickbox.jsを使うこと)をオプションにしようかと思っていました。

しかしここで想定外なことが起きましたもう一つのエラー箇所function.jsはTwenty Thirteenテーマのスクリプトです。ユーザさんがTwenty Thirteenテーマを使っているならAmazonJSがThickboxの使用を止めたとしてもそこでエラーがでるので対処できません。

実はAmazonJSもjQueryを置き換えることがあります。AmazonJSではjQuery templateを使っていますがこれにはjQuery 1.4.2以上が必要なので以下のようにして置き換えています。

$v = get_bloginfo('version');
if (version_compare($v, '3.0', '<')) { // jQuery tmpl requires jQuery 1.4.2 or later
    wp_deregister_script('jquery');
    wp_register_script('jquery', self::JQ_URI, array(), self::JQ_VERSION);
}

jQueryを置き換えるというのはできればやりたくありませんでした。重要なライブラリであればあるほど、影響範囲を想定して常識的なソフトウェアエンジニアは互換性を考慮するでしょう。WordPressが同梱するjQueryは以下に記載されています。

A History of jQuery Versions Included in WordPress

WordPress 3.6 includes jQuery 1.10.2
WordPress 3.5 included jQuery 1.8.3
WordPress 3.4 included jQuery 1.7.2
WordPress 3.3 included jQuery 1.7.1
WordPress 3.2 included jQuery 1.6.1
WordPress 3.1 included jQuery 1.4.4
WordPress 3.0 included jQuery 1.4.2
WordPress 2.9 included jQuery 1.3.2
WordPress 2.8 included jQuery 1.3.2
WordPress 2.7 included jQuery 1.2.6
WordPress 2.6 included jQuery 1.2.6
WordPress 2.5 included jQuery 1.2.3
WordPress 2.3 included jQuery 1.1.4
WordPress 2.2 included jQuery (version not listed)

AmazonJSはjQueryが1.4.2より古い場合、つまりWordPress 3.0未満でのみ差し替え、WordPress 3.0以上であれば何もしません。

ソフトウェアエンジニアではない人が一生懸命つくったテーマ、プラグインであれば僕は何も言いません。でもソフトウェアエンジニアが互換性も考えずに自分のコードだけが動けばいいという実装をするなら3時間くらい正座させて説教したいです。

すいません。取り乱しました。

AmazonJSからできることを考えていますが、まず表示されなくて困っているユーザの皆さんにお願いしたいのは原因を特定していただくことです。AmazonJSが動かないと言われるのはまだ僕だけのことなのでいいのですが、他が原因なのにこのテーマとAmazonJSだと動かないなど別のところに火の粉が飛ぶのは心苦しい限りです。(テーマが古いjQueryを差し替えたというケースもあったのでテーマの問題であることもありますが)

Google Chromeのツール > Javascript コンソールでjavascriptのエラーがどこででているかや、HTMLのソースをみて古いjQueryが差し替えられていないか、テーマを変えてみたり、プラグインを1つずつ無効にしてみるなどまず問題の切り分けをしてみてください。

そしてテーマやプラグインが古いjQueryを差し替えていそうなことがわかったら、WordPressが同梱するjQueryのバージョン一覧を教えてあげて古いものを入れると良からぬことが起きることを報告してあげてください。

AmazonJSが悪かった場合も、こんなことがいろいろあってWordPressに対する気持ちが冷めつつあるので優しく報告していただけると幸いです。わりとJekyllに移行できるなら移行したいとか考えたりもするので。