【问题标题】:Send Woocommerce Order to email address listed on product page将 Woocommerce 订单发送到产品页面上列出的电子邮件地址
【发布时间】:2018-04-14 09:16:22
【问题描述】:

我正在使用 Woocommerce 和 Product Addons 插件向产品添加额外的字段。其中一个字段是电子邮件地址,可让人们将订单确认发送到与结帐页面上显示的账单地址不同的地址。电子邮件应发送到这两个地址。

关于如何修改functions.php文件来做到这一点有什么想法吗?

【问题讨论】:

  • 因为一个订单可以有很多商品,所以这个额外的电子邮件字段不应该是产品自定义字段,而是一个额外的结帐字段。想想……
  • 购物车中可能有多个产品,但作为“第一步”,在产品页面本身上请求了电子邮件。假设购买确认总是发送到同一个地址,但它可能与帐单地址不同,这就是它需要出现在产品页面上的原因。

标签: php wordpress woocommerce orders email-notifications


【解决方案1】:

woocommerce_email_recipient_{$this->id} 过滤器挂钩中,您可以使用 $order 参数来获取您的第二封电子邮件。

但首先让我们使用 Product Add-ons 插件在全局范围内添加一个电子邮件字段……

  1. 产品上的添加字段(填写字段并添加到购物车):

  1. 结帐后,已收到订单(谢谢)页面中的此“电子邮件”字段:

您可以注意到此字段的标签是“电子邮件”...

现在,如果我在 wp_woocommerce_order_itemmeta 中的数据库中查找此订单,我可以看到 meta_key "Email"meta_value "loic@TheAztec.com"

现在我可以在下面的代码中设置正确的meta_key 来获取我的电子邮件。

以下代码将添加此额外电子邮件收件人以处理和完成客户订单电子邮件通知:

add_filter( 'woocommerce_email_recipient_customer_completed_order', 'additional_customer_email_recipient', 10, 2 ); // Processing Order
add_filter( 'woocommerce_email_recipient_customer_processing_order', 'additional_customer_email_recipient', 10, 2 ); // Completed Order
function additional_customer_email_recipient( $recipient, $order ) {
    if ( ! is_a( $order, 'WC_Order' ) ) return $recipient;

    $additional_recipients = array(); // Initializing…

    // Iterating though each order item
    foreach( $order->get_items() as $item_id => $item_data ){
        // HERE set the the correct meta_key (like 'Email') to get the correct value
        $email = wc_get_order_item_meta( $item_id, 'Email', true );

        // Avoiding duplicates (if many items with many emails)
        // or an existing email in the recipient
        if( ! in_array( $email, $additional_recipients ) && strpos( $recipient, $email ) === false )
            $additional_recipients[] = $email;
    }

    // Convert the array in a coma separated string
    $additional_recipients = implode( ',', $additional_recipients);

    // If an additional recipient exist, we add it
    if( count($additional_recipients) > 0)
        $recipient .= ','.$additional_recipients;

    return $recipient;
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

经过测试并且有效。

【讨论】:

  • 非常感谢!我会尝试实现这一点,如果它在我的最终工作,我会打勾。
  • 有效!谢谢!现在只需要确保这是客户想要的,哈哈 :)
【解决方案2】:

您可以在function.php中添加以下代码

add_filter( 'woocommerce_email_recipient_customer_completed_order', 'your_email_recipient_filter_function', 10, 2);

function your_email_recipient_filter_function($recipient, $object) {
    $recipient = $recipient . ', me@myemail.com';
    return $recipient;
}

如果您想以密件抄送方式发送电子邮件,请尝试以下代码:

add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);

function mycustom_headers_filter_function( $headers, $object ) {
    if ($object == 'customer_completed_order') {
        $headers .= 'BCC: My name <my@email.com>' . "\r\n";
    }

【讨论】:

  • 非常感谢,但我无法对电子邮件地址进行硬编码。它必须来自出现在产品页面本身的字段。它也不能来自结帐页面(或帐单地址)。我不认为你的解决方案能做到这一点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多