Mag*_*ize 1 wordpress woocommerce
我需要根据订购的产品发送两个不同的“ new_order”电子邮件。这种情况是产品存储在不同的位置,我需要发送一封仅包含存储1中产品的电子邮件,另一封包含存储2中产品的电子邮件。如果仅订购了存储1中的产品,完全不应该发送电子邮件2,反之亦然。
存储信息是每个产品上的自定义元字段。
我添加了一个自定义电子邮件类,它是的副本,class-wc-email-new-order但仅在需要时更改名称。
我一直在通过钩子和过滤器进行查找,但是我无法一路走下去。我也一直在考虑重写email-order-details.php文件并检查每个产品的meta字段,但是我不确定这是否是正确的方法。我想即使表中没有产品,也可以说仍会发送电子邮件。
我的问题是,使用不同的过滤器时,我不知道发送了哪些电子邮件,因此我也无法检查这种情况。
您是否只需创建两个包含模板和所有内容的新电子邮件,然后以这种方式发送,还是我在这里丢失了?
如果我可以澄清任何事情,请告诉我。
编辑:在与@helgatheviking交谈之后,我意识到我需要澄清关于存储1的电子邮件仅应在订单包含位于存储1的产品时发送,而有关存储2的电子邮件应仅在订单包含位于产品1的产品时发送2.如果订单中同时包含两种产品,则应发送两封电子邮件,但仅显示其各自的产品。
在仔细考虑并思考了@helgatheviking所说的内容之后,我提出了一个解决方案。
我复制了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;
}
Run Code Online (Sandbox Code Playgroud)
注意,这是在一个特殊的插件中,如果要在functions.php中使用它,则必须对其进行一些编辑。
然后,我trigger()在两个电子邮件类中都编辑了-function:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都应有的表现,但是在接受自己的答案之前,我将做更多测试。再次感谢Helgatheviking带领我走上了正确的道路。:)
编辑:忘记添加我的替代email-order-details.php。这被添加在下面<tbody>
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,
) );
}
Run Code Online (Sandbox Code Playgroud)
显示订单项的代码直接来自order-email-items。我不确定是否有更好的方法可以解决此问题,如果是这种情况,请随时纠正我。
编辑,Skyverge使用一种旧方法来加载自定义电子邮件类。加载自定义电子邮件类的正确方法是:
//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 ) {
$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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2948 次 |
| 最近记录: |