Wordpress Woocommerce,不同的订单电子邮件取决于订单中的产品

Wordpress Woocommerce,不同的订单电子邮件取决于订单中的产品,wordpress,woocommerce,Wordpress,Woocommerce,根据订购的产品,我需要发送两封不同的“新订单”电子邮件。 这种情况下,产品存储在不同的位置,我需要发送一封电子邮件,其中只包含存储1中的产品,另一封邮件包含存储2中的产品。 如果仅订购了位于存储1的产品,则不应发送电子邮件2,反之亦然 存储信息是每个产品上的自定义元字段 我添加了一个自定义电子邮件类,它是class wc email new order的副本,但仅在需要时更改了名称 我一直在寻找这个钩子和过滤器,但我不能走完所有的路。我也一直在考虑覆盖email order details.ph

根据订购的产品,我需要发送两封不同的“新订单”电子邮件。 这种情况下,产品存储在不同的位置,我需要发送一封电子邮件,其中只包含存储1中的产品,另一封邮件包含存储2中的产品。 如果仅订购了位于存储1的产品,则不应发送电子邮件2,反之亦然

存储信息是每个产品上的自定义元字段

我添加了一个自定义电子邮件类,它是
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成功地做到了这一点