How to add defer=”defer” tag in plugin javascripts?

I couldn’t add defer tag in plugin javascripts. Google developer pagespeed test suggests me to add defer tag in contact form 7 javascripts.

This is how contact form 7 includes javascript in header.

Read More
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' );
}

Now how to add defer=”defer” tag in the above code?

Related posts

Leave a Reply

1 comment

  1. As of WordPress 4.1 there is a filter: script_loader_tag. You can use it to find the correct script:

    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 );
    

    Old answer

    There is no dedicated filter available … at least I cannot see one. But …

    • wp_print_scripts() calls WP_Scripts->do_items()
    • which calls WP_Scripts->do_item()
    • which uses esc_url()
    • which does offer a filter: 'clean_url'.

    And here we go:

    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 );
    

    Caveat: not tested, just an idea. 🙂

    Update

    I have written and tested a plugin with this code.