
本文介绍如何在 woocommerce 订单确认邮件中,基于用户当前语言环境(locale)自动附加对应语言的静态 pdf 文件,实现多语言附件精准匹配。
在 WooCommerce 中,为订单邮件(如 new_order 或 customer_processing_order)添加 PDF 附件是常见需求;而当站点支持多语言(例如使用 WPML、Polylang 或原生语言切换),仅固定路径无法满足本地化要求。此时需根据用户的界面语言动态选择附件文件。
核心思路是:通过 get_locale() 获取当前请求的语言标识符(如 cs_CZ、en_US、de_DE),再结合条件判断加载对应语言的 PDF 文件路径。注意:get_locale() 返回的是 WordPress 站点当前加载的语言代码(由 WPLANG 或语言插件设置),而非浏览器语言或用户个人偏好——这正适合邮件场景,因为 WooCommerce 邮件默认按订单生成时的站点语言环境渲染(包括模板和文本),附件语言也应与之保持一致。
以下是优化后的完整代码示例(兼容主流多语言插件,支持可扩展):
add_filter( 'woocommerce_email_attachments', 'wphelp_dynamic_pdf_attachment', 10, 4 );
function wphelp_dynamic_pdf_attachment( $attachments, $email_id, $order, $email ) {
// 指定需添加附件的邮件类型
$target_emails = array( 'new_order', 'customer_processing_order', 'customer_completed_order' );
if ( ! in_array( $email_id, $target_emails ) ) {
return $attachments;
}
$upload_dir = wp_upload_dir();
$locale = get_locale(); // 获取当前语言环境,如 'sk_SK', 'en_GB', 'de_DE'
// 定义语言与 PDF 路径映射(建议存放在 uploads 目录下,确保路径稳定)
$pdf_map = array(
'sk_SK' => '/2021/12/FORMULAR_NA_ODSTUPENIE_OD_ZMLUVY-1.pdf',
'en_GB' => '/2021/12/cancellation-form-en.pdf',
'de_DE' => '/2021/12/widerrufsformular-de.pdf',
'fr_FR' => '/2021/12/formulaire-de-retractation-fr.pdf',
);
// 默认 fallback(如无匹配语言,使用英文版)
$pdf_path = $pdf_map['en_GB'];
if ( isset( $pdf_map[ $locale ] ) ) {
$pdf_path = $pdf_map[ $locale ];
}
$full_path = $upload_dir['basedir'] . $pdf_path;
// 安全检查:确保文件存在且可读,避免邮件发送失败
if ( file_exists( $full_path ) && is_readable( $full_path ) ) {
$attachments[] = $full_path;
} else {
error_log( "WooCommerce PDF attachment missing or unreadable: {$full_path}" );
}
return $attachments;
}✅ 关键注意事项:
- ✅ 路径规范:所有 PDF 应统一上传至 wp-content/uploads/ 下(如示例中的 /2021/12/ 子目录),避免硬编码绝对服务器路径;wp_upload_dir() 确保跨环境兼容。
- ✅ 语言代码准确性:请通过 var_dump(get_locale()); 在对应页面调试确认实际返回值(例如 Polylang 可能返回 en,需配合 pll_current_language('locale') 替代;WPML 则通常返回标准 xx_XX 格式)。
- ✅ 错误防御:务必校验文件是否存在(file_exists)与可读性(is_readable),否则附件失败将导致整封邮件发送中断。
- ✅ 性能与缓存:该钩子在邮件构建时执行,无显著性能开销;无需额外缓存处理。
? 进阶提示:若需按用户个人语言(而非下单时站点语言)适配,可尝试从 $order->get_customer_id() 获取用户元数据(如 wp_usermeta 中的语言偏好),但需确保该字段已由主题或插件可靠写入——多数场景推荐以 get_locale() 为准,因其与邮件模板语言严格同步,语义最一致。
通过以上方案,您即可实现真正本地化的订单附件体验,提升多语言客户的信任感与合规性(如 GDPR 退订表单的母语支持)。










