wp/wp-includes/blocks/comment-template.php
changeset 19 3d72ae0968f4
child 21 48c4eec2b7e6
equal deleted inserted replaced
18:be944660c56a 19:3d72ae0968f4
       
     1 <?php
       
     2 /**
       
     3  * Server-side rendering of the `core/comment-template` block.
       
     4  *
       
     5  * @package WordPress
       
     6  */
       
     7 
       
     8 /**
       
     9  * Function that recursively renders a list of nested comments.
       
    10  *
       
    11  * @global int $comment_depth
       
    12  *
       
    13  * @param WP_Comment[] $comments        The array of comments.
       
    14  * @param WP_Block     $block           Block instance.
       
    15  * @return string
       
    16  */
       
    17 function block_core_comment_template_render_comments( $comments, $block ) {
       
    18 	global $comment_depth;
       
    19 
       
    20 	if ( empty( $comment_depth ) ) {
       
    21 		$comment_depth = 1;
       
    22 	}
       
    23 
       
    24 	$content = '';
       
    25 	foreach ( $comments as $comment ) {
       
    26 
       
    27 		$block_content = ( new WP_Block(
       
    28 			$block->parsed_block,
       
    29 			array(
       
    30 				'commentId' => $comment->comment_ID,
       
    31 			)
       
    32 		) )->render( array( 'dynamic' => false ) );
       
    33 
       
    34 		$children = $comment->get_children();
       
    35 
       
    36 		/*
       
    37 		 * We need to create the CSS classes BEFORE recursing into the children.
       
    38 		 * This is because comment_class() uses globals like `$comment_alt`
       
    39 		 * and `$comment_thread_alt` which are order-sensitive.
       
    40 		 *
       
    41 		 * The `false` parameter at the end means that we do NOT want the function
       
    42 		 * to `echo` the output but to return a string.
       
    43 		 * See https://developer.wordpress.org/reference/functions/comment_class/#parameters.
       
    44 		 */
       
    45 		$comment_classes = comment_class( '', $comment->comment_ID, $comment->comment_post_ID, false );
       
    46 
       
    47 		// If the comment has children, recurse to create the HTML for the nested
       
    48 		// comments.
       
    49 		if ( ! empty( $children ) ) {
       
    50 			$comment_depth += 1;
       
    51 			$inner_content  = block_core_comment_template_render_comments(
       
    52 				$children,
       
    53 				$block
       
    54 			);
       
    55 			$block_content .= sprintf( '<ol>%1$s</ol>', $inner_content );
       
    56 			$comment_depth -= 1;
       
    57 		}
       
    58 
       
    59 		$content .= sprintf( '<li id="comment-%1$s" %2$s>%3$s</li>', $comment->comment_ID, $comment_classes, $block_content );
       
    60 	}
       
    61 
       
    62 	return $content;
       
    63 
       
    64 }
       
    65 
       
    66 /**
       
    67  * Renders the `core/comment-template` block on the server.
       
    68  *
       
    69  * @param array    $attributes Block attributes.
       
    70  * @param string   $content    Block default content.
       
    71  * @param WP_Block $block      Block instance.
       
    72  *
       
    73  * @return string Returns the HTML representing the comments using the layout
       
    74  * defined by the block's inner blocks.
       
    75  */
       
    76 function render_block_core_comment_template( $attributes, $content, $block ) {
       
    77 	// Bail out early if the post ID is not set for some reason.
       
    78 	if ( empty( $block->context['postId'] ) ) {
       
    79 		return '';
       
    80 	}
       
    81 
       
    82 	if ( post_password_required( $block->context['postId'] ) ) {
       
    83 		return;
       
    84 	}
       
    85 
       
    86 	$comment_query = new WP_Comment_Query(
       
    87 		build_comment_query_vars_from_block( $block )
       
    88 	);
       
    89 
       
    90 	// Get an array of comments for the current post.
       
    91 	$comments = $comment_query->get_comments();
       
    92 	if ( count( $comments ) === 0 ) {
       
    93 		return '';
       
    94 	}
       
    95 
       
    96 	$comment_order = get_option( 'comment_order' );
       
    97 
       
    98 	if ( 'desc' === $comment_order ) {
       
    99 		$comments = array_reverse( $comments );
       
   100 	}
       
   101 
       
   102 	$wrapper_attributes = get_block_wrapper_attributes();
       
   103 
       
   104 	return sprintf(
       
   105 		'<ol %1$s>%2$s</ol>',
       
   106 		$wrapper_attributes,
       
   107 		block_core_comment_template_render_comments( $comments, $block )
       
   108 	);
       
   109 }
       
   110 
       
   111 /**
       
   112  * Registers the `core/comment-template` block on the server.
       
   113  */
       
   114 function register_block_core_comment_template() {
       
   115 	register_block_type_from_metadata(
       
   116 		__DIR__ . '/comment-template',
       
   117 		array(
       
   118 			'render_callback'   => 'render_block_core_comment_template',
       
   119 			'skip_inner_blocks' => true,
       
   120 		)
       
   121 	);
       
   122 }
       
   123 add_action( 'init', 'register_block_core_comment_template' );