I can\'t seem to find a way of adding related products or cross sells to order emails in WooCommerce, and it\'s hurting my brain. I\'m sure it must be possible but can\'t seem t
You will have to do this with php in the emails template. You would edit email-footer.php and add something like this:
<?php
echo do_shortcode('[related_products per_page="4"]');
?>
You would want to add this into the table, not below the table. Just add an extra and put it in there.
You can put this in your child theme's functions.php
file:
// product suggestion in order mail
function order_mail_product_suggestion($atts) {
$atts=shortcode_atts(
array(
'id' => '',
), $atts, 'order_mail_product_suggestion');
$orderId = esc_attr($atts['id']);
$order = wc_get_order( (int)$orderId );
$items = $order->get_items();
$cat = array();
$pid = array();
foreach ( $items as $item ) {
$pid[] = $item->get_product_id();
$terms = wp_get_post_terms($item->get_product_id(),'product_cat',array('fields'=>'ids'));
foreach ( $terms as $term ) {
$cat[] = $term;
}
}
$uniuqcat = array_unique($cat);
$uniuqpid = array_unique($pid);
$html = '';
$args = array(
'post_type' => 'product',
'stock' => 1,
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'posts_per_page' => '20',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => implode(',', $uniuqcat),
'operator' => 'IN'
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'exclude-from-catalog',
'operator' => 'NOT IN'
)
)
);
$loop = new WC_Product_Query($args);
$products = $loop->get_products();
if ($products) {
$html .= '<div id="suggestion" style="padding: 20px 0;border-top: 1px solid #eee;">';
$html .= '<h2 style="text-align: center;font-weight: 400;color: #000;">PLUS, MORE THINGS YOU MAY LIKE</h2>';
$html .= '<table style="width: 100%;table-layout: fixed;border-collapse: collapse;">';
$html .= '<tbody>';
$html .= '<tr>';
$i=0;
foreach ( $products as $product ) {
if (in_array($product->get_id(), $pid)) {
continue;
}
$html .= '<td align="center" style="padding: 5px;border: 1px solid #eee;">';
if (has_post_thumbnail( $product->get_id() )) {
$html .= get_the_post_thumbnail($product->get_id(), 'shop_catalog');
} else {
$html .= '<img src="'.woocommerce_placeholder_img_src().'" alt="Placeholder" width="300px" height="300px" />';
}
$html .= '<h3><a style="color: #000;font-weight: normal;text-decoration: none;font-size: 13px;text-align: center;display: block;line-height: 16px;" href="'.get_permalink( $product->get_id() ).'">'.esc_attr($product->get_title() ? $product->get_title() : $product->get_id()).'</a></h3>';
$html .= '<p><a style="font-weight: normal;text-decoration: none;display: block;margin: 0 auto;max-width: 72px;padding: 4px 9px;text-align: center;background-color: #000;color: #fff;font-size: 13px;" href="'.get_permalink( $product->get_id() ).'" class="shop-now">Shop Now</a></p>';
$i++;
if($i==4) break;
}
$html .= '</tr>';
$html .= '</tbody>';
$html .= '</table>';
$html .= '</div>';
}
// now return the preapred html
return $html;
}
// register shortcode
add_shortcode('email_product_suggestion', 'order_mail_product_suggestion');
And then call the function in email templates like this:-
// Product suggestions
$order = $email->object;
if ( $order ) {
$id = $order->get_id();
echo do_shortcode( '[email_product_suggestion id="'.$id.'" ]' );
}
This will show products from the category where the current order item belongs, and exclude items that are already in the order.