Last active
June 14, 2023 17:00
-
-
Save damiencarbery/df897ee4156c7be5e3b709b261ff8245 to your computer and use it in GitHub Desktop.
Add column to WooCommerce order email - Add an extra column to the WooCommerce order email. https://www.damiencarbery.com/2020/10/add-column-to-woocommerce-order-email/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Order details table shown in emails. | |
* | |
* This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-details.php. | |
* | |
* HOWEVER, on occasion WooCommerce will need to update template files and you | |
* (the theme developer) will need to copy the new files to your theme to | |
* maintain compatibility. We try to do this as little as possible, but it does | |
* happen. When this occurs the version of the template file will be bumped and | |
* the readme will list any important changes. | |
* | |
* @see https://docs.woocommerce.com/document/template-structure/ | |
* @package WooCommerce\Templates\Emails | |
* @version 3.7.0 | |
*/ | |
defined( 'ABSPATH' ) || exit; | |
$text_align = is_rtl() ? 'right' : 'left'; | |
do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text, $email ); ?> | |
<h2> | |
<?php | |
if ( $sent_to_admin ) { | |
$before = '<a class="link" href="' . esc_url( $order->get_edit_order_url() ) . '">'; | |
$after = '</a>'; | |
} else { | |
$before = ''; | |
$after = ''; | |
} | |
/* translators: %s: Order ID. */ | |
echo wp_kses_post( $before . sprintf( __( '[Order #%s]', 'woocommerce' ) . $after . ' (<time datetime="%s">%s</time>)', $order->get_order_number(), $order->get_date_created()->format( 'c' ), wc_format_datetime( $order->get_date_created() ) ) ); | |
?> | |
</h2> | |
<div style="margin-bottom: 40px;"> | |
<table class="td" cellspacing="0" cellpadding="6" style="width: 100%; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;" border="1"> | |
<thead> | |
<tr> | |
<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Product', 'woocommerce' ); ?></th> | |
<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Quantity', 'woocommerce' ); ?></th> | |
<!-- New column for product's categories. --> | |
<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Categories', 'woocommerce' ); ?></th> | |
<th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Price', 'woocommerce' ); ?></th> | |
</tr> | |
</thead> | |
<tbody> | |
<?php | |
echo wc_get_email_order_items( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped | |
$order, | |
array( | |
'show_sku' => $sent_to_admin, | |
'show_image' => false, | |
'image_size' => array( 32, 32 ), | |
'plain_text' => $plain_text, | |
'sent_to_admin' => $sent_to_admin, | |
) | |
); | |
?> | |
</tbody> | |
<tfoot> | |
<?php | |
$item_totals = $order->get_order_item_totals(); | |
if ( $item_totals ) { | |
$i = 0; | |
foreach ( $item_totals as $total ) { | |
$i++; | |
?> | |
<tr> | |
<th class="td" scope="row" colspan="3" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['label'] ); ?></th> | |
<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['value'] ); ?></td> | |
</tr> | |
<?php | |
} | |
} | |
if ( $order->get_customer_note() ) { | |
?> | |
<tr> | |
<th class="td" scope="row" colspan="3" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Note:', 'woocommerce' ); ?></th> | |
<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php echo wp_kses_post( nl2br( wptexturize( $order->get_customer_note() ) ) ); ?></td> | |
</tr> | |
<?php | |
} | |
?> | |
</tfoot> | |
</table> | |
</div> | |
<?php do_action( 'woocommerce_email_after_order_table', $order, $sent_to_admin, $plain_text, $email ); ?> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Email Order Items | |
* | |
* This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-items.php. | |
* | |
* HOWEVER, on occasion WooCommerce will need to update template files and you | |
* (the theme developer) will need to copy the new files to your theme to | |
* maintain compatibility. We try to do this as little as possible, but it does | |
* happen. When this occurs the version of the template file will be bumped and | |
* the readme will list any important changes. | |
* | |
* @see https://docs.woocommerce.com/document/template-structure/ | |
* @package WooCommerce\Templates\Emails | |
* @version 3.7.0 | |
*/ | |
defined( 'ABSPATH' ) || exit; | |
$text_align = is_rtl() ? 'right' : 'left'; | |
$margin_side = is_rtl() ? 'left' : 'right'; | |
foreach ( $items as $item_id => $item ) : | |
$product = $item->get_product(); | |
$sku = ''; | |
$purchase_note = ''; | |
$image = ''; | |
if ( ! apply_filters( 'woocommerce_order_item_visible', true, $item ) ) { | |
continue; | |
} | |
if ( is_object( $product ) ) { | |
$sku = $product->get_sku(); | |
$purchase_note = $product->get_purchase_note(); | |
$image = $product->get_image( $image_size ); | |
} | |
?> | |
<tr class="<?php echo esc_attr( apply_filters( 'woocommerce_order_item_class', 'order_item', $item, $order ) ); ?>"> | |
<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap:break-word;"> | |
<?php | |
// Show title/image etc. | |
if ( $show_image ) { | |
echo wp_kses_post( apply_filters( 'woocommerce_order_item_thumbnail', $image, $item ) ); | |
} | |
// Product name. | |
echo wp_kses_post( apply_filters( 'woocommerce_order_item_name', $item->get_name(), $item, false ) ); | |
// SKU. | |
if ( $show_sku && $sku ) { | |
echo wp_kses_post( ' (#' . $sku . ')' ); | |
} | |
// allow other plugins to add additional product information here. | |
do_action( 'woocommerce_order_item_meta_start', $item_id, $item, $order, $plain_text ); | |
wc_display_item_meta( | |
$item, | |
array( | |
'label_before' => '<strong class="wc-item-meta-label" style="float: ' . esc_attr( $text_align ) . '; margin-' . esc_attr( $margin_side ) . ': .25em; clear: both">', | |
) | |
); | |
// allow other plugins to add additional product information here. | |
do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text ); | |
?> | |
</td> | |
<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"> | |
<?php | |
$qty = $item->get_quantity(); | |
$refunded_qty = $order->get_qty_refunded_for_item( $item_id ); | |
if ( $refunded_qty ) { | |
$qty_display = '<del>' . esc_html( $qty ) . '</del> <ins>' . esc_html( $qty - ( $refunded_qty * -1 ) ) . '</ins>'; | |
} else { | |
$qty_display = esc_html( $qty ); | |
} | |
echo wp_kses_post( apply_filters( 'woocommerce_email_order_item_quantity', $qty_display, $item ) ); | |
?> | |
</td> | |
<!-- New cell listing product categories. --> | |
<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"> | |
<?php echo wc_get_product_category_list( $item->get_product_id() ); ?> | |
</td> | |
<td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"> | |
<?php echo wp_kses_post( $order->get_formatted_line_subtotal( $item ) ); ?> | |
</td> | |
</tr> | |
<?php | |
if ( $show_purchase_note && $purchase_note ) { | |
?> | |
<tr> | |
<td colspan="3" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;"> | |
<?php | |
echo wp_kses_post( wpautop( do_shortcode( $purchase_note ) ) ); | |
?> | |
</td> | |
</tr> | |
<?php | |
} | |
?> | |
<?php endforeach; ?> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: Add column to WooCommerce order email | |
Plugin URI: https://www.damiencarbery.com/2020/10/add-column-to-woocommerce-order-email/ | |
Description: Add an extra column to the WooCommerce order email. | |
Author: Damien Carbery | |
Version: 0.1 | |
WC tested up to: 4.6 | |
*/ | |
/* | |
// This is a hack solution. It is better to edit emails/email-order-items.php template file. | |
add_filter( 'woocommerce_email_order_item_quantity', 'dcwd_order_item_quantity', 10, 2 ); | |
function dcwd_order_item_quantity( $qty_display, $item ) { | |
return $qty_display . '<td class="td" style="vertical-align:middle; font-family: \'Helvetica Neue\', Helvetica, Roboto, Arial, sans-serif;">'.wc_get_product_category_list( $item->get_product_id() ) .'</td>'; | |
} | |
*/ | |
// Use the template file if it is under this plugin directory. | |
add_filter( 'wc_get_template', 'dcwd_get_woocommerce_template', 10, 5 ); | |
function dcwd_get_woocommerce_template( $located, $template_name, $args, $template_path, $default_path ) { | |
$plugin_dir_path = plugin_dir_path( __FILE__ ); | |
// $template_name will be something like 'emails/email-order-items.php' or 'single-product.php' | |
if ( file_exists( $plugin_dir_path . $template_name ) ) { | |
$located = $plugin_dir_path . $template_name; | |
} | |
return $located; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment