WooCommerce自定义优惠券PDF英文导出为空问题求助
WooCommerce优惠券PDF导出英文环境为空问题解决方案
问题核心诊断
结合你的描述(FPDI对象完整但PDF输出为空)和TranslatePress的特性,问题根源集中在以下几点:
- TranslatePress会在
template_redirect钩子后插入额外HTML/字符,污染PDF输出流 - 输出缓冲区未清理,残留内容破坏PDF文件结构
- 变量作用域隐患:
$reference仅在has_term判断内定义,极端场景下会导致输出时未定义
具体修复方案
1. 适配TranslatePress的语言检测逻辑
WordPress原生get_locale()无法正确获取TranslatePress切换的语言,改用其官方函数:
function generate_pdf($order_id, $item_id) { // 替换原$language = get_locale(); $current_lang = trp_get_current_language(); // 根据你的TranslatePress语言代码调整(比如'en'对应'en_GB') $language = $current_lang === 'en' ? 'en_GB' : 'fr_FR'; // ... 剩余代码保持不变 }
2. 清理输出缓冲区并设置正确HTTP头
在PDF生成前清空缓冲区,避免残留内容干扰,并设置标准PDF响应头:
function generate_pdf($order_id, $item_id) { // 强制清理所有输出缓冲区 ob_clean(); ob_start(); // 设置PDF专属响应头 header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="voucher_' . uniqid() . '.pdf"'); header('Cache-Control: private, no-store, no-cache, must-revalidate'); $order = wc_get_order($order_id); $current_user = wp_get_current_user(); $current_lang = trp_get_current_language(); $language = $current_lang === 'en' ? 'en_GB' : 'fr_FR'; // ... 剩余代码保持不变 }
3. 修复变量作用域问题
将$reference变量提前初始化,避免未定义警告破坏输出:
function generate_pdf($order_id, $item_id) { ob_clean(); ob_start(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="voucher_' . uniqid() . '.pdf"'); header('Cache-Control: private, no-store, no-cache, must-revalidate'); $order = wc_get_order($order_id); $current_user = wp_get_current_user(); $current_lang = trp_get_current_language(); $language = $current_lang === 'en' ? 'en_GB' : 'fr_FR'; $reference = ''; // 提前初始化变量 // ... 后续代码中,$reference赋值逻辑保持不变
4. 临时禁用TranslatePress输出钩子
在PDF生成前移除TranslatePress的前端输出钩子,避免其插入额外内容:
function process_voucher_download() { if (isset($_POST['action']) && $_POST['action'] === 'download_voucher' && isset($_POST['order_id']) && isset($_POST['item_id'])) { $order_id = absint($_POST['order_id']); $item_id = absint($_POST['item_id']); $user_id = get_current_user_id(); $order = wc_get_order($order_id); if ($order && $order->get_user_id() === $user_id) { // 临时移除TranslatePress的输出钩子 remove_all_actions('trp_before_frontend_output'); remove_all_actions('trp_after_frontend_output'); generate_pdf($order_id, $item_id); exit; } else { wp_redirect(home_url('/404')); exit; } } }
5. 验证模板文件状态
确认template_voucher_en.pdf存在于插件目录中,且文件权限为可读(推荐0644)。
测试步骤
- 切换到英文环境,进入用户仪表盘的优惠券板块
- 点击下载按钮,检查PDF是否正常生成并包含内容
- 查看服务器错误日志,确认无PHP警告/错误
内容的提问来源于stack exchange,提问作者Curvata
相关产品推荐
相关产品推荐

