2017-06-16 4 views
2

Vorhin habe ich eine Frage zu einem Problem, ich musste verschiedene E-Mails senden je nachdem, welchen Speicher (benutzerdefinierte Feld) die bestellten Produkte gehört. Wenn also nur ein zu Storage1 gehörendes Produkt bestellt wurde, sollte nur Email1 gesendet werden. Wenn ein Produkt, das zu Storage1 gehört, und ein Produkt, das zu Storage2 gehört, bestellt wird, wird email1 gesendet, das Produkt1 enthält, und email2 enthält Produkt2. Link zur ursprünglichen Frage: Custom order emails depending on product meta dataWoocommerce - benutzerdefinierte E-Mail-Klassen erstellt doppelte E-Mails

Das alles funktioniert jetzt, aber aus irgendeinem Grund bekomme ich doppelte E-Mails. Wenn ich ein Produkt von Storage1 bestelle, bekomme ich TWO Email1 in meinen Posteingang ... Egal ob ich 5, 10 oder 20 Produkte bestelle, ich bekomme nur EINE zusätzliche Email, aber das reicht.

Also würde ich gerne sehen, ob jemand die gleiche Sache erfahren hat, und wie sie es behoben haben?

Ich werde den Code hier zur Verdeutlichung wieder hinzufügen.

Ich kopierte die class-wc-new-order und erstellte zwei neue Klassen genau das gleiche wie das Original. Ich habe ID- und Klassennamen in Speicher 1 bzw. Speicher 2 geändert.

lade ich die Klassen durch folgende Maßnahmen:

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

ich bearbeitet dann the trigger() -function in beiden E-Mail-Klassen. Beachten Sie, dass ich mit den Trigger-Aktionen nichts geändert habe, außer Tests, aber ich erhalte jedes Mal doppelte E-Mails, unabhängig davon, welche Trigger-Aktionen aktiv sind. Wenn ich alle Trigger-Aktionen deaktiviere, bekomme ich natürlich keine E-Mails.

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

Um Storage2 Produkte von Email1 zum Ausfiltern hatte ich email-order-details.php außer Kraft zu setzen. Dieser Code wird in der Vorlage knapp unter <tbody> eingegeben, und ich nahm den Code aus der order-email-items.php, die verwendet wird, um die Produkte standardmäßig anzuzeigen.

Edited E-Mail-order-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, 
    )); 
    } 

Ich wäre sehr dankbar, wenn jemand von euch keine Antworten oder Anregungen hat, auch wenn es keine besseren Möglichkeiten, dies zu tun, bin ich ganz Ohr.

Grüße,

Antwort

2

Das Tutorial bei SkyVerge verwendete ich die E-Mail-Klassen in die falsche (alt) Art und Weise geladen. aktualisiert und Arbeitscode, Kredite @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

ich die gleichen SkyVerge Tutorial gefolgt und stellte fest, dass meine doppelten E-Mails durch die Linie verursacht wurden „neue WC_Emails();“ im Tutorial.

Die WC_Emails-Klasse sollte nicht direkt instanziiert werden und stattdessen von der statischen Funktion "instance()" aufgerufen werden.

Zum Zeitpunkt dieses Schreibens der benutzerdefinierte E-Mail-Manager.php Datei im Tutorial hat die folgende Funktion definiert:

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

Diese ähnlichen stattdessen aussehen sollte:

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

Wenn Sie eine neue Instanz von WC_Emails erstellen, dann wird es die E-Mails kopieren.

+0

Hallo zusammen! Ja, ich hatte das gleiche Problem wie du, und änderte es, um wie meine Antwort aufgenommen zu werden, das Problem ging weg und ich hatte keine Probleme seitdem. Sogar ein paar E-Mail-Klassen hinzugefügt. :) – Magnetize

Verwandte Themen