Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Comment Template: Fix comment pagination with nested replies. #38187

Merged
merged 25 commits into from
Feb 16, 2022

Conversation

DAreRodz
Copy link
Contributor

@DAreRodz DAreRodz commented Jan 24, 2022

Description

Closes #37153

Improve the Comment Template block to simplify pagination handling when nested comments are active. It uses both the WordPress discussion settings and the block props.

The implementation extends the REST API to mark comment children as 'embeddable', and only shows two levels of nested comments. Showing more than two levels will be addressed in another PR.

There are some bugs that should be addressed as well (I'll open issues for them):

  • Comments-Pagination-Next and Comments-Pagination-Previous blocks are using WP functions that use the WP Discussion Settings under the hood, rendering a wrong link when the default page attribute of the Comment Loop block doesn’t coincide with the corresponding WP setting.
  • When nested comments are disabled, replies are rendered in the root of the comment tree and again as children of their respective parent.

How has this been tested?

Editor, with context

With.context.mov

Editor, without context

Without.context.mov

Types of changes

  • Enhancement

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).
  • I've updated related schemas if appropriate.

@DAreRodz DAreRodz added [Type] Enhancement A suggestion for improvement. REST API Interaction Related to REST API [Block] Comments Affects the Comments Block - formerly known as Comments Query Loop [Block] Comment Template Affects the Comment Template Block labels Jan 24, 2022
@DAreRodz DAreRodz self-assigned this Jan 24, 2022
@github-actions
Copy link

github-actions bot commented Jan 24, 2022

Size Change: +1.5 kB (0%)

Total Size: 1.15 MB

Filename Size Change
build/admin-manifest/index.min.js 1.24 kB +114 B (+10%) ⚠️
build/block-editor/index.min.js 142 kB +441 B (0%)
build/block-editor/style-rtl.css 14.8 kB -16 B (0%)
build/block-editor/style.css 14.8 kB -16 B (0%)
build/block-library/blocks/image/editor-rtl.css 731 B -79 B (-10%) 👏
build/block-library/blocks/image/editor.css 730 B -79 B (-10%) 👏
build/block-library/blocks/image/style-rtl.css 518 B +18 B (+4%)
build/block-library/blocks/image/style.css 523 B +20 B (+4%)
build/block-library/editor-rtl.css 10.1 kB -72 B (-1%)
build/block-library/editor.css 10.1 kB -73 B (-1%)
build/block-library/index.min.js 168 kB +247 B (0%)
build/block-library/style-rtl.css 11.3 kB +21 B (0%)
build/block-library/style.css 11.3 kB +21 B (0%)
build/blocks/index.min.js 46.4 kB +11 B (0%)
build/core-data/index.min.js 14 kB +607 B (+5%) 🔍
build/edit-post/index.min.js 30 kB +45 B (0%)
build/edit-post/style-rtl.css 7.19 kB +15 B (0%)
build/edit-post/style.css 7.18 kB +15 B (0%)
build/edit-site/index.min.js 42.2 kB +277 B (+1%)
build/edit-site/style-rtl.css 7.23 kB +7 B (0%)
build/edit-site/style.css 7.22 kB +8 B (0%)
build/editor/index.min.js 38.4 kB -30 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.25 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.61 kB
build/block-library/blocks/gallery/style.css 1.61 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 1.98 kB
build/block-library/blocks/navigation/editor.css 1.99 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 402 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 201 B
build/block-library/blocks/quote/style.css 201 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 214 B
build/block-library/blocks/tag-cloud/style.css 215 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 921 B
build/block-library/common.css 919 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 676 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/index.min.js 215 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/compose/index.min.js 11.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.47 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-widgets/index.min.js 16.7 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.17 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 3.32 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.98 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.25 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.92 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@DAreRodz DAreRodz force-pushed the update/comment-template-pagination-with-replies branch from 1f8011e to 39a9318 Compare January 31, 2022 19:18
@DAreRodz
Copy link
Contributor Author

