You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。

测试步骤

  1. 切换到英文环境,进入用户仪表盘的优惠券板块
  2. 点击下载按钮,检查PDF是否正常生成并包含内容
  3. 查看服务器错误日志,确认无PHP警告/错误

内容的提问来源于stack exchange,提问作者Curvata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:02:02