Commit 3762d06da2d for woocommerce
commit 3762d06da2d526da072e86422253904f2a4adf77
Author: Peter Petrov <peter.petrov89@gmail.com>
Date: Wed Apr 1 12:48:18 2026 +0300
Add hooks for email order details headings (#63898)
* Add hooks for email order details headings
* Add changelog
* Don't print the h2 if there's no content for it
* Add hook to plan text email order details heading
* Fix indentation
* Fix linting
* Don't output a <br> when there's no heading
* Make sure hook always returns a boolean value
diff --git a/plugins/woocommerce/changelog/add-email-order-details-hooks b/plugins/woocommerce/changelog/add-email-order-details-hooks
new file mode 100644
index 00000000000..bebe1d9eb28
--- /dev/null
+++ b/plugins/woocommerce/changelog/add-email-order-details-hooks
@@ -0,0 +1,4 @@
+Significance: patch
+Type: add
+
+Add woocommerce_email_order_details_heading and woocommerce_email_display_order_number filters to the email order details template.
diff --git a/plugins/woocommerce/templates/emails/email-order-details.php b/plugins/woocommerce/templates/emails/email-order-details.php
index 9f27979a4a3..33f63012399 100644
--- a/plugins/woocommerce/templates/emails/email-order-details.php
+++ b/plugins/woocommerce/templates/emails/email-order-details.php
@@ -48,33 +48,69 @@ if ( $email_improvements_enabled ) {
*/
do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text, $email ); ?>
-<h2 class="<?php echo esc_attr( $heading_class ); ?>">
- <?php
- if ( $email_improvements_enabled ) {
- echo wp_kses_post( __( 'Order summary', 'woocommerce' ) );
- }
- if ( $sent_to_admin ) {
- $before = '<a class="link" href="' . esc_url( $order->get_edit_order_url() ) . '"' . ( $block_email_editor_enabled ? ' style="text-decoration: none;"' : '' ) . '>';
- $after = '</a>';
- } else {
- $before = '';
- $after = '';
- }
- if ( $email_improvements_enabled ) {
- echo '<br><span>';
- }
- /* translators: %s: Order ID. */
- $order_number_string = __( '[Order #%s]', 'woocommerce' );
- if ( $email_improvements_enabled ) {
- /* translators: %s: Order ID. */
- $order_number_string = __( 'Order #%s', 'woocommerce' );
- }
- echo wp_kses_post( $before . sprintf( $order_number_string . $after . ' (<time datetime="%s">%s</time>)', $order->get_order_number(), $order->get_date_created()->format( 'c' ), wc_format_datetime( $order->get_date_created() ) ) );
- if ( $email_improvements_enabled ) {
- echo '</span>';
- }
+<?php
+$order_details_heading = '';
+if ( $email_improvements_enabled ) {
+ /**
+ * Filter the heading text shown in the order details section of emails.
+ *
+ * @since 10.8.0
+ * @param string $heading The heading text.
+ * @param WC_Order $order Order object.
+ * @param WC_Email $email Email object.
+ */
+ $order_details_heading = apply_filters( 'woocommerce_email_order_details_heading', __( 'Order summary', 'woocommerce' ), $order, $email );
+}
+
+/**
+ * Filter whether to display the order number in the order details heading of emails.
+ *
+ * @since 10.8.0
+ * @param bool $display Whether to display the order number. Default true.
+ * @param WC_Order $order Order object.
+ * @param WC_Email $email Email object.
+ */
+$display_order_number = (bool) apply_filters( 'woocommerce_email_display_order_number', true, $order, $email );
+
+if ( $order_details_heading || $display_order_number ) :
?>
-</h2>
+ <h2 class="<?php echo esc_attr( $heading_class ); ?>">
+ <?php
+ if ( $order_details_heading ) {
+ echo wp_kses_post( $order_details_heading );
+ }
+ if ( $display_order_number ) {
+ if ( $sent_to_admin ) {
+ $before = '<a class="link" href="' . esc_url( $order->get_edit_order_url() ) . '"' . ( $block_email_editor_enabled ? ' style="text-decoration: none;"' : '' ) . '>';
+ $after = '</a>';
+ } else {
+ $before = '';
+ $after = '';
+ }
+ if ( $email_improvements_enabled ) {
+ // Only output <br> when both a heading and order number are shown; otherwise, avoid leading line break.
+ if ( $order_details_heading ) {
+ echo '<br><span>';
+ } else {
+ echo '<span>';
+ }
+ }
+ /* translators: %s: Order ID. */
+ $order_number_string = __( '[Order #%s]', 'woocommerce' );
+ if ( $email_improvements_enabled ) {
+ /* translators: %s: Order ID. */
+ $order_number_string = __( 'Order #%s', 'woocommerce' );
+ }
+ echo wp_kses_post( $before . sprintf( $order_number_string . $after . ' (<time datetime="%s">%s</time>)', $order->get_order_number(), $order->get_date_created()->format( 'c' ), wc_format_datetime( $order->get_date_created() ) ) );
+ if ( $email_improvements_enabled ) {
+ echo '</span>';
+ }
+ }
+ ?>
+ </h2>
+ <?php
+endif;
+?>
<div style="margin-bottom: <?php echo $email_improvements_enabled ? '24px' : '40px'; ?>;">
<table class="td font-family <?php echo esc_attr( $order_table_class ); ?>" cellspacing="0" cellpadding="6" style="width: 100%;" border="1">
diff --git a/plugins/woocommerce/templates/emails/plain/email-order-details.php b/plugins/woocommerce/templates/emails/plain/email-order-details.php
index e3bf5500dca..d2d76a1e8b7 100644
--- a/plugins/woocommerce/templates/emails/plain/email-order-details.php
+++ b/plugins/woocommerce/templates/emails/plain/email-order-details.php
@@ -12,7 +12,7 @@
*
* @see https://woocommerce.com/document/template-structure/
* @package WooCommerce\Templates\Emails
- * @version 10.1.0
+ * @version 10.8.0
*/
use Automattic\WooCommerce\Utilities\FeaturesUtil;
@@ -27,14 +27,25 @@ if ( $email_improvements_enabled ) {
do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text, $email );
-if ( $email_improvements_enabled ) {
- /* translators: %1$s: Order ID. %2$s: Order date */
- echo wp_kses_post( sprintf( esc_html__( 'Order #%1$s (%2$s)', 'woocommerce' ), $order->get_order_number(), wc_format_datetime( $order->get_date_created() ) ) ) . "\n";
- echo "\n==========\n";
-} else {
- /* translators: %1$s: Order ID. %2$s: Order date */
- echo wp_kses_post( wc_strtoupper( sprintf( esc_html__( '[Order #%1$s] (%2$s)', 'woocommerce' ), $order->get_order_number(), wc_format_datetime( $order->get_date_created() ) ) ) ) . "\n";
+/**
+ * Filter whether to display the order number in the order details heading of emails.
+ *
+ * @since 10.8.0
+ * @param bool $display Whether to display the order number. Default true.
+ * @param WC_Order $order Order object.
+ * @param WC_Email $email Email object.
+ */
+if ( (bool) apply_filters( 'woocommerce_email_display_order_number', true, $order, $email ) ) {
+ if ( $email_improvements_enabled ) {
+ /* translators: %1$s: Order ID. %2$s: Order date */
+ echo wp_kses_post( sprintf( esc_html__( 'Order #%1$s (%2$s)', 'woocommerce' ), $order->get_order_number(), wc_format_datetime( $order->get_date_created() ) ) ) . "\n";
+ echo "\n==========\n";
+ } else {
+ /* translators: %1$s: Order ID. %2$s: Order date */
+ echo wp_kses_post( wc_strtoupper( sprintf( esc_html__( '[Order #%1$s] (%2$s)', 'woocommerce' ), $order->get_order_number(), wc_format_datetime( $order->get_date_created() ) ) ) ) . "\n";
+ }
}
+
echo "\n" . wc_get_email_order_items( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$order,
array(