Hey, just a quick update here. Things are not properly working yet --there are some discrepancies between the editor and the frontend versions--, but these are some things I've done so far:

  • When comments are fetched from the REST API, they come with children embedded. The code responsible for that is included in the /lib/compat/experimental/blocks.php file. BTW, I have a gut feeling that this code can be improved.

    if ( ! function_exists( 'gutenberg_rest_comment_set_children_as_embeddable' )) {
    /**
    * Mark the `children` attr of comments as embeddable so they can be included in
    * REST API responses without additional requests.
    *
    * @return void
    */
    function gutenberg_rest_comment_set_children_as_embeddable() {
    add_filter( 'rest_prepare_comment', function ( $response ) {
    $links = $response->get_links();
    if ( isset( $links['children'] ) ) {
    $href = $links['children'][0]['href'];
    $response->remove_link( 'children', $href );
    $response->add_link( 'children', $href, array( 'embeddable' => true ) );
    }
    return $response;
    } );
    }
    }
    add_action( 'rest_api_init', 'gutenberg_rest_comment_set_children_as_embeddable');

  • I've created a hook called useCommentsQueryArgs, which is kind of the same function as build_comment_query_vars_from_block, but in React. It generates the new query vars for the REST API depending on the different attributes of the block. There is a tricky thing with the default_comments_page option, though. Depending on the value of this option, the block needs to request either the first (newest) or the last (oldest) page of comments. In the second case, the only way to know the index of the last page is to make a previous request and read the X-WP-TotalPages header of the response. For this purpose, I created a hook called useDefaultPage that returns the correct index once it is fetched.

  • I've also added a new attribute to the Comments Query Loop block to manually set the default_comments_page setting. To handle that setting in the Comment Template when it is rendered in the editor.

Again, this is not working yet, I messed up something with the comments order, but it's not far from working. 😄

And I still have to add a "show more" button if users want to show more than 2 levels of nested comments, still figuring out a proper way of doing so.

@michalczaplinski
Copy link
Contributor

I ll have a deeper look tomorrow, but awesome work so far! 🚀

@DAreRodz
Copy link
Contributor Author

DAreRodz commented Feb 1, 2022

Oh, after some investigation, I think we are not using the comment_order option correctly. 🕵️

That option does not define the order in which the comments should be queried, but shown in the comment list. Looking at what the PHP template does, inside the wp_list_comments function, comment_order is assigned to a property named reverse_top_level, which is passed to the "walker" that generates the comment tree.

/wp-includes/comment-template.php#L2238-L2240

	if ( null === $parsed_args['reverse_top_level'] ) {
		$parsed_args['reverse_top_level'] = ( 'desc' === get_option( 'comment_order' ) );
	}

The reverse_top_level property (if defined) is used later to just reverse the top level comments.

