如何拦截已本地化的脚本

时间:2013-07-30 作者:kaiser

如果插件使用了一些脚本(突出的示例:jQuery UI Datepicker),但您对脚本呈现输出的方式不满意,那么有两种可能性:

1。注销脚本>添加自己的版本,因此首先需要检查句柄,然后找到优先级和挂钩(wp_enqueue_scripts, login_enqueue_scripts, 等。)。。。你知道该怎么做。

2。正常更改jQuery插件参数-如果插件不是垃圾-它会使用

wp_localize_script( $handle, $object_name, array( 
    // data
) );
现在,这是一种将数据添加到JS脚本的智能方法,but ... 默认情况下,它不可过滤。也不WP_Scripts 也没有WP_Dependencies 提供用户以后可以使用的任何过滤器

Question: 我们如何使用wp_localize_script?

4 个回复
最合适的回答,由SO网友:fuxia 整理而成

wp_localize_script() 调用方法localize() 关于全局变量$wp_scripts. 我们可以将此变量设置为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;
});
主题定制器不使用该选项,而是创建WP_Scripts (参见wp-admin/customize.php). 也有可能将其替换为:

add_action( \'customize_controls_init\', function() {
    $GLOBALS[\'wp_scripts\'] = new Filterable_Scripts;
    $GLOBALS[\'wp_scripts\']->registered = $GLOBALS[\'registered\'];
});
这些都没有经过测试,只是一个想法。

SO网友:Eric Holmes

@toscho实现得很好。已测试且正确。这是一个稍加修改的版本,它还传递了$句柄和$object\\u名称,因此您只能在需要时进行筛选。

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

SO网友:Ogier Schelvis

The accepted answer 太棒了!但我遇到了一个问题,由于javascript错误,高级自定义字段在后端停止工作。经过几个小时的挖掘,我得出结论,Filterable\\u Scripts对象缺少ACF插件注册的javascript文件。我不知道它为什么会这样做,但如果你遇到同样的问题,我已经找到了一个合适的解决方案。

这个$GLOBALS[\'wp_scripts\'] 幸运的是,仍然包含正确的脚本。所以我在add_action:

add_action( \'wp_loaded\', function() {
    $fscripts = new Filterable_Scripts();

    $missing_scripts = array_diff_key( $GLOBALS[\'wp_scripts\']->registered, $fscripts->registered);
    foreach($missing_scripts as $mscript){
        $fscripts->registered[$mscript->handle] = $mscript;
    }

    $GLOBALS[\'wp_scripts\'] = $fscripts;
});
由于该对象包含一个包含所有已注册脚本的数组,并且句柄也是数组键,因此我可以使用array\\u diff\\u key来确定扩展对象中缺少哪些脚本并重新添加它们。我做了这件事

$fscripts->registered = $GLOBALS[\'wp_scripts\']->registered;

因为我不想覆盖扩展对象所做的任何更改。

SO网友:flux

在该线程中每个人的工作基础上,I extended the answers to filter the <script> tag itself, not solely it\'s inner contents. 例如,需要这样来标记内联脚本data-cfasync="false" 使用Cloudflare Rocket Loader时。

结束

相关推荐

屏幕选项JavaScript代码

我想知道,是什么脚本驱动WordPress中的“屏幕选项”动画切换。我指的是当管理员单击帖子、页面或类别等窗口右上角附近的“屏幕选项”链接时滑出的选项菜单,当再次单击同一链接时滑回。如果有知识的人能告诉我JavaScript代码片段的确切位置,我将不胜感激。