Wordpress - How to intercept already localized scripts
wp_localize_script()
calls the method localize()
on the global variable $wp_scripts
. We can set this variable to an instance of a child class of WP_Scripts
:
class Filterable_Scripts extends WP_Scripts
{
function localize( $handle, $object_name, $l10n )
{
$l10n = apply_filters( 'script_l10n', $l10n, $handle, $object_name );
return parent::localize($handle, $object_name, $l10n);
}
}
add_action( 'wp_loaded', function() {
$GLOBALS['wp_scripts'] = new Filterable_Scripts;
});
The theme customizer doesn’t use that, it creates a separate instance of WP_Scripts
(see wp-admin/customize.php
). It might be possible to replace that too:
add_action( 'customize_controls_init', function() {
$GLOBALS['wp_scripts'] = new Filterable_Scripts;
$GLOBALS['wp_scripts']->registered = $GLOBALS['registered'];
});
None of this has been tested, just an idea.
@toscho great implementation. Tested and true. Here is a slightly modified version, which also passes the $handle and $object_name so you can filter only when needed.
class Filterable_Scripts extends WP_Scripts
{
function localize( $handle, $object_name, $l10n )
{
$l10n = apply_filters( 'script_l10n', $l10n, $handle, $object_name );
return parent::localize($handle, $object_name, $l10n);
}
}
add_action( 'init', function() {
$GLOBALS['wp_scripts'] = new Filterable_Scripts;
});
add_filter('script_l10n', 'se108362_example_filter', 10 , 3);
// Example
function se108362_example_filter($l10n, $handle, $object_name ) {
if('js-handle' == $handle && 'jsVariable' == $object_name) {
return 'Something Else';
}
return $l10n;
}