WordPress本地化JS时HTML实体转义问题求助
解决WordPress wp_localize_script自动解码HTML实体的问题
我之前也踩过这个一模一样的坑!wp_localize_script内部默认会对本地化数据执行html_entity_decode处理,直接把你想保留的&转成了&,完全打乱了预期格式。下面给你两个靠谱的解决方案:
方案1:用wp_add_inline_script替代wp_localize_script
这是最直接稳妥的方式,因为wp_add_inline_script不会自动解码HTML实体,能100%保留你需要的原始格式。代码示例:
// 先确保你的脚本已经注册并加载 wp_enqueue_script( 'main-js', get_template_directory_uri() . '/js/main.js', array(), '1.0', true ); // 准备本地化数据,保留原有的HTML实体 $main_localize_data = array( 'homepage_typed_text' => __( 'Apples & Bananas', 'ewk' ) ); // 直接输出JS变量,绕过wp_localize_script的解码逻辑 wp_add_inline_script( 'main-js', 'var main_object = ' . wp_json_encode( $main_localize_data ) . ';', 'before' );
wp_json_encode会自动处理JS中的特殊字符,确保输出内容格式正确且安全,同时不会改动你原本的HTML实体结构。
方案2:通过钩子恢复被解码的实体
如果你一定要沿用wp_localize_script,可以借助wp_localize_script过滤器,在解码完成后把实体重新转回去。代码示例:
add_filter( 'wp_localize_script', function( $l10n, $handle, $data ) { // 只针对你的目标脚本处理,避免影响其他本地化内容 if ( $handle !== 'main-js' ) { return $l10n; } // 将解码后的文本重新转义,还原原有的HTML实体格式 if ( isset( $l10n['homepage_typed_text'] ) ) { $l10n['homepage_typed_text'] = htmlentities( $l10n['homepage_typed_text'], ENT_QUOTES, 'UTF-8' ); } return $l10n; }, 10, 3 ); // 正常调用wp_localize_script即可 wp_localize_script( 'main-js', 'main_object', array( 'homepage_typed_text' => __( 'Apples & Bananas', 'ewk' ) ) );
这个方法的逻辑是:先让wp_localize_script完成默认解码,再通过过滤器把文本重新转义,恢复你需要的&格式。不过要注意,htmlentities会转义所有符合条件的字符,如果你有其他不需要转义的内容,可能需要做更精准的匹配处理。
内容的提问来源于stack exchange,提问作者Mr. Jo
相关产品推荐
相关产品推荐

