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;
}
}