How do I defer or async this WordPress javascript snippet to load lastly for faster page load times? How do I defer or async this WordPress javascript snippet to load lastly for faster page load times? wordpress wordpress

How do I defer or async this WordPress javascript snippet to load lastly for faster page load times?


Or more universal way:

function add_async_forscript($url){    if (strpos($url, '#asyncload')===false)        return $url;    else if (is_admin())        return str_replace('#asyncload', '', $url);    else        return str_replace('#asyncload', '', $url)."' async='async"; }add_filter('clean_url', 'add_async_forscript', 11, 1);

so you can add async to any script without code changes, just add #asyncload to script url as:

wp_enqueue_script('dcsnt', '/js/jquery.social.media.tabs.1.7.1.min.js#asyncload' )


Trying to keep things somewhat modular and all encompassing, the following approach dynamically chooses how to embed the tag with the async or defer attributes by just appending a small identifier to the $handle name:

/*** Add async or defer attributes to script enqueues* @author Mike Kormendy* @param  String  $tag     The original enqueued <script src="...> tag* @param  String  $handle  The registered unique name of the script* @return String  $tag     The modified <script async|defer src="...> tag*/// only on the front-endif(!is_admin()) {    function add_asyncdefer_attribute($tag, $handle) {        // if the unique handle/name of the registered script has 'async' in it        if (strpos($handle, 'async') !== false) {            // return the tag with the async attribute            return str_replace( '<script ', '<script async ', $tag );        }        // if the unique handle/name of the registered script has 'defer' in it        else if (strpos($handle, 'defer') !== false) {            // return the tag with the defer attribute            return str_replace( '<script ', '<script defer ', $tag );        }        // otherwise skip        else {            return $tag;        }    }    add_filter('script_loader_tag', 'add_asyncdefer_attribute', 10, 2);}

Example usage:

function enqueue_my_scripts() {    // script to load asynchronously    wp_register_script('firstscript-async', '//www.domain.com/somescript.js', '', 2, false);    wp_enqueue_script('firstscript-async');    // script to be deferred    wp_register_script('secondscript-defer', '//www.domain.com/otherscript.js', '', 2, false);    wp_enqueue_script('secondscript-defer');    // standard script embed    wp_register_script('thirdscript', '//www.domain.com/anotherscript.js', '', 2, false);    wp_enqueue_script('thirdscript');}add_action('wp_enqueue_scripts', 'enqueue_my_scripts', 9999);

Outputs:

<script async type='text/javascript' src='//www.domain.com/somescript.js'></script><script defer type='text/javascript' src='//www.domain.com/otherscript.js'></script><script type='text/javascript' src='//www.domain.com/anothercript.js'></script>

Thanks to @MattKeys @crissoca for inspiring my answer here.


This blog post links to two plugins of interest:

Asynchronous Javascript
Improve page load performance by asynchronously loading javascript using head.js

WP Deferred Javascripts
Defer the loading of all javascripts added with wp_enqueue_scripts, using LABJS (an asynchronous javascript library).

Haven't tested them but checked the code and they do pretty fancy stuff with WordPress scripts enqueuing process.

But then WPSE comes to rescue:

// Adapted from https://gist.github.com/toscho/1584783add_filter( 'clean_url', function( $url ) {    if ( FALSE === strpos( $url, '.js' ) ) {        // not our file        return $url;    }    // Must be a ', not "!    return "$url' defer='defer";}, 11, 1 );