
本文旨在解决WooCommerce自定义邮件中PHP `echo`语句无法正确输出变量的问题。通过分析常见原因,并结合示例代码,提供详细的排查步骤和有效的解决方案,帮助开发者在自定义邮件中正确显示订单数据,如客户姓名等。
在WooCommerce自定义邮件中,直接使用输出变量有时会失效,导致邮件内容显示为空。这通常与变量作用域、邮件内容解析方式以及PHP配置等因素有关。以下提供一些排查思路和解决方案:
1. 变量作用域检查
确保变量在echo语句执行时处于有效的作用域内。在提供的代码中,$menomeno变量是在if ( empty($product_ids) && $product_id == 2805 )代码块内定义的。如果邮件模板被渲染时,该条件不满足,$menomeno变量将未定义,导致echo输出空字符串。
解决方案:
立即学习“PHP免费学习笔记(深入)”;
需要创建、读取、编辑或处理 Word 文档(.docx / .dotx)时使用。触发词:'Word'、'word 文档'、'.docx'、'生成报告'、'制作合同/简历/方案/说明书'、'提取 word 内容'、'在文档里查找替换'、'给文档加页眉页脚/目录/表格'。也用于把任意内容排版成一份正式的 Word 文件。不要用它处理 PDF、Excel 或无关编程任务。中文创作场景尤其适合:小说大纲稿、投稿文档、合同、简历、工作总结。
- 确保 $menomeno 在使用前被定义,即使在条件不满足的情况下也应该设置一个默认值,例如空字符串。
- 检查 $product_ids 和 $product_id 的值,确认它们是否符合预期,导致条件判断失败。
修改后的代码示例:
function send_a_custom_email( $order_id, $order ) {
global $woocommerce;
$order = new WC_Order( $order_id );
$mailer = $woocommerce->mailer();
$product_ids = array( ); // Initializing
$customer_email = $order->get_billing_email();
$customer_name = $order->get_billing_first_name();
foreach ( $order->get_items() as $item ) {
$meta_data = $item->get_meta('meno'); // Zisti ake je meno
$venovanie = $item->get_meta('venovanie'); // // Zisti ake je venovanie
$product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
if( empty($meta_data) ) {
$product_ids[] = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
}
}
$menomeno = ''; // 初始化变量
if ( empty($product_ids) && $product_id == 2805 ) {
$recipient = $customer_email; // Set email recipient
$menomeno = $customer_name;
$subject = sprintf( __('Order #%d: Has missing item meta data'), $order_id );
$content = '<table border="0" cellpadding="0" cellspacing="0" class="text_block" role="presentation" style="mso-table-lspace: 0pt; mso-table-rspace: 0pt; word-break: break-word;" width="100%">
<tr>
<td style="padding-bottom:30px;padding-left:30px;padding-right:30px;padding-top:15px;">
<div style="font-family: sans-serif">
<div style="font-size: 14px; mso-line-height-alt: 25.2px; color: #ffffff; line-height: 1.8; font-family: Montserrat, Trebuchet MS, Lucida Grande, Lucida Sans Unicode, Lucida Sans, Tahoma, sans-serif;">
<p style="margin: 0; font-size: 16px; text-align: center;"><strong>S láskou <?php echo $menomeno; ?>
</strong></p>
</div>
</div>
</td>
</tr>
</table>';
//wp_mail( $recipient, $subject, $content ); // Send email
$mailer->send( $order->billing_email, sprintf( __( 'DTerapia s láskou' ), $order->get_order_number() ), $content );
}
}2. 字符串拼接问题
直接在HTML字符串中使用可能无法被正确解析。
解决方案:
立即学习“PHP免费学习笔记(深入)”;
使用字符串拼接的方式构建HTML内容。
修改后的代码示例:
function send_a_custom_email( $order_id, $order ) {
global $woocommerce;
$order = new WC_Order( $order_id );
$mailer = $woocommerce->mailer();
$product_ids = array( ); // Initializing
$customer_email = $order->get_billing_email();
$customer_name = $order->get_billing_first_name();
foreach ( $order->get_items() as $item ) {
$meta_data = $item->get_meta('meno'); // Zisti ake je meno
$venovanie = $item->get_meta('venovanie'); // // Zisti ake je venovanie
$product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
if( empty($meta_data) ) {
$product_ids[] = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
}
}
if ( empty($product_ids) && $product_id == 2805 ) {
$recipient = $customer_email; // Set email recipient
$menomeno = $customer_name;
$subject = sprintf( __('Order #%d: Has missing item meta data'), $order_id );
$content = '<table border="0" cellpadding="0" cellspacing="0" class="text_block" role="presentation" style="mso-table-lspace: 0pt; mso-table-rspace: 0pt; word-break: break-word;" width="100%">
<tr>
<td style="padding-bottom:30px;padding-left:30px;padding-right:30px;padding-top:15px;">
<div style="font-family: sans-serif">
<div style="font-size: 14px; mso-line-height-alt: 25.2px; color: #ffffff; line-height: 1.8; font-family: Montserrat, Trebuchet MS, Lucida Grande, Lucida Sans Unicode, Lucida Sans, Tahoma, sans-serif;">
<p style="margin: 0; font-size: 16px; text-align: center;"><strong>S láskou ' . $menomeno . '
</strong></p>
</div>
</div>
</td>
</tr>
</table>';
//wp_mail( $recipient, $subject, $content ); // Send email
$mailer->send( $order->billing_email, sprintf( __( 'DTerapia s láskou' ), $order->get_order_number() ), $content );
}
}3. 使用sprintf格式化字符串
sprintf函数可以更安全、更方便地将变量插入字符串中。
解决方案:
立即学习“PHP免费学习笔记(深入)”;
$content = sprintf(
'<table border="0" cellpadding="0" cellspacing="0" class="text_block" role="presentation" style="mso-table-lspace: 0pt; mso-table-rspace: 0pt; word-break: break-word;" width="100%">
<tr>
<td style="padding-bottom:30px;padding-left:30px;padding-right:30px;padding-top:15px;">
<div style="font-family: sans-serif">
<div style="font-size: 14px; mso-line-height-alt: 25.2px; color: #ffffff; line-height: 1.8; font-family: Montserrat, Trebuchet MS, Lucida Grande, Lucida Sans Unicode, Lucida Sans, Tahoma, sans-serif;">
<p style="margin: 0; font-size: 16px; text-align: center;"><strong>S láskou %s</strong></p>
</div>
</div>
</td>
</tr>
</table>',
$menomeno
);4. 调试与日志
在关键位置添加error_log()语句,将变量的值输出到服务器的错误日志中,方便调试。
error_log('customer_name: ' . $customer_name);
error_log('menomeno: ' . $menomeno);然后检查服务器的错误日志文件(通常在wp-content/debug.log或服务器的日志目录中)以查看变量的值。
5. WooCommerce邮件模板覆盖
如果问题仍然存在,可以考虑覆盖WooCommerce默认的邮件模板,并使用WooCommerce提供的钩子函数来修改邮件内容。 这种方法更加灵活,但需要对WooCommerce的模板结构有更深入的了解。
总结
在WooCommerce自定义邮件中遇到PHP echo失效问题,需要仔细检查变量的作用域、字符串拼接方式,并使用适当的调试方法。 通过以上步骤,可以有效地定位问题并找到解决方案,确保自定义邮件能够正确显示所需的信息。


















