web-dev-qa-db-ja.com

wp_register_script(... $ in_footer = true)が機能しない

フッターにJavaScriptファイルをいくつかロードしたいのですが。私はそのようにfunctions.phpでそれを達成しようとしました:

function my_init() {
        // LOAD JQUERY
        wp_deregister_script('jquery');
        wp_register_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',$deps = array(),$in_footer = true);
        wp_enqueue_script('jquery');

        // LOAD STUTS
        wp_register_script('stuts',get_bloginfo('template_url') . '/js/spss-tutorials-custom-functions.js',$deps = array('jquery'),$in_footer = true);
        wp_enqueue_script('stuts');

        // CONDITIONALLY LOAD MATHJAX
        wp_register_script('mathjax','//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML',$deps = array(),$in_footer = true);
        $url = explode('?', 'http://'.$_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
        $ID = url_to_postid($url[0]);
        $mathjax = get_post_meta($ID,'mathjax',true);
            if($mathjax == 'y'){
                wp_enqueue_script('mathjax');
            }
}

add_action('init', 'my_init');

しかし、すべてのスクリプトがまだ私のヘッダーに読み込まれています。

私は hereherehere の解決策を試しましたが、問題は解決しません。

する持っている

<?php wp_footer(); ?>
</body>

私のfooter.phpファイルに。助言がありますか?

1
RubenGeert

(レンダリング)時間の中で正しい場所を選ぶ

まず最初に、コールバックをwp_enqueue_scriptに追加しながら、initをフックしています。

例:

add_action( 'wp_enqueue_script', function() {
    wp_deregister_script( 'jquery' );
    // Rest of logic
} );

コアを最新の状態に保つ

また、コアで使用されている正しいバージョンを使用することをお勧めします。私は知っています、これを常に見ているのは面倒で、資産/依存関係を監視したいと思う人はいません。幸いなことに、すでにコアに存在している情報を使用することができます。資産に必要な依存関係についても同じことが言えます。例:

add_action( 'wp_enqueue_script', function() {

    $version      = $GLOBALS['wp_scripts']->registered['jquery']->ver;
    $protocol     = 'sprintf( 'http%s://', is_ssl() ? 's' : '' );
    $dependencies = $GLOBALS['wp_scripts']->registered['jquery']->deps;

    wp_enqueue_script( 
        'jquery',
        "{$protocol}cdn.example.com", 
        $dependencies,
        $version,
        TRUE
    );
} );

登録したスクリプトをフッターに移動する

すでに登録されているスクリプトをフッターに移動するより簡単な方法もあります。スクリプトレジストリ内の情報を直接編集します。次の(MU)プラグインを考えてください。

<?php
/* Plugin Name: Moves registered scripts to the footer */
add_action( 'wp_enqueue_scripts', function() {
    foreach ( apply_filters( 'wp_scripts.footer', [] as $script )
        $GLOBALS['wp_scripts']->add_data( $script, 'group', 1 );
}, PHP_INT_MAX -1 );

これで、上記のフィルタに配列を追加して、スクリプトをフッターに移動できます。

add_filter( 'wp_scripts.footer', function( Array $scripts ) {
    return [ 
        'jquery', 
        # Other scripts
    ];
} );

追加のメモ、私は書き留めに戻ることができませんでした…

あなたのコードに関して注意すべき非常に奇妙な(しかし動作する)ものも複数あります。

  • あなたがそれらを必要としないとき、あなたは変数を割り当てています。特に関数呼び出しでは、myFunction( $var = 'foo' )を使う必要はありません。値を追加するだけです。
  • //url.tld/script.jsを使用すると、クライアントは移動先のルート(HTTPSとHTTP)を決定できます。これは、分散コードには問題ないかもしれません(それでも、プロトコルを事前に取得して使用する方が良いでしょう)。それは速くて、利用可能なHTTPSがあれば、それでは神のために:それを使ってください!
  • WPコアスクリプトの登録を解除しないでください。それらを使ってください。それらはすでにクライアント/ブラウザにログインしている人々のためにキャッシュされています。他のすべての人にとっては、単一の、互換性のあるバージョンをお届けします。
  • $_SERVERに頼ることはあなたのスクリプトが常にクライアントを介してのみ実行されるのであれば大丈夫です。コマンドラインでは、この配列のデータを使用することは信頼できません。ある場合にはそれは変化し、他の場合にはそれは設定されていない。 WPには代わりに使用できるフォールバックがいくつかあります。
1
kaiser