根据所选的自定义结帐字段值添加自定义电子邮件收件人 [英] Adding a custom email recipient depending on selected custom checkout field value

查看:63
本文介绍了根据所选的自定义结帐字段值添加自定义电子邮件收件人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要Woocommerce根据为Field Checkout选择的选项向不同的个人发送自定义电子邮件(从技术上讲,自定义字段是报告他们购买的产品型号的人员,但是我不确定如何自定义电子邮件收据根据购买的产品型号而定,如下所示。

I need for Woocommerce to send a custom email to different individuals depending on the option selected for Field Checkout (technically, the custom field is the person reporting on the product variant they have purchased, but I was not sure how to customize email receipt based on product variant purchased, so it is as follows).

首先,我使用以下代码建立了自定义字段

First I established the custom field using the following code

/**
 * Add the field to the checkout
  */
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );

function my_custom_checkout_field( $checkout ) {

    echo '<div id="my_custom_checkout_field"><h2>' . __('Membership') . '</h2>';

    woocommerce_form_field( 'my_field_name', array(
        'type'          => 'select',
        'class'         => array('wps-drop'),
        'label'         => __('Membership purchased'),
        'options'       => array(
            'blank'     => __( 'Select membership ordered', 'wps' ),
            'premium'   => __( 'Premium Membership', 'wps' ),
            'gold'  => __( 'Gold Membership', 'wps' ),
            'silver'    => __( 'Silver Membership', 'wps' ),
            'bronze'    => __( 'Bronze Membership', 'wps' )
        )
    ), $checkout->get_value( 'my_field_name' ));

    echo '</div>';

}

/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['my_field_name'] =='blank')
        wc_add_notice( __( 'Please select status.' ), 'error' );
}

然后我根据所选值设置电子邮件收据:

Then I setup email receipts based on value selected:

add_filter( 'woocommerce_email_recipient_new_order', 'new_order_conditional_email_recipient', 10, 2 );
function new_order_conditional_email_recipient( $recipient, $order ) {

    // Get the order ID (retro compatible)
    $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;

    // Get the custom field value (with the right $order_id)
    $my_field_name = get_post_meta($order_id, 'my_field_name', true);

    if ($my_field_name == "premium")
        $recipient .= ', emailreceipt1@gmail.com';
    elseif ($my_field_name == "gold")
        $recipient .= ', emailreceipt2@gmail.com';
    elseif ($my_field_name == "silver")
            $recipient .= ', emailreceipt1@gmail.com';
    elseif ($my_field_name == "bronze")
        $recipient .= ', emailreceipt2@gmail.com';

    return $recipient;
}

不过,当我使用此代码时,应该接收的收据都没有他们指定的电子邮件实际上是这样做的。代码有什么问题?

When I use this code though, none of the receipts who are supposed to receive their designated email actually do. What's wrong with the code?

推荐答案

您刚刚错过了将所选的自定义字段值保存在订单元数据中的操作。我也再次回顾了您的代码:

You have just missed to save the selected custom field value in the order meta data. I have also revisited your code a bit:

// Add custom checkout field
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
function my_custom_checkout_field( $checkout ) {
    echo '<div id="my_custom_checkout_field"><h2>' . __('Membership') . '</h2>';

    woocommerce_form_field( 'my_field_name', array(
        'type'      => 'select',
        'class'     => array('wps-drop'),
        'label'     => __('Membership purchased'),
        'required'  => true, // Missing
        'options'   => array(
            ''          => __( 'Select membership ordered', 'wps' ),
            'premium'   => __( 'Premium Membership', 'wps' ),
            'gold'      => __( 'Gold Membership', 'wps' ),
            'silver'    => __( 'Silver Membership', 'wps' ),
            'bronze'    => __( 'Bronze Membership', 'wps' )
        )
    ), $checkout->get_value( 'my_field_name' ) );
    echo '</div>';
}

// Process the checkout
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( empty( $_POST['my_field_name'] ) )
        wc_add_notice( __( 'Please select status.' ), 'error' );
}

// Save the custom checkout field in the order meta
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_field_checkout_update_order_meta', 10, 1 );
function my_custom_field_checkout_update_order_meta( $order_id ) {

    if ( ! empty( $_POST['my_field_name'] ) )
        update_post_meta( $order_id, 'my_field_name', $_POST['my_field_name'] );
}

add_filter( 'woocommerce_email_recipient_new_order',  'new_order_conditional_email_recipient', 10, 2 );
function new_order_conditional_email_recipient( $recipient, $order ) {
    if( is_admin() ) return $recipient;

    // Get the order ID (Woocommerce retro compatibility)
    $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;

    // Get the custom field value (with the right $order_id)
    $my_field_name = get_post_meta( $order_id, 'my_field_name', true );

    if ($my_field_name == "premium")
        $recipient .= ',emailreceipt1@gmail.com';
    elseif ($my_field_name == "gold")
        $recipient .= ',emailreceipt2@gmail.com';
    elseif ($my_field_name == "silver")
        $recipient .= ',emailreceipt1@gmail.com';
    elseif ($my_field_name == "bronze")
        $recipient .= ',emailreceipt2@gmail.com';

    return $recipient;
}

代码进入活动子主题(或主题)的function.php文件

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

在WooCommerce 3+中经过测试,可以正常工作。

Tested in WooCommerce 3+ and works.


您将看到收件人已正确添加,具体取决于客户的选择。

As you will see the recipient is correctly added in "New Order" email notification depending on the customer choice.

这篇关于根据所选的自定义结帐字段值添加自定义电子邮件收件人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