Commit 48b0e06713 for woocommerce

commit 48b0e067130c06ee3919eaa2131df563d622d630
Author: Tung Du <dinhtungdu@gmail.com>
Date:   Fri Apr 25 16:59:59 2025 +0700

    Product Details: only render non-empty accordion items (#57516)

diff --git a/plugins/woocommerce/changelog/wooplug-3047-product-details-block-only-render-item-when-relevant-content b/plugins/woocommerce/changelog/wooplug-3047-product-details-block-only-render-item-when-relevant-content
new file mode 100644
index 0000000000..f791676a4d
--- /dev/null
+++ b/plugins/woocommerce/changelog/wooplug-3047-product-details-block-only-render-item-when-relevant-content
@@ -0,0 +1,4 @@
+Significance: patch
+Type: add
+
+Product Details: Hide empty accordion items on the front end.
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/BlockifiedProductDetails.php b/plugins/woocommerce/src/Blocks/BlockTypes/BlockifiedProductDetails.php
index 3b14c91d69..8179c0930b 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/BlockifiedProductDetails.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/BlockifiedProductDetails.php
@@ -2,6 +2,9 @@
 declare(strict_types=1);
 namespace Automattic\WooCommerce\Blocks\BlockTypes;

+use WP_Block;
+use WP_HTML_Tag_Processor;
+
 /**
  * BlockifiedProductDetails class.
  */
@@ -32,6 +35,72 @@ class BlockifiedProductDetails extends AbstractBlock {
 	 * @return string Rendered block output.
 	 */
 	protected function render( $attributes, $content, $block ) {
-		return $content;
+		return $this->hide_empty_accordion_items( $content, $block );
+	}
+
+	/**
+	 * Hide empty accordion items.
+	 *
+	 * @param string   $content Block content.
+	 * @param WP_Block $block Block instance.
+	 *
+	 * @return string Rendered block output.
+	 */
+	private function hide_empty_accordion_items( $content, $block ) {
+		$accordion_items = $this->find_accordion_items( $block->parsed_block );
+
+		if ( ! $accordion_items ) {
+			return $content;
+		}
+
+		$accordion_items_visibility = array_map(
+			function ( $item ) use ( $block ) {
+				$content_block          = end( $item['innerBlocks'] );
+				$rendered_content_block = ( new WP_Block( $content_block, $block->context ) )->render();
+				$p                      = new WP_HTML_Tag_Processor( $rendered_content_block );
+
+				return $p->next_tag( 'img' ) ||
+					$p->next_tag( 'iframe' ) ||
+					$p->next_tag( 'video' ) ||
+					$p->next_tag( 'meter' ) ||
+					! empty( wp_strip_all_tags( $rendered_content_block, true ) );
+			},
+			$accordion_items
+		);
+
+		$p = new WP_HTML_Tag_Processor( $content );
+
+		$counter = 0;
+		while ( $p->next_tag( array( 'class_name' => 'wp-block-woocommerce-accordion-item' ) ) ) {
+			if ( ! $accordion_items_visibility[ $counter ] ) {
+				$p->set_attribute( 'style', 'display:none;' );
+				$p->set_attribute( 'hidden', true );
+			}
+			++$counter;
+		}
+
+		return $p->get_updated_html();
+	}
+
+	/**
+	 * Find accordion items.
+	 *
+	 * @param array $block Block instance.
+	 *
+	 * @return array|false Accordion items.
+	 */
+	private function find_accordion_items( $block ) {
+		if ( 'woocommerce/accordion-group' === $block['blockName'] ) {
+			return $block['innerBlocks'];
+		}
+
+		foreach ( $block['innerBlocks'] as $inner_block ) {
+			$items = $this->find_accordion_items( $inner_block );
+			if ( $items ) {
+				return $items;
+			}
+		}
+
+		return false;
 	}
 }