Automattic\WooCommerce\Blocks\BlockTypes\Reviews

ProductReviewTemplate::block_product_review_template_render_commentsprotectedWC 6.3.0

Function that recursively renders a list of nested reviews.

Method of the class: ProductReviewTemplate{}

No Hooks.

Returns

String.

Usage

// protected - for code of main (parent) or child class
$result = $this->block_product_review_template_render_comments( $comments, $block ): string;
$comments(WP_Comment[]) (required)
The array of comments.
$block(WP_Block) (required)
Block instance.

Changelog

Since 6.3.0 Introduced.
Since 6.3.0 Changed render_block_context priority to 1.

ProductReviewTemplate::block_product_review_template_render_comments() code WC 10.8.1

protected function block_product_review_template_render_comments( array $comments, WP_Block $block ): string {
	$content = '';

	foreach ( $comments as $comment ) {
		if ( ! $comment instanceof WP_Comment ) {
			continue;
		}

		$comment_id           = $comment->comment_ID;
		$filter_block_context = static function ( $context ) use ( $comment_id ) {
			$context['commentId'] = $comment_id;
			return $context;
		};

		/*
		 * We set commentId context through the `render_block_context` filter so
		 * that dynamically inserted blocks (at `render_block` filter stage)
		 * will also receive that context.
		 *
		 * Use an early priority so that other 'render_block_context' filters
		 * have access to the values.
		 */
		add_filter( 'render_block_context', $filter_block_context, 1 );

		/*
		 * We construct a new WP_Block instance from the parsed block so that
		 * it'll receive any changes made by the `render_block_data` filter.
		 */
		$block_content = ( new WP_Block( $block->parsed_block ) )->render( array( 'dynamic' => false ) );

		remove_filter( 'render_block_context', $filter_block_context, 1 );

		$children = $comment->get_children();

		/*
		* We need to create the CSS classes BEFORE recursing into the children.
		* This is because comment_class() uses globals like `$comment_alt`
		* and `$comment_thread_alt` which are order-sensitive.
		*
		* The `false` parameter at the end means that we do NOT want the function
		* to `echo` the output but to return a string.
		* See https://developer.wordpress.org/reference/functions/comment_class/#parameters.
		*/
		$comment_classes = comment_class(
			'',
			(int) $comment->comment_ID,
			(int) $comment->comment_post_ID,
			false
		);

		// If the comment has children, recurse to create the HTML for the nested comments.
		if ( ! empty( $children ) ) {
			$inner_content  = $this->block_product_review_template_render_comments(
				$children,
				$block,
			);
			$block_content .= sprintf( '<ol>%1$s</ol>', $inner_content );
		}

		$content .= sprintf( '<li id="comment-%1$s" %2$s>%3$s</li>', $comment->comment_ID, $comment_classes, $block_content );
	}

	return $content;
}