根据所选的自定义结帐字段值添加自定义电子邮件收件人

Adding a custom email recipient depending on selected custom checkout field value

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

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

/**
 * 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' );
}

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

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;
}

不过,当我使用此代码时,none 本应收到指定电子邮件的收据实际上收到了。代码有什么问题?

您刚刚没有在订单元数据中保存所选的自定义字段值。我也重新审视了你的代码:

// 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 文件或任何插件文件。

在 WooCommerce 3+ 中测试并有效。

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