
WordPress 的翻译函数 __() 默认会转义 HTML,但通过 sprintf() 结合未转义的 HTML 字符串,可在提示消息中安全嵌入超链接或按钮。
wordpress 的翻译函数 `__()` 默认会转义 html,但通过 `sprintf()` 结合未转义的 html 字符串,可在提示消息中安全嵌入超链接或按钮。
在 WordPress(尤其是 WooCommerce)插件或主题开发中,常需动态修改系统提示消息,例如订单校验失败时显示自定义提示。默认情况下,__() 函数仅返回纯文本,直接写入 标签会被原样输出或被过滤,无法渲染为可点击链接。
正确做法是:将 HTML 片段与翻译字符串分离处理,用 sprintf() 动态注入。这样既保持多语言兼容性(各部分均可独立翻译),又确保 HTML 正确解析。示例如下:
public function change_message( $message ) {
$contact_text = __( 'contact us', 'your-text-domain' );
$link = '<a href="https://yoursite.com/contact" target="_blank" rel="noopener">' . esc_url( $contact_text ) . '</a>';
$format = __( 'Your order is too heavy. Please %s to get individual shipping cost.', 'your-text-domain' );
return sprintf( $format, $link );
}
✅ 关键要点说明:
- 使用 esc_url() 包裹链接文本(非 URL)虽非强制,但推荐对 href 属性值单独调用 esc_url() 以增强安全性(如:esc_url( 'https://yoursite.com/contact' ));
- 添加 target="_blank" 和 rel="noopener" 是现代外链最佳实践,防止安全漏洞(如 opener 风险);
- 'your-text-domain' 必须与主题/插件的文本域一致,确保翻译生效;
- 避免在 __() 内直接写 HTML(如 __('Please contact us')),因 _e() 或 __() 默认启用 wp_kses_data() 过滤,HTML 将被剥离。
⚠️ 注意事项:
若该消息最终输出到前端 JavaScript 上下文(如 via wp_add_inline_script),或经由 wp_kses_post() 等富文本过滤器二次处理,需额外确认 HTML 白名单是否包含 标签及对应属性;建议在 add_filter() 注册此函数时,明确其作用位置(如 'woocommerce_checkout_error'),并测试实际渲染效果。
综上,通过结构化拼接 + 翻译分离策略,你既能实现语义清晰、本地化友好的交互式提示,又能兼顾安全性与可维护性。











