Search code examples
phpwordpresswoocommerceemail-attachmentsemail-notifications

Add an email attachment to WooCommerce notifications based on product category


For some of my product I need to send an additional pdf (not an invoice) to my customers.

With the help of this post: https://wordpress.org/support/topic/attach-pdf-to-confirmation-email-for-specific-product/

I was able to attach an attachment to every order confirmation email. Then I tried to change the code to filter by product sku.

In this post I found some infos about the variables that are available and read about some changes for WP3: How to get WooCommerce order details

Here my code that unfortunately doesn’t work and is not attaching anything to the confirmation email anymore:

add_filter( 'woocommerce_email_attachments', 'webroom_attach_to_wc_emails', 10, 3);
function webroom_attach_to_wc_emails ( $attachments , $email_id, $order ) {
// Avoiding errors and problems
if ( ! is_a( $order, 'WC_Order' ) || ! isset( $email_id ) ) {
   return $attachments;
}

$file_path = get_stylesheet_directory() . '/Lizenzen/TestAttachment.pdf'; 
$product_sku    = '1234';

if( $email_id === 'customer_processing_order' ){
        foreach ($order->get_items() as $item_key => $item ):
        $product        = $item->get_product();
        if ( $product_sku === $product->get_sku() ) {
            $attachments[] = $file_path;    
        }
    endforeach;
    }


return $attachments;
  }

How would I have to change it to check for product category instead of SKU?

A general question would be: How can I debug this php code? Is there a way to show e.g. variables like email_id etc to check if the code gets correct values?


Solution

  • Following code adds the attachment based on

    • Product category
    • $email_id === 'customer_processing_order'.

    For other $email_ids, see How to target other WooCommerce order emails


    Also make sure the file path is correct!


    So you get:

    function filter_woocommerce_email_attachments( $attachments, $email_id, $order, $email_object = null ) {    
        // Avoiding errors and problems
        if ( ! is_a( $order, 'WC_Order' ) || ! isset( $email_id ) ) return $attachments;
    
        // File path
        $file_path = get_template_directory() . '/Lizenzen/TestAttachment.pdf';
        
        // Specific categories, several could be added, separated by a comma
        $specific_categories = array( 'Categorie-A', 'categorie-1' );
        
        // Email id equal to (view: https://stackoverflow.com/a/61459068/11987538)
        if ( $email_id === 'customer_processing_order' ) {
            // Loop through order items
            foreach( $order->get_items() as $item ) {
                // Product ID
                $product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
    
                // Has term (product category)
                if ( has_term( $specific_categories, 'product_cat', $product_id ) ) {
                    // Push to array
                    $attachments[] = $file_path;
                }
            }
        }
        
        return $attachments;
    }
    add_filter( 'woocommerce_email_attachments', 'filter_woocommerce_email_attachments', 10, 4 );