How do I display product unit price in woocommerce order mail
-
currently subtotal price is shown on email, i need to display unit price in a separate column
-
Hi there @jai6358,
Thank you for reaching out.
I understand you’d like to show the product unit price in the WooCommerce order email.
By default, this feature is not available in WooCommerce, however, it can be achieved with the help of custom coding. In that case, I recommend the following, as customization request are out of our support scope:
- Running the exact question you’re asking, through an AI platform like ChatGPT for recommendations.
- Checking whether there are existing plugins in the WordPress plugin repository that might be doing that already.
- Joining our WooCommerce Slack community (it does have a developer channel where you can ask coding questions): https://woo.com/community-slack/
I hope this helps.
Hi, @jai6358
To display the product unit price in WooCommerce order emails, you can achieve this by customizing the email template. WooCommerce uses hooks and templates to generate emails, so you can modify the templates to display additional information like unit price.
Here’s how you can do it:Step 1: Create a Child Theme (if you haven’t already)
Always create a child theme for modifications, so your changes are preserved during WooCommerce and theme updates.
- If you haven’t created a child theme, follow the steps here.
Step 2: Copy the Email Template
You need to modify the
email-order-items.php
template. Here’s how to find and copy the correct template:- Navigate to the WooCommerce plugin directory:
/wp-content/plugins/woocommerce/templates/emails/
- Copy the file
email-order-items.php
to your child theme at this location:/wp-content/themes/your-child-theme/woocommerce/emails/
Step 3: Modify the
email-order-items.php
TemplateNow, you can modify the copied template to add a new column for the unit price.
- Open the copied
email-order-items.php
file in your child theme. - Find the section that outputs the product information, usually within a table structure, where the subtotal is displayed.
- Add a new column to display the unit price.
Here’s an example code modification:
<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"><?php esc_html_e( 'Product', 'woocommerce' ); ?></th>
????????????<th class="td" scope="col"><?php esc_html_e( 'Quantity', 'woocommerce' ); ?></th>
????????????<th class="td" scope="col"><?php esc_html_e( 'Unit Price', 'woocommerce' ); ?></th>
????????????<th class="td" scope="col"><?php esc_html_e( 'Total', 'woocommerce' ); ?></th>
????????</tr>
????</thead>
????<tbody>
????????<?php
????????foreach ( $items as $item_id => $item ) {
????????????$product = $item->get_product();
????????????if ( apply_filters( 'woocommerce_order_item_visible', true, $item ) ) {
?????????????????>
????????????????<tr class="<?php echo esc_attr( apply_filters( 'woocommerce_order_item_class', 'order_item', $item, $order ) ); ?>">
????????????????????<td class="td" style="text-align:left; vertical-align:middle; word-wrap:break-word;"><?php
????????????????????????echo wp_kses_post( $item->get_name() );
????????????????????????// Show SKU, if enabled
????????????????????????if ( $show_sku && is_object( $product ) && $product->get_sku() ) {
????????????????????????????echo ' (#' . $product->get_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 );
????????????????????????do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text );
?????????????????????></td>
????????????????????<td class="td" style="text-align:left; vertical-align:middle;"><?php echo esc_html( $item->get_quantity() ); ?></td>
????????????????????<td class="td" style="text-align:left; vertical-align:middle;"><?php echo wc_price( $item->get_total() / $item->get_quantity() ); ?></td>
????????????????????<td class="td" style="text-align:left; vertical-align:middle;"><?php echo $order->get_formatted_line_subtotal( $item ); ?></td>
????????????????</tr>
????????????????<?php
????????????}
????????}
?????????>
????</tbody>
</table>Step 4: Save and Test
After making these changes, save the file and test it by placing an order and checking the order confirmation email.
Hi Syed Tarikul Islam thanks for replay
i added your code in my email-order-details.php not in
email-order-items.php
column heading only visible table content not display : https://ibb.co/GttCxgM
my
email-order-items.php
file content looks like this<?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://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>
<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; ?>my email-order-details.php file look like this
<?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://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>
<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="2" 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="2" 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( nl2br( wptexturize( $order->get_customer_note() ) ), array() ); ?></td>
</tr>
<?php
}
?>
</tfoot>
</table>
</div>
<?php do_action( 'woocommerce_email_after_order_table', $order, $sent_to_admin, $plain_text, $email ); ?>
- You must be logged in to reply to this topic.