Home > database >  woocommerce conditional email template if product type in order
woocommerce conditional email template if product type in order

Time:09-21

I try to send a customized email template when a customer has a ticket (custom product type) in cart.

I have the following:

function bc_customer_completed_order_template($template, $template_name, $template_path)
{
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = wc_get_product( $cart_item['product_id'] );
        $type = get_class($product);
        if ( $type == 'WC_Product_Tickets' && 'customer-completed-order.php' === basename($template) ) {
            $template = trailingslashit(plugin_dir_path( __FILE__ )) . 'templates/customer-completed-order.php';
            }
        }
   return $template;
}
add_filter('woocommerce_locate_template', 'bc_customer_completed_order_template', 10, 3);

The conditionals are working (on cart and checkout page for example), but when the order is placed, the new template is not used.

Anybody?

CodePudding user response:

Your email template will look like this:

enter image description here Code snippets:

// Suppose orders don't have ticket products.
$has_tickets = false;

// Loop order items.
foreach ( $order->get_items() as $item_id => $item ) {
    // Get product object from order item.
    $_product = $item->get_product();
    // Check if the product object is valid and the class is `WC_Product_Tickets`
    if ( $_product && 'WC_Product_Tickets' === get_class( $_product ) ) {
        // Change the flag.
        $has_tickets = true;
        // Break the loop as we alreay have true flag.
        break;
    }
}

// Check if order have tickets items.
if ( $has_tickets ) {
    // Load custom email template.
    wc_get_template( 'templates/custom-customer-completed-order.php' );
    // Return as we don't need the below code.
    return;
}

CodePudding user response:

It turned out, although the above solution is correct in its idea, in reality one cannot load a template and make use of the $order without extending the woocommerce email class. Therefore i loaded the function inside the email template itself and made an if - else statement so for situation A the layout is different then for situation b.

Like so:

$has_tickets = false;

// Loop order items.
foreach ( $order->get_items() as $item_id => $item ) {
    // Get product object from order item.
    $_product = $item->get_product();
    // Check if the product object is valid and the class is `WC_Product_Tickets`
    if ( $_product && 'WC_Product_Tickets' === get_class( $_product ) ) {
        // Change the flag.
        $has_tickets = true;
        // Break the loop as we alreay have true flag.
        break;
    }
}

// Check if order have tickets items.
if ( $has_tickets ) {
    do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

//custom email layout here//
}
else{
//Regular email template here
}
  • Related