Home > Software design >  Woocommerce custom email is triggered if specific product ID is in order but not if other products a
Woocommerce custom email is triggered if specific product ID is in order but not if other products a

Time:12-11

I have a custom woocommerce email trigger function in my Woocommerce store. This email function triggers 2 different emails based on product meta data. If specific product meta is empty it triggers email number 1 and if it's not empty it triggers email number 2. This works excellent when there is only specific ID in my order. Once there is another product in the order, this emails are not triggered.

This is the code part

add_action('woocommerce_order_status_completed', 'send_a_custom_email', 20, 2 );

function send_a_custom_email( $order_id, $order ) {
    global $woocommerce;
    $order = new WC_Order( $order_id );
    $mailer = $woocommerce->mailer();
    $product_ids = array( ); // Initializing
    $customer_email = $order->get_billing_email();
    $customer_name = $order->get_billing_first_name();
    
    foreach ( $order->get_items() as $item ) {
        $meta_data  = $item->get_meta('meno'); // Zisti ake je meno
        $venovanie = $item->get_meta('venovanie'); // // Zisti ake je venovanie
        $product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
        
        if( empty($meta_data) ) {
            $product_ids[] = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
        }
    } 

    if ( ! empty($product_ids) && $product_id == 2805 ) {

//email 1

} else if ( empty($product_ids) && $product_id == 2805 ) {

//email 2

}
}

If I remove the $product_id == 2805 from the function, then it sends this email with every order in the store which is also not good because this email has to be triggered only when product id 2805 is in the order and email 1 and email 2 is based on this product ID 2805 meta data.

Thanks in advance for your help.

CodePudding user response:

<?php

add_action('woocommerce_order_status_completed', 'send_a_custom_email', 20, 2 );

function send_a_custom_email( $order_id, $order ) {
    global $woocommerce;
    $order = new WC_Order( $order_id );
    $mailer = $woocommerce->mailer();
    $product_ids = array( ); // Initializing
    $customer_email = $order->get_billing_email();
    $customer_name = $order->get_billing_first_name();
    
    foreach ( $order->get_items() as $item ) {
        $meta_data  = $item->get_meta('meno'); // Zisti ake je meno
        $venovanie = $item->get_meta('venovanie'); // // Zisti ake je venovanie
        $product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
        
        if( empty($meta_data) ) {
            $product_ids[] = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
        }
    } 

    if ( count($product_ids)>0 && $product_id == 2805 ) {

//email 1

} else if ( empty($product_ids) && $product_id == 2805 ) {

//email 2

}
}

CodePudding user response:

This solved my problem

add_action('woocommerce_order_status_completed', 'send_a_custom_email', 20, 2 );

function send_a_custom_email( $order_id, $order ) {
    global $woocommerce;
    $order = new WC_Order( $order_id );
    $mailer = $woocommerce->mailer();
    $product_ids = array( ); // Initializing
    $customer_email = $order->get_billing_email();
    $customer_name = $order->get_billing_first_name();
    
    foreach ( $order->get_items() as $item ) {
        $meta_data  = $item->get_meta('meno'); // Zisti ake je meno
        $venovanie = $item->get_meta('venovanie'); // // Zisti ake je venovanie
        $product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
        
        if( empty($meta_data) ) {
            $product_ids[] = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
        }
    } 

if(( !empty($product_ids) && in_array( 2805, $product_ids)) || ( !empty($product_ids) && $product_id == 2805 )){

//email 1

} 
if(( empty($product_ids) && in_array( 2805, $product_ids)) || ( empty($product_ids) && $product_id == 2805 )){

//email 2

}
}
  • Related