/wp-includes/class-wp-walker.php#L361-L362

		if ( ! empty( $args[0]['reverse_top_level'] ) ) {
			$top_level_elements = array_reverse( $top_level_elements );

Using comment_order as the order argument of WP_Comments_Query(what we are doing) don't reverse the top comments, reverses all the comments before pagination, so it reverses the pages as well.

@gziolo
Copy link
Member

gziolo commented Feb 2, 2022

Oh, after some investigation, I think we are not using the comment_order option correctly.

Yes, you might be correct. There was always something off when I was testing it in the past 🙈

Screenshot 2022-02-02 at 12 42 31

Does it mean that last vs first setting is what translates to asc vs desc. older vs newer would change the sorting on the individual page. Super complicated. How we didn't get it earlier together with @c4rl0sbr4v0 😅

@cbravobernal
Copy link
Contributor

Does it mean that last vs first setting is what translates to asc vs desc. older vs newer would change the sorting on the individual page. Super complicated. How we didn't get it earlier together with @c4rl0sbr4v0 😅

Maybe one reason could be this:
In wp-includes/comment-template.php last/first is only used to set the query page. Not related with asc or desc

$parsed_args['page'] = ( 'newest' === get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1;

Anyway, I completely missed the reverse_top_level attribute. This comments settings are crazy 😆

// Generate a tree structure of comment IDs.
const { commentTree } = useCommentTree(
order === 'desc'
? topLevelComments?.slice().reverse()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor note, I think we typically prefer array spread over .slice() for copying:

Suggested change
? topLevelComments?.slice().reverse()
? [ ...topLevelComments ].reverse()

(Not that it's a hard-and-fast rule 😅 )

It would look a bit less nice if we have to take care of the null case, but maybe we can move the commentTree definition below the early return?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, sure! The only reason I opted for that syntax was that topLevelComments could not exist, but I can refactor the code to avoid that case. I prefer array spread as well. 😆

Copy link
Contributor

@michalczaplinski michalczaplinski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome work @DAreRodz ! 👏

Just tested it and it works well! Do you have an idea on how you want to handle comments more than 2 levels deep?

const [ children ] = _embedded?.children || [];
return {
commentId: id,
children: children?.map( ( child ) => ( {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nitpick: no need for the ?. - children is never falsy because of the _embedded?.children || []; above.

@DAreRodz
Copy link
Contributor Author

DAreRodz commented Feb 3, 2022

Do you have an idea on how you want to handle comments more than 2 levels deep?

Not yet, I haven't figured out a good way to solve that. Any idea is more than welcome. 😄

@DAreRodz
Copy link
Contributor Author

DAreRodz commented Feb 8, 2022

Status update

  • In the editor, the comments are requested with _embed: true. That makes the children of top-level comments to be included in the response, using a single REST API call.

  • In the frontend, I fixed some inconsistencies while showing paginated comments using either the block attributes or the WP options (through the comments/inherit attribute). Those issues were not only in the Comment Query Loop block, but in the Comment Pagination Numbers and Comment Pagination Next blocks as well, and one of the issues was a bit sneaky.

  • I still have to make all the tests pass, ensure that everything works as expected, and come up with an idea to show more than 2 levels of nested comments in the editor.

@cbravobernal
Copy link
Contributor

  • and come up with an idea to show more than 2 levels of nested comments in the editor

Maybe you prefer to open a new issue just for that improvement. That way we can land the comment pagination improvement.

@DAreRodz
Copy link
Contributor Author

DAreRodz commented Feb 8, 2022

Maybe you prefer to open a new issue just for that improvement. That way we can land the comment pagination improvement.

Oh yes, that would be better than waiting for that idea to be implemented and tested before merging these changes. 💯

@DAreRodz DAreRodz force-pushed the update/comment-template-pagination-with-replies branch from 26d56b4 to 91e7a7a Compare February 13, 2022 12:36
@DAreRodz DAreRodz marked this pull request as ready for review February 14, 2022 22:54
Comment on lines +24 to +34
const defaultPageOptions = [
{
label: __( 'Newest' ),
value: 'newest',
},
{
label: __( 'Oldest' ),
value: 'oldest',
},
];

Copy link
Contributor

@cbravobernal cbravobernal Feb 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right now on Discussion Settings say:
Last or First page to display by default.

This could make confusion to the user, although, to be honest, Discussion settings are also confusing 😓

How could we improve the naming?

cc: @jasmussen @jameskoster

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have the same feeling. I ended using oldest and newset because those are the values used internally, but I'm not sure which option is clearer from the user's perspective. For me, it's like using first or last instead would be equivalent, although it doesn't give you information about what comments are going to be shown (oldest comments are in the first or the last page? 🤷 ).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took it for a spin:
comments

I don't see any "Last or First page to display by default" on this page:

Screenshot 2022-02-16 at 09 04 03

Am I looking in the wrong place?

Right now it says "Default page", that seems okay to me. It's not super clear, but it's also a rare change to tweak. I'd be happy to start simple and then we can rephrase if it becomes necessary, for example to add help text.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's all very confusing because and I'm still not sure how it exactly works 🤣

I think it's the following:

  1. When you select the last page displayed by default then you sort all top-level comments by date where the newest comments are on the first page.
  2. When you select the older comments at the top of each page, then it reverses the order of comments but only on individual pages.

So maybe we should have:

  1. Order pages by...
  2. Order items on the page by...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it definitely necessary that a single comment loop can override the global discussion settings? 🤔 Comments are a fairly universal concept – doesn't it seem unlikely that a site would want a different treatment between post and page comments?

I worry that this could encourage folks to customise all comment loops, at which point the global settings don't actually do anything. That could lead to some confusing UX.

If we're committed to this change, should we update the language on the global discussion settings to clarify that the ordering and default page options are defaults, and might be overwritten by the theme / template?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments are a fairly universal concept – doesn't it seem unlikely that a site would want a different treatment between post and page comments?

You're right, although it would be great to also consider other cases, like adding a list of “latest comments” somewhere in your page, or “top comments”, or whatever…

Well, now I'm not sure if it would be better to create custom blocks for those specific cases. 🤔

If we're committed to this change, should we update the language on the global discussion settings to clarify that the ordering and default page options are defaults, and might be overwritten by the theme / template?

Wouldn't it be simpler if we warn in the block settings that you're overwriting the global discussion settings? Just asking, I don't have any strong opinion here. 😄

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, although it would be great to also consider other cases, like adding a list of “latest comments” somewhere in your page, or “top comments”, or whatever…

That's a good point, even held up against Jay's also excellent point. A few thoughts:

  • Perhaps the toggle should be renamed "Inherit discussion settings", and we add help-text below that says something like "Use globally defined sort order and comment settings. You can configure these in [link]Discussion Settings[/link]".
  • We start with less: perhaps we start with just "Items per page", and then instead of two options for oldest vs. newest, we make a single toggle: "Show newest comments first", untoggled by default. We'd then use this setting for both "Order by" and "Default page".

Keeping in mind we can always make it more granular as we go, it seems like this might also be an opportunity to simplify.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • [...] and we add help-text below that says something like "Use globally defined sort order and comment settings. You can configure these in [link]Discussion Settings[/link]".

That's great, I really like that suggestion. 😊

  • [...] we make a single toggle: "Show newest comments first", untoggled by default. We'd then use this setting for both "Order by" and "Default page".

Yup, that would be simpler from the user perspective, and we can always add more features/complexity in the future.

I don't mind creating new PRs to address these changes, if we all agree on that. 👀

cc @gziolo @jameskoster @c4rl0sbr4v0 @michalczaplinski

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, now I'm not sure if it would be better to create custom blocks for those specific cases.

Yes I considered things like Reviews in WooCommerce as well (which are just WP comments). They feel like variations of the comment query block to me. Similar to how the "Posts List" block is a variation of the Query block.

Wouldn't it be simpler if we warn in the block settings that you're overwriting the global discussion settings?

I don't think so, from the UX perspective. To be clear I'm thinking of the other side of this flow. Consider an end user who installs a theme that elects not to inherit the global settings in each instance of the comment query loop block. When that user customises options in the global discussion settings, their changes will not be reflected on the frontend, and they will have no feedback explaining why.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider an end user who installs a theme that elects not to inherit the global settings in each instance of the comment query loop block. When that user customises options in the global discussion settings, their changes will not be reflected on the frontend, and they will have no feedback explaining why.

That's a good point, I haven't thought of that. 🤔

I think it's better to continue this conversation in a different issue, I've created one: #38864

Copy link
Contributor

@cbravobernal cbravobernal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks good to me. There is some discussion to approach, but I think the PR is improving the behaviour of comments, and we could address the conversation of settings in smaller PRs.

@DAreRodz DAreRodz merged commit 805cc5a into trunk Feb 16, 2022
@DAreRodz DAreRodz deleted the update/comment-template-pagination-with-replies branch February 16, 2022 19:00
@github-actions github-actions bot added this to the Gutenberg 12.7 milestone Feb 16, 2022
@cbravobernal cbravobernal added [Package] Block library /packages/block-library and removed [Block] Comments Affects the Comments Block - formerly known as Comments Query Loop labels Feb 26, 2022
@cbravobernal cbravobernal changed the title Comment Template: Optimize comment pagination with nested replies Comment Template: Fix comment pagination with nested replies. Feb 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Comment Template Affects the Comment Template Block [Package] Block library /packages/block-library REST API Interaction Related to REST API [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Comment Template: Optimize the way pagination is handled for comments with replies
7 participants