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