How to use async and defer with wp_enqueue_script()
Jul 27, 2019
The wp_enqueue_script() function doesn’t support async/defer by itself, but luckily the script_loader_tag hook allows us to manipulate the wp_enqueue_script() output really easily.
<?php
function wpa_add_enqueue_script_attributes( $tag, $handle ) {
// Add defer
if( 'my-handle' === $handle ) {
return str_replace( ' src="', ' defer src="', $tag );
}
// Add async
if( 'another-handle' === $handle ) {
return str_replace( ' src="', ' async src="', $tag );
}
// Add multiple defers
$deferrable_handles = [
'first-handle',
'second-handle',
'third-handle',
];
if( in_array( $handle, $deferrable_handles ) ) {
return str_replace( ' src="', ' defer src="', $tag );
}
return $tag;
}
add_filter('script_loader_tag', 'wpa_add_enqueue_script_attributes', 10, 2);
And that’s it. Easy enough?