skip to Main Content

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?

2

Answers


  1. Chosen as BEST ANSWER

    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
    }
    

  2. 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;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search