Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save westonruter/471111a891f43e0f48bc7e0ca478623d to your computer and use it in GitHub Desktop.
Save westonruter/471111a891f43e0f48bc7e0ca478623d to your computer and use it in GitHub Desktop.
<?php
/**
* Plugin Name: Force Low-Priority Interactivity API Script Modules
* Plugin URI: https://core.trac.wordpress.org/ticket/61734
* Description: Improves Largest Contentful Paint by forcing the module scripts (from the Interactivity API) to be loaded with a low priority rather than the default high priority. This prevents network contention with loading the LCP element.
* Requires at least: 6.5
* Requires PHP: 7.2
* Version: 0.1
* Author: Weston Ruter
* Author URI: https://weston.ruter.net/
* License: GPLv2 or later
* License URI: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* Update URI: https://gist.github.com/westonruter/471111a891f43e0f48bc7e0ca478623d
*/
if ( isset( $_GET['disable-script-module-low-priority'] ) ) {
return;
}
add_filter(
'wp_script_attributes',
static function ( $attributes ) {
if (
isset( $attributes['type'], $attributes['id'] ) &&
'module' === $attributes['type']
&&
str_starts_with( $attributes['id'], '@wordpress/block-library/' )
) {
$attributes['fetchpriority'] = 'low';
}
return $attributes;
}
);
add_action(
'init',
static function () {
$position = wp_is_block_theme() ? 'wp_head' : 'wp_footer';
$priority = has_action( $position, array( wp_script_modules(), 'print_script_module_preloads' ) );
if ( false === $priority ) {
return;
}
remove_action( $position, array( wp_script_modules(), 'print_script_module_preloads' ), $priority );
add_action(
$position,
static function () {
ob_start();
wp_script_modules()->print_script_module_preloads();
$buffer = ob_get_clean();
if ( '' === $buffer ) {
return;
}
$processor = new WP_HTML_Tag_Processor( $buffer );
while ( $processor->next_tag( array( 'tag_name' => 'LINK' ) ) ) {
$processor->set_attribute( 'fetchpriority', 'low' );
}
echo $processor->get_updated_html();
},
$priority
);
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment