前一段时间我发布了一个关于问题的问题,我需要发送不同的电子邮件,具体取决于订购产品所属的存储空间(自定义字段)。 因此,如果只订购属于Storage1的产品,则只应发送Email1。如果订购了属于Storage1的一个产品和属于Storage2的一个产品,则将发送包含product1的email1,并且email2将包含product2。 链接到原始问题:Custom order emails depending on product meta data
现在这一切都有效,但出于某种原因,我收到了双重电子邮件。如果我从Storage1订购一件产品,我会收到两封Email1发送到我的收件箱......如果我订购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
获取了默认情况下用于显示产品的代码。
已编辑的email-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,
) );
}
如果你们中的任何人有任何答案或建议,我会非常感激,如果还有更好的方法可以做到这一点我很满意。
此致
答案 0 :(得分:3)
我使用的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 :(得分:2)
我按照相同的SkyVerge教程发现我的重复电子邮件是由“new WC_Emails();”行引起的。在教程中。
WC_Emails类不应该直接实例化,而应该由静态函数“instance()”调用。
在撰写本文时,教程中的 custom-email-manager.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的新实例,那么它将复制电子邮件。