Woocommerce 每种电子邮件类型的不同标头
Posted
技术标签:
【中文标题】Woocommerce 每种电子邮件类型的不同标头【英文标题】:Woocommerce different headers for each email types 【发布时间】:2015-02-08 14:10:32 【问题描述】:我使用 Woocommerce,我需要根据其类型更改电子邮件标题,以便“customer-new-account.php”、“customer-processing-order.php”、“admin-new-order.php”(等等)...它们必须有不同的标题。
我刚刚在我的子模板中复制了 woocommerce“电子邮件”文件夹,现在我需要知道如何进行代码更改。
感谢您的帮助。 ;-) 提前致谢。
【问题讨论】:
标题会有什么不同?您已经可以拥有不同的标题/短语。 我需要每种类型的不同图像和/或自定义文本信息。 向woocommerce_email_header
添加操作和/或更改标题模板非常容易。但是我没有看到一种方法可以在那里运行任何条件逻辑来识别正在发送的电子邮件类型。
【参考方案1】:
我认为最简洁的方法是取消绑定默认的电子邮件标题操作并进行自定义操作。如果您检查任何电子邮件模板,例如。
/woocommerce/templates/emails/admin-new-order.php
,您将在顶部看到他们已经将电子邮件对象作为第二个参数传递给操作,只是默认的 WC 挂钩不使用它:
<?php do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
所以在你的functions.php
中你可以这样做:
// replace default WC header action with a custom one
add_action( 'init', 'ml_replace_email_header_hook' );
function ml_replace_email_header_hook()
remove_action( 'woocommerce_email_header', array( WC()->mailer(), 'email_header' ) );
add_action( 'woocommerce_email_header', 'ml_woocommerce_email_header', 10, 2 );
// new function that will switch template based on email type
function ml_woocommerce_email_header( $email_heading, $email )
// var_dump($email); die; // see what variables you have, $email->id contains type
switch($email->id)
case 'new_order':
$template = 'emails/email-header-new-order.php';
break;
default:
$template = 'emails/email-header.php';
wc_get_template( $template, array( 'email_heading' => $email_heading ) );
如果你不需要切换整个文件,而只是想对现有标题进行一些小改动,你可以将电子邮件类型参数传递到模板中,只需将底部模板包含替换为:
wc_get_template( $template, array( 'email_heading' => $email_heading, 'email_id' => $email->id ) );
然后在您的标题模板中将其用作$email_id
,例如:
<?php if($email_id == 'new_order'): ?>
<h2>Your custom subheader to appear on New Order notifications only</h2>
<?php endif ?>
【讨论】:
刚刚实现了这个并且仍然有效。您是否有任何想法如何将其用于页脚模板? 对于遇到此问题的任何人:我从 email-footer.php 复制了内容并将其粘贴到新的页脚文件 (admin-new-order-footer.php') 中,并根据需要调整了内容。在 admin-new-order.php 我替换了 do_action( 'woocommerce_email_footer', $email );使用 wc_get_template('emails/admin-new-order-footer.php', array('email_id' => $email->id)) ;【参考方案2】:正如 cmets 中所述,我认为没有办法在 woocommerce_email_header
挂钩上使用条件逻辑。您可以使用 $header
变量,但它是一个很长的字符串,并且可能会发生变化。
首先,我们删除现有的电子邮件标题:
function so_27400044_remove_email_header()
remove_action( 'woocommerce_email_header', array( WC()->mailer(), 'email_header' ) );
add_action( 'init', 'so_27400044_remove_email_header' );
然后在你的邮件模板中直接调用具体的header模板。例如,在customer-invoice.php
模板中,我们可以调用wc_get_template()
来直接加载适当/特定的标头。假设您复制了 email-header.php
模板并将客户发票模板重命名为 email-header-invoice.php
,它可能如下所示:
<?php
/**
* Customer invoice email
*
* @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 2.2.0
*/
if ( ! defined( 'ABSPATH' ) )
exit; // Exit if accessed directly
?>
<?php do_action( 'woocommerce_email_header', $email_heading ); ?>
<?php wc_get_template( 'emails/email-header-invoice.php', array( 'email_heading' => $email_heading ) ) ; ?>
<?php if ( $order->has_status( 'pending' ) ) : ?>
我的本地设置不发送电子邮件,因此我使用以下方法对其进行了测试:
function kia_testing()
$order= wc_get_order( 381 );
ob_start();
wc_get_template( 'emails/customer-processing-order.php', array(
'order' => $order,
'email_heading' => 'some title',
'sent_to_admin' => false,
'plain_text' => true
) );
echo ob_get_clean();
add_action( 'woocommerce_before_single_product' , 'kia_testing' );
我看到修改后的customer-processing-order.php
模板正在调用新标头。
【讨论】:
哇,它看起来是一个很棒的解决方案。好的,我测试一下。请继续关注... ;-) 我们中的一个人可能应该测试它。 :) 祝你好运。 嗨@helgatheviking。它不起作用!我认为'导致“wc_get_template('emails/email-header-invoice.php'”的路径直接在 woocommerce 插件文件夹中设置焦点。我需要从子模板中获取自定义“email-header-invoice.php”,其中我之前创建了一个子文件夹“woocommerce/emails”。我该怎么做?请你解释一下如何覆盖电子邮件页脚? 我已将您的代码更改为: $email_heading), '/wp-content/主题/二十四/woocommerce/'); ?> 但它不起作用......我在哪里做错了?wc_get_template()
not 将焦点直接设置在插件文件夹上。 wc_locate_template()
被调用,然后又调用locate_template()
,它首先在主题的 woocommerce 文件夹中查找,然后才回退到 WooCommerce 核心模板。文件在theme/woocommerce/emails/email-header-invoice.php
?我不知道什么时候可以测试。【参考方案3】:
我可以在 email-header.php 文件中使用did_action
函数使用条件标头来检查触发了哪种类型的电子邮件。
您可以在其类构造函数上检查每封电子邮件的操作。每封电子邮件在 woocommerce/includes/emails/ 文件夹中都有自己的类文件(即 woocommerce/includes/emails/class-wc-email-customer-note.php )。在检查不是由add_action
触发的发票电子邮件和新用户电子邮件时,您可以检查$order
和$user_login
变量:
if ( 0 < did_action('woocommerce_order_status_pending_to_processing_notification') || 0 >= did_action('woocommerce_order_status_pending_to_on-hold_notification') )
// your specific code for this case here;
else if ( 0 < did_action('woocommerce_new_customer_note_notification') )
// your specific code for this case here;
else if ( $order )
echo '<p>aajast_woo_mail 7 = invoice + customer-invoice; </p>';
else if ( $user_login )
// your specific code for this case here;
;
【讨论】:
【参考方案4】:我在我的插件https://wordpress.org/plugins/wc-multiple-email-recipients/ 中做了类似的事情。
使用woocommerce_email_headers
时,您可以将ID
和Header
作为参数传递。
add_filter( 'woocommerce_email_headers', 'change_my_header_based_on_mail_type', 10, 2);
// Pass ID and header as arguments which is in the scope of the filter.
// The ID allows us to identify the mail. Header allows us to overwrite the header.
function change_my_header_based_on_mail_type( $headers = '', $id = '')
// WooCommerce core. If the ID for notification is "New Order"
if ($id == 'new_order')
//append the following to the header
$headers .= 'My custom output ' . "\r\n";
//break;
// If the ID for notification is "Cancelled Order"
if ($id == 'cancelled_order')
//append the following to the header
$headers .= 'My custom output ' . "\r\n";
//break;
return $headers;
【讨论】:
以上是关于Woocommerce 每种电子邮件类型的不同标头的主要内容,如果未能解决你的问题,请参考以下文章
WooCommerce - 从 functions.php 文件发送新订单/客户发票电子邮件
根据 Woocommerce 中的用户角色自定义客户新帐户邮件
基于 Woocommerce 中的运输方式的不同电子邮件标题
基于 WooCommerce 电子邮件通知中销售的产品的不同收件人