2017-06-16 102 views
2

前一段时间,我发布了一个有关问题的问题,我需要发送不同的电子邮件,具体取决于订购的产品属于哪个存储(自定义字段)。 因此,如果只订购了属于Storage1的产品,则只应发送Email1。如果订购了一个属于Storage1的产品和一个属于Storage2的产品,则将发送包含product1的电子邮件1和包含产品2的电子邮件2。 对原来的问题的链接:Custom order emails depending on product meta dataWoocommerce - 自定义电子邮件类创建重复的电子邮件

这一切现在,但由于某种原因,我得到双重电子邮件。如果我从Storage1订购一件产品,我会将两封电子邮件1发送到我的收件箱中...如果我订购5,10或20种产品,我只收到一封额外的电子邮件并不重要,但这足够了。

所以我想看看是否有人经历过同样的事情,他们是如何修复它的?

为了清楚起见,我会再次在此处添加代码。

我复制了class-wc-new-order并创建了两个与原始完全相同的新类。我分别将ID和类名更改为存储1和存储2。

我通过执行以下操作加载类:

//Add our custom class to WC email classes 
add_filter('woocommerce_email_classes', [ $this, 'custom_order_email_add_email_classes' ], 10, 1); 

function custom_order_email_add_email_classes($email_classes) { 

    require(CUSTOM_ORDER_EMAIL_PLUGIN_DIR . 'classes/class-wc-email-new-order-storage1.php'); 
    require(CUSTOM_ORDER_EMAIL_PLUGIN_DIR . 'classes/class-wc-email-new-order-storage2.php'); 

    $email_classes['WC_Email_New_Order_Storage1'] = new WC_Email_New_Order_Storage1(); 
    $email_classes['WC_Email_New_Order_Storage2'] = new WC_Email_New_Order_Storage2(); 

    return $email_classes; 
} 

然后我在两个电子邮件类编辑the trigger() - 功能。 请注意,除了测试之外,我没有更改任何触发器操作,但每次都收到两封电子邮件,无论触发器操作是否处于活动状态。如果我停用所有触发器操作,我当然不会收到任何电子邮件。

public function trigger($order_id, $order = false) { 

    $trigger = false; 

    if ($order_id && ! is_a($order, 'WC_Order')) { 
     $order = wc_get_order($order_id); 
    } 

    if (is_a($order, 'WC_Order')) { 
     $this->object     = $order; 
     $this->find['order-date']  = '{order_date}'; 
     $this->find['order-number'] = '{order_number}'; 
     $this->replace['order-date'] = wc_format_datetime($this->object->get_date_created()); 
     $this->replace['order-number'] = $this->object->get_order_number(); 

     $items = $order->get_items(); 

     foreach ($items as $item_id => $item) { 

      $product = $item->get_product(); 

      if ($product->get_meta('_product_storage') == 'storage2') {//storage1 in the other email class 
       $trigger = true; 
      } 
     } 
    } 

    if (! $this->is_enabled() || ! $this->get_recipient()) { 
     return; 
    } 

    if($trigger === true) { 
     $this->send($this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments()); 
    } 
    else { 
     return; 
    } 
} 

为了从Email1中筛选出Storage2产品,我不得不覆盖email-order-details.php。此代码仅在模板中的<tbody>下方输入,我从order-email-items.php获取用于默认显示产品的代码。

编辑电子邮件阶details.php:

