推迟本地化脚本怎么样?

时间:2018-01-17 作者:MikeiLL

我很想推迟加载插件Simple Locator的脚本,该插件使用Google。地图API。

但它使用wp_localize_script, 打印一个wpsl_locator HTML页面中的javascript对象(包括选项),该对象调用google-maps API的google 对象,该对象尚未加载。

我想我可以通过破解插件并添加wpsl_locator = new Object() 通过另一个(延迟)脚本,该脚本将包括硬编码选项:

wpsl_locator.map_options={[truncated]{style:google.maps.ZoomControlStyle.SMALL,}};

但一个问题是,它会在插件更新时中断。

看起来不像wp_deregister_script( \'simple-locator\' ); 正在删除i10n输出wp_localize_script 正在生成。

是否有建议的处理方法?

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

解决方案基本上来自this SO post:

当wordpress“本地化”脚本时,它所做的就是打印出php<script></script> 标记中包含javascript对象,然后可以在DOM中访问要“发送”参数的脚本。

如果我理解正确WP_Scripts simple添加一个过滤器,由(任意)句柄引用,script_l10n, 然后发送过滤后的变量,$110n 到父方法,localize, 这就是要“本地化”的WPs数组的发送位置。

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);
    }
}
然后我们更换$GLOBALS[\'wp_scripts\'] 用我们新的可过滤的。

function my_filter_script_intlization() {
    $GLOBALS[\'wp_scripts\'] = new Filterable_Scripts;
}
add_action( \'init\', \'my_filter_script_intlization\');
现在我们可以钩住过滤器来修改l10n 插件中的字符串(一旦我们使用print_r() 或者弄清楚它是什么)。

function se108362_example_filter($l10n, $handle, $object_name ) {
    if(\'simple-locator\' == $handle && \'wpsl_locator\' == $object_name) {

        $phyt_i10n_settings = array(
            \'mapTypeId\' => \'roadmap\',
            \'mapTypeControl\' => false,
            \'zoom\' => 8,
            \'panControl\' => false,
            \'zoomControlOptions\' => array(\'style\' => \'\') // was google.maps.ZoomControlStyle.SMALL
            );


        $l10n[\'l10n_print_after\'] = \'wpsl_locator.map_options = \' . json_encode($phyt_i10n_settings);

        return $l10n;
    }
    return $l10n;
}

add_filter(\'script_l10n\', \'se108362_example_filter\', 10 , 3);
然后在js中,我替换l10n 变量与我的硬编码变量:

wpsl_locator.map_options.zoomControlOptions.style = google.maps.ZoomControlStyle.SMALL;
wpsl_locator.map_options.styles = wpsl_locator.mapstyles;
由于某种原因Filterable_Scripts 子类似乎破坏了高级自定义字段脚本加载:

public function my_filter_script_intlization() {
    //These exist here:
    var_dump($GLOBALS[\'wp_scripts\']->registered[\'acf-field-group\']);
    var_dump($GLOBALS[\'wp_scripts\']->registered[\'acf-input\']);
    $GLOBALS[\'wp_scripts\'] = new \\PhytJobs\\FilterableScripts;
    // But now they are gone
    print_r(isset($GLOBALS[\'wp_scripts\']->registered[\'acf-field-group\']));
}
我的解决方法是:

public function my_filter_script_intlization() {
    $acf_field_group = $GLOBALS[\'wp_scripts\']->registered[\'acf-field-group\'];
    $acf_input = $GLOBALS[\'wp_scripts\']->registered[\'acf-input\'];
    $GLOBALS[\'wp_scripts\'] = new \\PhytJobs\\FilterableScripts;
    $GLOBALS[\'wp_scripts\']->registered[\'acf-field-group\'] = $acf_field_group;
    $GLOBALS[\'wp_scripts\']->registered[\'acf-input\'] = $acf_input;
}
但我想知道为什么分类法一开始就打破了它。

有人认为问题是由于my_filter_script_intlization 行动太迟,之后$WP_Scripts 已部分填充。我仍然有点不清楚它是如何工作的,或者为什么ACF会成为问题。

更新时,ACF仅在Admin中加载其脚本,而仅在其他插件中加载l10n 在前端,所以我把actionfilter 钩入a!is_admin 测试和ACF没有什么可抱怨的。

结束

相关推荐

L10n.js在WordPress 3.1中做什么?那我怎么移除它呢?

我刚刚在测试服务器上安装了WP 3.1 Beta 2。我注意到它带有一个新的l10n.js 自动插入到标头中的文件。我做了一些挖掘,这与本地化有关。我猜很多人不使用这个,所以我想知道如何删除它?如果重要的是不要删除它,请让我也知道。