プラグインjavascriptにdefer =“ defer”タグを追加する方法は?


28

プラグインjavascriptにdeferタグを追加できませんでした。Google開発者のページ速度テストでは、連絡フォーム7の javascriptにdeferタグを追加することを勧めています。

これが、問い合わせフォーム7のヘッダーにjavascriptが含まれている方法です。

add_action( 'wp_enqueue_scripts', 'wpcf7_enqueue_scripts' );

function wpcf7_enqueue_scripts() {
    // jquery.form.js originally bundled with WordPress is out of date and deprecated
    // so we need to deregister it and re-register the latest one
    wp_deregister_script( 'jquery-form' );
    wp_register_script( 'jquery-form', wpcf7_plugin_url( 'jquery.form.js' ),
        array( 'jquery' ), '2.52', true );

    $in_footer = true;
    if ( 'header' === WPCF7_LOAD_JS )
        $in_footer = false;

    wp_enqueue_script( 'contact-form-7', wpcf7_plugin_url( 'scripts.js' ),
        array( 'jquery', 'jquery-form' ), WPCF7_VERSION, $in_footer );

    do_action( 'wpcf7_enqueue_scripts' );
}

上記のコードにdefer = "defer"タグを追加する方法を教えてください。



1
いい質問@Viruthagiri。
ラムクマールM

回答:


56

WordPress 4.1現在、フィルターがあります:script_loader_tag。これを使用して、正しいスクリプトを見つけることができます。

add_filter( 'script_loader_tag', function ( $tag, $handle ) {

    if ( 'contact-form-7' !== $handle )
        return $tag;

    return str_replace( ' src', ' defer="defer" src', $tag );
}, 10, 2 );

古い答え

専用のフィルターはありません...少なくとも私には見えません。しかし…

  • wp_print_scripts() 呼び出します WP_Scripts->do_items()
  • どの呼び出し WP_Scripts->do_item()
  • 使用する esc_url()
  • これはないフィルタを提供します'clean_url'

さあ、いくぞ:

function add_defer_to_cf7( $url )
{
    if ( FALSE === strpos( $url, 'contact-form-7' )
      or FALSE === strpos( $url, '.js' )
    )
    { // not our file
        return $url;
    }
    // Must be a ', not "!
    return "$url' defer='defer";
}
add_filter( 'clean_url', 'add_defer_to_cf7', 11, 1 );

警告:テストされていない、単なるアイデア。:)

更新

このコードを使用してプラグインを作成し、テストしました。https://gist.github.com/1584783を参照してください


また、これは、データ・メインrequirejsでの使用に最適です
ニコラPeluchetti

それは素晴らしいハックであり、とても簡単です。必要なときにcharset = 'utf-8'を追加するのにも良いと思います!
Webaware

素晴らしい、しかしなぜ:「ではなく」でなければならない!?
ヘンリーライト14

@henrywright WordPress 'は、返された文字列の両側に追加"するため、無効なHTMLになります。
FUXIA

2
おそらく誰かがこれを他のスクリプトで動作するようにしたい場合の良いアイデアは、おそらくif( ! is_admin() ){}ACFのような人気のあるプラグインを使用してフォントエンドでのみ使用することを確認することですあなたの頭痛を与えるかもしれません。
crissoca
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.