解决方案基本上来自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
在前端,所以我把action
和filter
钩入a!is_admin
测试和ACF没有什么可抱怨的。