Wordpress Woocommerce,不同的订单电子邮件取决于订单中的产品
根据订购的产品,我需要发送两封不同的“新订单”电子邮件。 这种情况下,产品存储在不同的位置,我需要发送一封电子邮件,其中只包含存储1中的产品,另一封邮件包含存储2中的产品。 如果仅订购了位于存储1的产品,则不应发送电子邮件2,反之亦然 存储信息是每个产品上的自定义元字段 我添加了一个自定义电子邮件类,它是Wordpress Woocommerce,不同的订单电子邮件取决于订单中的产品,wordpress,woocommerce,Wordpress,Woocommerce,根据订购的产品,我需要发送两封不同的“新订单”电子邮件。 这种情况下,产品存储在不同的位置,我需要发送一封电子邮件,其中只包含存储1中的产品,另一封邮件包含存储2中的产品。 如果仅订购了位于存储1的产品,则不应发送电子邮件2,反之亦然 存储信息是每个产品上的自定义元字段 我添加了一个自定义电子邮件类,它是class wc email new order的副本,但仅在需要时更改了名称 我一直在寻找这个钩子和过滤器,但我不能走完所有的路。我也一直在考虑覆盖email order details.ph
class wc email new order
的副本,但仅在需要时更改了名称
我一直在寻找这个钩子和过滤器,但我不能走完所有的路。我也一直在考虑覆盖email order details.php
文件并检查每个产品元字段,但我不确定这是否正确。可以这么说,我想即使桌子上没有产品,电子邮件也会被发送
我的问题是,当使用不同的过滤器时,我不知道发送了哪些电子邮件,所以我也无法检查这种情况
你会用模板和所有东西创建两封新的电子邮件然后这样做吗,还是我在这里遗漏了什么
如果我能澄清什么,请告诉我
编辑:在与@helgatheviking进行了一番交谈后,我意识到我需要澄清的是,只有当订单包含位于存储1的产品时,才应发送关于存储1的电子邮件,而只有当订单包含位于存储2的产品时,才应发送关于存储2的电子邮件。
如果订单包含两种产品,则应发送两封电子邮件,但仅显示各自的产品。您可以按如下方式自定义它们:
Var_转储$order对象,但我打赌您可以访问产品ID,然后您可以使用该ID确定它属于哪个存储,并相应地调整电子邮件内容。您可以像这样自定义它们:
Var_转储$order对象,但我打赌您可以访问产品ID,然后您可以使用该ID确定它属于哪个存储,并相应地调整电子邮件内容。仔细思考并思考@helgatheviking所说的内容后,我终于想出了一个解决方案 我复制了
类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;
}
请注意,这是一个特殊的插件,如果要在functions.php中使用它,您必须对代码进行一些编辑
然后,我在两个电子邮件类中编辑了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;
}
}
一切似乎都正常,但在接受我自己的答案之前,我会做更多的测试。
再次感谢Helgatheviking带领我走上正确的道路。:)
编辑:忘记添加我对电子邮件订单详细信息.php的覆盖。
这被添加到
经过深思熟虑和反思@helgatheviking所说的话,我终于想出了一个解决办法
我复制了类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;
}
请注意,这是一个特殊的插件,如果要在functions.php中使用它,您必须对代码进行一些编辑
然后,我在两个电子邮件类中编辑了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;
}
}
一切似乎都正常,但在接受我自己的答案之前,我会做更多的测试。
再次感谢Helgatheviking带领我走上正确的道路。:)
编辑:忘记添加我对电子邮件订单详细信息.php的覆盖。
这被添加到
您可以复制客户处理订单电子邮件,然后自定义方法,因为您可以访问$order
对象,并可以检查所需产品是否已订购。@helgatheviking hey Helga,谢谢您的回复。:)我实际上在看触发器方法,但我不知道如何创建新的order对象。如果我在storage 2中检查我的产品,并进一步发送订单对象,所有产品仍将添加到电子邮件中,对吗?@helgatheviking我通过覆盖email-order-details.php并检查发送的电子邮件并从中筛选产品来做到这一点。然而,storage2在atm机上收到了两封电子邮件,我觉得这样做有点肮脏…:D@helgatheviking没错,但是如果我有两种产品类型的订单,我仍然需要做模板破解,或者我仍然会收到邮件中的所有产品,我猜?我的意思是,在创建订单时,我不能从订单中删除订单项,可以吗?我只想要Woo电子邮件中存储1的产品和自定义电子邮件中存储2的产品。:)那么现在你需要知道如何只列出特定电子邮件中的某些项目?这不是原始问题的一部分。请编辑问题以确保完整性。。。。还包括您迄今为止尝试过的内容。您可以复制客户处理订单电子邮件,然后自定义该方法,因为您可以访问$order
对象,并可以检查所需产品是否已订购。@helgatheviking hey Helga,感谢您的回复。:)我实际上在看触发器方法,但我不知道如何创建新的order对象。如果我在storage 2中检查我的产品,并进一步发送订单对象,所有产品仍将添加到电子邮件中,对吗?@helgatheviking我通过覆盖email-order-details.ph成功地做到了这一点