サポート » テーマ » ヘッダ部分wp_headの制御

  • header.phpに

    <?php wp_head(); ?>

    の記述をしています。
    プラグインからのjsファイルの指定などに使われていると思うのですが、これの内容を操作できないのでしょうか。
    具体的にいえば、とあるプラグインでjqueryの指定があるのですがバージョンが古いのです。
    別にこれで直接困っているわけではありませんが、せっかく上の行で上位のjqueryを指定しているのに無駄なソースが増えるのでうっとおしいです。
    かといって、プラグインの動作にその他のjsやcssが必要な場合があるので外すわけにはいきません。

    必要なものとそうでないものを分ける、よい方法はありませんでしょうか。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • ご質問の内容とは若干ずれているかもしれませんが。

    jQuery を使用する際を含め、外部ファイルの JavaScript を読み込む際には、テーマに直接 script 要素を記述するのではなく、 functions.php にて wp_enqueue_script() を使ってみてください。 wp_enqueue_script() は wp_head() にフックされており、 head 要素内に登録しておいた JavaScript 外部ファイルの script 要素を、重複や依存関係をチェックした上で出力します。

    // if ( !defined('TEMPLATE_DIR') ) define( 'TEMPLATE_DIR', get_bloginfo('template_directory') );
    // wp_enqueue_script( $handle, $src, $depth, $version );
    wp_enqueue_script( 'jquery', TEMPLATE_DIR . 'js/jquery.js', array(), '1.3.2' );
    // $depth に依存関係にあるスクリプトの $handle を配列で渡すと、該当する $handle のいずれかが登録されていない場合読み込まない。
    wp_enqueue_script( 'jquery-ui', TEMPLATE_DIR . '/js/jquery-ui.js', array('jquery'), '1.7' );

    これで、外部ライブラリの読み込みが重複せず、指定されたなかで最新のバージョンの jQuery が利用されるはずです。

    一方、プラグインで wp_enqueue_script を使用せず、直接 script 要素を出力する関数を wp_head にフックしている場合は、プラグインのコードから add_action() 関数を見つけて、関数名と優先度を調べておき、 remove_filter() で

    remove_filter( 'wp_head', 'example_function' );
    // Class: remove_filter( 'wp_head', array($object, 'example_method') );

    などとしてあげれば、その出力を停止させることが出来ます。ただし、その上で必要なスクリプトを読み込むようにコードを改変する必要があるかもしれません。せっかくこういうチェック機構が用意されているのですから、プラグイン作者に wp_enqueue_script() を使用するよう提案してみるのも手だと思います。

    トピック投稿者 hoary

    (@hoary)

    mizubeさん、返答ありがとうございます。

    上部の手法は、外部ライブラリに一定の法則がある場合に有効なのでしょうか?

    下部のプラグインの場合は、ちょっと面倒そうです。

    結局のところ、細部まで拘ろうとすると直に書いたほうが早そうです。

    ありがとうございました。

    上部の手法は、外部ライブラリに一定の法則がある場合に有効なのでしょうか?

    プラグイン等で jQuery を head 要素内で読み込ませる為に

    function load_script_jquery() {
        $src = WP_PLUGIN_URL . '/example_plugin/js/jquery.js';
        echo "<script type=\"text/javascript\" src=\"{$src}\"></script>\n";
    }
    
    add_action( 'wp_head', 'load_script_jquery' );

    のような直接出力する方法ではなく

    wp_enqueue_script( 'jquery', WP_PLUGIN_URL . '/example_plugin/js/jquery.js', null, '1.3.2' );

    のように wp_enqueue_script() でスクリプトを登録する方法を使用している場合に、「この」方法が有効です。有名どころでは ContactForm7 なんかがこの方法を採っていますし、 jQuery を使用する多くのプラグインでも利用されているのではないでしょうか。現在対応していないプラグインやテーマでも徐々にこの方法を採用する方向にシフトしていくものと思われます。

    wp_enqueue_script() を使ってスクリプトを登録する方法では、既に書きましたとおり、この関数で登録したスクリプトのうち、ハンドル名が同じものについて、それぞれのバージョンをチェックし、その中の最新のバージョンのスクリプトを使用します。よって、外部ライブラリの種類に制限はありません。

    問題は、同種のスクリプトについて、統一されたハンドル名で登録されているかどうか、そのハンドル名はどうやって決定すれば (調べれば) よいか、ということになりますが、下記のリンク先に WordPress で使用されているスクリプトのハンドル名の一覧が記載されていますので、参考にしてみて下さい (例えば、 jQuery のハンドル名は ‘jquery’ です) 。

    おそらく各プラグイン作者は、それらのハンドル名に統一しているはずです。一方、一覧に記載されているもの以外のスクリプトのハンドル名については、さすがに該当するプラグイン等のソースを個別に確認するしかありませんが、そうせざるを得ないのは、ライブラリの重複に気付いたときだけです。

    具体的にいえば、とあるプラグインでjqueryの指定があるのですがバージョンが古いのです。

    更に具体的に、それがどのようなプラグインかを教えて頂ければ、上の条件に合うかどうか調べてみますが、いかがでしょうか?

    結局のところ、細部まで拘ろうとすると直に書いたほうが早そうです。

    いいえ、 wp_enqueue_script() を使用した方が、たった一行でライブラリの読み込みの重複を自動的に回避でき、かつ常に利用できる内の最新のバージョンを使用できるため、 WordPress やプラグインのバージョンアップを考慮すれば、短期的に見ても、また長期でみればはるかに、その運用は容易かつ、確実です。私個人は、テーマで使用するスクリプトもすべてこの方法で登録しています。

    # google の jsapi 内の jQuery を使用する場合は、この限りではありませんが。

    トピック投稿者 hoary

    (@hoary)

    google の jsapi 内の jQuery を使用する場合は、この限りではありませんが。

    実はこの用法で全headに指定していたので、さらに下の行でjQueryの古いものが勝手に指定される羽目に合ったのが事の発端でした。

    ということはwp_enqueue_script()でjQueryの指定を外せば下の行で再び記述されることは無くなるということでしょうか。

    ただ、プラグインを重ねれば関連しないページでもhead内の記述が増えることは間違いないですよね。
    wp_enqueue_script()の()で指定すればいい気もしますが、結局ファイルが増えるということになりそうです。

    jsファイルをまとめていたりもするので、そのあたりはページを組む段階で整理したほうがよさそうですね。

    なお、使っていたプラグインはContactForm7でした。

    教えていただいた手法も興味がありますので、やってみます。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「ヘッダ部分wp_headの制御」には新たに返信することはできません。