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(