Woocommerce每种电子邮件类型的不同标头

时间:2014-12-10 11:36:30

标签: php wordpress email woocommerce hook

我使用Woocommerce,我需要根据其类型更改电子邮件标题,以便" customer-new-account.php"," customer-processing-order.php", "管理新-order.php" (依此类推)......他们必须有不同的标题。

我刚刚复制了woocommerce"电子邮件"我的子模板中的文件夹,现在我需要知道如何更改代码。

任何帮助都表示赞赏。 ;-) 提前谢谢。

4 个答案:

答案 0 :(得分:1)

正如评论中所提到的,我认为没有办法在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' );

然后直接调用电子邮件模板中的特定标题模板。例如,在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模板调用了新标头。

答案 1 :(得分: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 ?>

答案 2 :(得分:0)

我可以在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;
};

答案 3 :(得分:0)

我在插件https://wordpress.org/plugins/wc-multiple-email-recipients/中做了类似的事情。

使用woocommerce_email_headers时,您可以传递IDHeader作为参数。

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;
}