【问题标题】:Woocommerce, different order emails depending on product in orderWoocommerce,不同的订单电子邮件,具体取决于订单中的产品
【发布时间】:2017-05-15 14:36:03
【问题描述】:

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

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

我添加了一个自定义电子邮件类,它是class-wc-email-new-order 的副本,但仅在需要时更改了名称。

我一直在为此寻找挂钩和过滤器,但我无法一路走下去。我也一直在考虑覆盖email-order-details.phpfile 并检查每个产品元字段,但我不确定这是否是正确的方法。我想即使表格中没有产品,电子邮件仍然会发送。

我的问题是我不知道使用不同过滤器时发送了哪些电子邮件,所以我也无法检查那个条件。

您是否会创建两封带有模板和所有内容的新电子邮件并按此方式进行,还是我在这里缺少的东西?

如果我能澄清任何事情,请告诉我。

编辑:在与@helgatheviking 聊了一会儿之后,我意识到我需要澄清有关存储 1 的电子邮件仅应在订单包含位于存储 1 的产品时发送,而有关存储 2 的电子邮件仅应在订单时发送包含在存储 2 中的产品。 如果订单包含两种产品,则应发送两封电子邮件,但仅显示各自的产品。

【问题讨论】:

  • 您可以复制客户处理订单电子邮件,然后自定义trigger() 方法,因为您可以访问$order 对象并可以检查是否订购了所需的产品。
  • @helgatheviking 嘿 Helga,感谢您的回复。 :) 我实际上正在查看触发方法,但我没有看到如何创建一个新的订单对象。如果我在存储 2 中检查我的产品,并进一步发送订单对象,所有产品仍会添加到电子邮件中,对吗?
  • @helgatheviking 我设法通过覆盖 email-order-details.php 并检查正在发送的电子邮件并从中过滤产品来做到这一点。然而,storage2 正在收到两封电子邮件 atm,我觉得这样做有点肮脏......:D
  • @helgatheviking 确切地说,但是如果我有一个同时存在两种产品类型的订单,我仍然需要进行模板修改,或者我仍然会在邮件中收到所有产品?我的意思是,我不能在创建订单时从订单中删除订单商品,可以吗?我只想要 Woo 电子邮件中存储 1 中的产品和自定义电子邮件中存储 2 中的产品。 :)
  • 所以现在您需要知道如何仅列出特定电子邮件中的某些项目?这不是原始问题的一部分。请编辑问题的完整性....并包括您迄今为止尝试过的内容。

标签: wordpress woocommerce


【解决方案1】:

经过深思熟虑并反思@helgatheviking 所说的内容后,我想出了一个解决方案。

我复制了class-wc-new-order 并创建了两个与原始类完全相同的新类。 我将 ID 和类名分别更改为 storage 1 和 storage 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 带领我走上正轨。 :)

编辑:忘记添加我对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,
    ) ); 
    }

显示订单商品的代码直接取自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;
}

【讨论】:

  • 我完全按照上面的建议实现了这一点,但现在在 Woocommerce > 设置 > 电子邮件下的 WordPress 仪表板中,它不再显示通知电子邮件类型列表或让您管理通知哪些电子邮件地址。有什么建议吗?
  • 所以基本上它没有按预期工作。一个区别是我在 2019 年使用 Woocommerce 版本 3.5.7,我看到你的帖子是 2017 年的......
  • 如果我在 functions.php 中注释掉 woocommerce_email_classes,我可以再次调整电子邮件设置,但只要我启用该代码以添加自定义电子邮件类,它就会破坏 WordPress 仪表板中的 Woocommerce 电子邮件设置。奇怪的是我根本没有收到任何错误消息,我只是无法再调整电子邮件设置。
  • 这是我的代码:``` function custom_order_email_add_email_classes( $email_classes ) { $plugin_dir = ABSPATH . 'wp-content/plugins/woocommerce/includes/emails/'; $email_classes['WC_Email_New_Order_Location1'] = include( $plugin_dir . 'class-wc-email-new-order-location1.php' ); $email_classes['WC_Email_New_Order_Location2'] = include( $plugin_dir . 'class-wc-email-new-order-location2.php' );返回 $email_classes; } add_filter('woocommerce_email_classes', [$this, 'custom_order_email_add_email_classes'], 10, 1); ```
  • 嘿@JGrover,现在看到了。使用它的站点仍在运行 Woo 3.4.3,所以从那时起,Woo 电子邮件可能已经发生了一些变化。您也许可以查看 3.5 左右所做的更改,恐怕我现在无法亲自尝试。不过我会记下来看看,但我可能无法在周末之前这样做。
【解决方案2】:

您可以像这样自定义它们:https://www.sellwithwp.com/customizing-woocommerce-order-emails/

Var_dump 那个 $order 对象,但我敢打赌你可以访问产品 ID,然后你可以使用它来确定它属于哪个存储并相应地调整电子邮件内容。

【讨论】:

  • Hej @samyer,谢谢。我确实已经看过了,但是我并没有找到我需要的东西。
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多