if ($email->id == 'new_order_storage1') { 

     $items = $order->get_items(); 
     foreach($items as $item_id => $item) { 

      $product = $item->get_product(); 

      if ($product->get_meta('_product_storage') == 'storage1') { 
     ?> 
       <tr class="<?php echo esc_attr(apply_filters('woocommerce_order_item_class', 'order_item', $item, $order)); ?>"> 
        <td class="td" style="text-align:<?php echo $text_align; ?>; vertical-align:middle; border: 1px solid #eee; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap:break-word;"><?php 

         // Show title/image etc 
         if ($show_image) { 
          echo apply_filters('woocommerce_order_item_thumbnail', '<div style="margin-bottom: 5px"><img src="' . ($product->get_image_id() ? current(wp_get_attachment_image_src($product->get_image_id(), 'thumbnail')) : wc_placeholder_img_src()) . '" alt="' . esc_attr__('Product image', 'woocommerce') . '" height="' . esc_attr($image_size[1]) . '" width="' . esc_attr($image_size[0]) . '" style="vertical-align:middle; margin-' . (is_rtl() ? 'left' : 'right') . ': 10px;" /></div>', $item); 
         } 

         // Product name 
         echo apply_filters('woocommerce_order_item_name', $item->get_name(), $item, false); 

         // SKU 
         if ($show_sku && is_object($product) && $product->get_sku()) { 
          echo ' (#' . $product->get_sku() . ')'; 
         } 

         // allow other plugins to add additional product information here 
         do_action('woocommerce_order_item_meta_start', $item_id, $item, $order, $plain_text); 

         wc_display_item_meta($item); 

         if ($show_download_links) { 
          wc_display_item_downloads($item); 
         } 

         // allow other plugins to add additional product information here 
         do_action('woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text); 

        ?></td> 
        <td class="td" style="text-align:<?php echo $text_align; ?>; vertical-align:middle; border: 1px solid #eee; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"><?php echo apply_filters('woocommerce_email_order_item_quantity', $item->get_quantity(), $item); ?></td> 
        <td class="td" style="text-align:<?php echo $text_align; ?>; vertical-align:middle; border: 1px solid #eee; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"><?php echo $order->get_formatted_line_subtotal($item); ?></td> 
       </tr> 
      <?php 
      } 
     } 
    } 
    else if ($email->id == 'new_order_storage2') { 
     $items = $order->get_items(); 
     foreach($items as $item_id => $item) { 

      $product = $item->get_product(); 

      if ($product->get_meta('_product_storage') == 'storage2') { 
     ?> 
       <tr class="<?php echo esc_attr(apply_filters('woocommerce_order_item_class', 'order_item', $item, $order)); ?>"> 
        <td class="td" style="text-align:<?php echo $text_align; ?>; vertical-align:middle; border: 1px solid #eee; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap:break-word;"><?php 

         // Show title/image etc 
         if ($show_image) { 
          echo apply_filters('woocommerce_order_item_thumbnail', '<div style="margin-bottom: 5px"><img src="' . ($product->get_image_id() ? current(wp_get_attachment_image_src($product->get_image_id(), 'thumbnail')) : wc_placeholder_img_src()) . '" alt="' . esc_attr__('Product image', 'woocommerce') . '" height="' . esc_attr($image_size[1]) . '" width="' . esc_attr($image_size[0]) . '" style="vertical-align:middle; margin-' . (is_rtl() ? 'left' : 'right') . ': 10px;" /></div>', $item); 
         } 

         // Product name 
         echo apply_filters('woocommerce_order_item_name', $item->get_name(), $item, false); 

         // SKU 
         if ($show_sku && is_object($product) && $product->get_sku()) { 
          echo ' (#' . $product->get_sku() . ')'; 
         } 

         // allow other plugins to add additional product information here 
         do_action('woocommerce_order_item_meta_start', $item_id, $item, $order, $plain_text); 

         wc_display_item_meta($item); 

         if ($show_download_links) { 
          wc_display_item_downloads($item); 
         } 

         // allow other plugins to add additional product information here 
         do_action('woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text); 

        ?></td> 
        <td class="td" style="text-align:<?php echo $text_align; ?>; vertical-align:middle; border: 1px solid #eee; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"><?php echo apply_filters('woocommerce_email_order_item_quantity', $item->get_quantity(), $item); ?></td> 
        <td class="td" style="text-align:<?php echo $text_align; ?>; vertical-align:middle; border: 1px solid #eee; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"><?php echo $order->get_formatted_line_subtotal($item); ?></td> 
       </tr> 
      <?php 
      } 
     } 
    } 
    else { 
    echo wc_get_email_order_items($order, array(
     'show_sku'  => $sent_to_admin, 
     'show_image' => false, 
     'image_size' => array(32, 32), 
     'plain_text' => $plain_text, 
     'sent_to_admin' => $sent_to_admin, 
    )); 
    } 

,如果您有任何的任何答案或建议,也如果有任何更好的方法来做到这一点,我所有的耳朵,我会非常感激。

问候,

回答

2

在SkyVerge的教程中,我使用加载的邮件类错误的(旧)的方式。 更新和工作代码,学分,以@bhamrick @ wordpress.org:

add_filter('woocommerce_email_classes', [ $this, 'custom_order_email_add_email_classes' ], 10, 1); 

    function custom_order_email_add_email_classes($email_classes) { 

     $email_classes['WC_Email_New_Order_Storage1'] = include(CUSTOM_ORDER_EMAIL_PLUGIN_DIR . 'classes/class-wc-email-new-order-storage1.php'); 
     $email_classes['WC_Email_New_Order_Storage2'] = include(CUSTOM_ORDER_EMAIL_PLUGIN_DIR . 'classes/class-wc-email-new-order-storage2.php'); 

    return $email_classes; 
} 
1

我遵循同样的SkyVerge教程,并发现我重复的电子邮件是由线造成了“新WC_Emails();”在教程中。

WC_Emails类不应直接实例化,而应该由静态函数“instance()”调用。

在写这篇文章时,定制电子邮件管理器。PHP文件教程定义了如下功能:

public function custom_trigger_email_action($order_id, $posted) { 
    // add an action for our email trigger if the order id is valid 
    if (isset($order_id) && 0 != $order_id) { 
     $order = new WC_order($order_id); 
     new WC_Emails(); 
     do_action('custom_pending_email_notification', $order_id); 
    } 
} 

这看起来应该是这样,而不是:

public function custom_trigger_email_action($order_id, $posted) { 
    // add an action for our email trigger if the order id is valid 
    if (isset($order_id) && 0 != $order_id) { 
     $order = new WC_order($order_id); 
     WC_Emails::instance(); 
     do_action('custom_pending_email_notification', $order_id); 
    } 
} 

如果创建WC_Emails的新实例,然后将复制的电子邮件。

+0

你好! 是的,我遇到了和你一样的问题,并且将其作为我的答案进行了包括,问题就消失了,从那时起我一直没有任何问题。甚至还添加了一些电子邮件课程。 :) – Magnetize