WordPress中如何将新订单邮件转PDF并添加附件,解决样式及图片问题
WordPress/WooCommerce 订单邮件转PDF问题解决方案
问题概述
使用WordPress+WooCommerce实现「New Order」邮件转PDF附件功能时,通过Dompdf库遇到以下问题:
- 图片缺失,报错「Image not found or type unknown」
- 邮件中少量内容单独占满PDF一页
- 自定义短代码获取的订单信息消失
- 文本移位,表格内文本移出导致表格为空
针对性修复方案
1. 解决图片缺失问题
Dompdf对图片路径要求严格,需使用绝对路径或完整URL。原代码的setBasePath设置不完整,需替换为WordPress上传目录的绝对路径,同时批量替换邮件内容中的相对图片路径:
// 获取WordPress上传目录的绝对路径与URL $upload_dir = wp_upload_dir(); $base_path = $upload_dir['basedir'] . '/'; $base_url = $upload_dir['baseurl'] . '/'; // 将邮件内的相对图片路径替换为完整URL $body = str_replace('src="/wp-content/uploads/', 'src="' . $base_url, $body);
2. 修复样式与内容完整性问题
- 启用远程资源加载,确保外部图片、字体可正常获取
- 设置标准纸张尺寸与方向,避免分页异常
- 提前解析短代码,确保订单信息被渲染
- 添加临时文件清理逻辑,避免服务器冗余文件
完整修改代码
use Dompdf\Dompdf; use Dompdf\Options; function htmlToPdf($html, $outputFile) { // 初始化Dompdf配置 $options = new Options(); $options->set('isRemoteEnabled', true); // 允许加载远程资源 $options->set('defaultPaperSize', 'A4'); // 设置默认纸张尺寸 $options->set('defaultPaperOrientation', 'portrait'); // 设置纸张方向 $dompdf = new Dompdf($options); // 设置上传目录为基础路径 $upload_dir = wp_upload_dir(); $dompdf->setBasePath($upload_dir['basedir'] . '/'); $dompdf->loadHtml($html); $dompdf->render(); file_put_contents($outputFile, $dompdf->output()); } function ajouter_contenu_en_piece_jointe($phpmailer) { if (strpos($phpmailer->Subject, 'New Order') !== false) { $body = $phpmailer->Body; // 解析邮件内容中的短代码,确保订单信息完整渲染 $body = do_shortcode($body); // 替换相对图片路径为完整URL $upload_dir = wp_upload_dir(); $body = str_replace('src="/wp-content/uploads/', 'src="' . $upload_dir['baseurl'] . '/', $body); // 使用WordPress上传目录存储临时PDF,避免权限问题 $temp_path = wp_upload_dir()['path']; $filename = $temp_path . '/New_order_' . time() . '.pdf'; htmlToPdf($body, $filename); if (file_exists($filename)) { $phpmailer->AddAttachment($filename, 'New_order.pdf'); // 邮件发送后删除临时文件 add_action('wp_mail_succeeded', function() use ($filename) { file_exists($filename) && unlink($filename); }); } } } add_action('phpmailer_init', 'ajouter_contenu_en_piece_jointe');
额外注意事项
- 确保使用最新版Dompdf,旧版本存在样式解析bug
- 邮件模板优先使用内联CSS,Dompdf对外部CSS支持有限
- 检查服务器是否开启
allow_url_fopen或curl,确保远程资源可加载
内容的提问来源于stack exchange,提问作者Orare
相关产品推荐
相关产品推荐

