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

Post excerpt: Add excerpt length control #44964

Merged
merged 22 commits into from
Feb 9, 2023
Merged

Conversation

carolinan
Copy link
Contributor

@carolinan carolinan commented Oct 14, 2022

What?

Provide a UI control to control the length of the excerpt.
Closes #34757

Currently there is no way to limit the length of the automatically generated excerpt without code.
It was requested in discussions in the issue that the feature should limit the length of both the user created and the automatically generated excerpts.

Description updated January 23.

Why?

To add the ability to control the excerpt length in a design.

How?

The PR adds a new block attribute to the post excerpt block called excerptLength. The default value is 55 words, to match the WordPress default length for excerpts.

An excerpt length control is added to the block sidebar. The control uses a RangeControl component with the min value of 10 and max value of 100.
The control limits the number of words that are displayed by the post excerpt block on the front.
It does not limit the number of words that are in the Excerpt panel in the post tab when editing a post.

The limitation is applied to the display of both auto generated and user-generated excerpts.
In index.php, the number of words is limited by passing get_the_excerpt and the excerptLength attribute through wp_trim_words.

In the block editor, outside of a query loop:

  • When the block is selected, the full text shows and is editable.
  • When it is deselected, the trimmed text shows.

In a query loop, the trimmed text shows.

Testing Instructions

Please test with both classic and block themes, and with a theme that filters the excerpt length.

  1. Create a new post and add a long paragraph.
  2. Add a post excerpt block.
  3. Open the block settings sidebar. Confirm that there is a range control combined with a numeric input field, with the label "max number of words".
  4. Change the value in the control.
  5. Deselect the block and confirm that the trimmed text shows, with the number of words matching the value in the control.
  6. Save and view the front, confirm that the excerpt displays the correct number of words.

Testing instructions for screen reader users

Create a new post.
Add a post excerpt block.
Enter a sample excerpt with more than ten words.
Press tab to move to the settings sidebar.
Move past the Posts tab.
In the Block tab, navigate forwards to the Settings panel.
Navigate past the Show link on new line option.
You should now find a new setting for the text length:
Using VoiceOver, I first hear the number of words, the label, and then the type of control:
"55, Max number of words, slider".
There are three ways to change the value:

  • Either use the arrow keys on the slider,
  • Tab forwards one step and use the arrow keys in the stepper,
  • Tab forwards one step from the slider and enter the number into the field in the stepper.

Change the value to 10.
Navigate back to the editor.
Activate the "read all" command or similar for the screen reader.
Confirm that the excerpt only includes the first ten words.
Save and view the post on the front.
Confirm that the excerpt only includes the first ten words.

@github-actions
Copy link

github-actions bot commented Oct 14, 2022

Size Change: +209 B (0%)

Total Size: 1.31 MB

Filename Size Change
build/block-library/index.min.js 199 kB +209 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.16 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 192 kB
build/block-editor/style-rtl.css 14.3 kB
build/block-editor/style.css 14.3 kB
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 90 B
build/block-library/blocks/archives/style.css 90 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 485 B
build/block-library/blocks/button/editor.css 485 B
build/block-library/blocks/button/style-rtl.css 532 B
build/block-library/blocks/button/style.css 532 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 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 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 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-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 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-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 253 B
build/block-library/blocks/file/style.css 254 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 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 76 B
build/block-library/blocks/heading/style.css 76 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/editor-rtl.css 829 B
build/block-library/blocks/image/editor.css 828 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 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/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
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 376 B
build/block-library/blocks/page-list/editor.css 376 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 458 B
build/block-library/blocks/query/editor.css 457 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 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 149 B
build/block-library/blocks/rss/editor.css 149 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 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 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 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.5 kB
build/block-library/editor.css 11.5 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.5 kB
build/block-library/style.css 12.5 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 50.4 kB
build/components/index.min.js 203 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/index.min.js 11.8 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.06 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.5 kB
build/edit-post/style-rtl.css 7.46 kB
build/edit-post/style.css 7.45 kB
build/edit-site/index.min.js 64.1 kB
build/edit-site/style-rtl.css 9.55 kB
build/edit-site/style.css 9.55 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.49 kB
build/edit-widgets/style.css 4.49 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.68 kB
build/editor/style.css 3.67 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 905 B
build/format-library/index.min.js 7.23 kB
build/format-library/style-rtl.css 598 B
build/format-library/style.css 597 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.79 kB
build/keycodes/index.min.js 1.88 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@skorasaurus skorasaurus added the [Block] Post Excerpt Affects the Post Excerpt Block label Oct 17, 2022
@skorasaurus

This comment was marked as outdated.

@carolinan

This comment was marked as outdated.

@carolinan

This comment was marked as outdated.

@skorasaurus

This comment was marked as outdated.

@carolinan

This comment was marked as outdated.

@carolinan

This comment was marked as outdated.

@carolinan

This comment was marked as outdated.

@carolinan carolinan added the [Type] Enhancement A suggestion for improvement. label Nov 22, 2022
@skorasaurus
Copy link
Member

Tested as of commit 86342e2 with ernesto theme and this function commented out

Create a new post, add a long paragraph.
Add a post excerpt block.
Confirm that there is a range control with the text "max number of words in excerpt".
Use the control and confirm that the excerpt displays the correct number of words.
Save and view the front, confirm that the excerpt displays the correct number of words.

Works as expected.
Note: the post excerpt block's content were empty as indicated in the image below until I saved a draft of the post although I would expect that to be the behavior.

@carolinan

This comment was marked as outdated.

@richtabor
Copy link
Member

I first needed to select another block before I could use virtual navigation to see the truncated words.

Is there a way we could indicate what's truncated while selected? Like, would wrapping what's truncated in the markup be helpful for a11y?

If so we could make the wrapped (i.e. truncated) text slightly transparent (maybe 90%) for a visual, and perhaps have assistive text indicating what is truncated, or where the divide exists. Though I'm not 100% that this would work. @alexstine?

@alexstine
Copy link
Contributor

@richtabor That would be nice but it is likely out of scope for this PR. The whole issue in general is well out of scope of the PR but this is one of Gutenbergs many issues with not communicating contextual info to screen readers. You either have to know exactly that selecting another block, going in to virtual mode, and using down arrow will read the truncated text or we as devs can figure out how to make sure screen reader users do not have less of an experience.

Either way, both of these probably best belong in a follow-up. Do not want to hijack this PR with a ton of extra work.

@aristath
Copy link
Member

aristath commented Feb 8, 2023

I'm reading the comments in this issue and I have a question... Why is this issue blocked? There are small things that can be improved in follow-up PRs, sure... That's always the case with all PRs. But what's actually blocking us from adding the excerpt-length control here? 🤔

@alexstine
Copy link
Contributor

@aristath Nothing from my side. I was simply making a point to say that this should be followed-up on as the experience is less than great for screen reader users.

Thanks.

@richtabor
Copy link
Member

I was simply making a point to say that this should be followed-up on as the experience is less than great for screen reader users.

Agreed! I just don't want the ideas to fall into the ether :)

I think this solution is fine, though follow-ups for improved screen reader (and visual) indicators for what's truncated would be good — so you don't have to de-select the block, to understand where the split happens.

@carolinan
Copy link
Contributor Author

I have an idea, what if the block had a preview option like the HTML block. With a preview button in the toolbar.

@alexstine
Copy link
Contributor

@carolinan Good idea. We'll still need to figure out how to make the preview mode accessible at some point, but implementing a base model would be a good start. Once preview is used in multiple places, it should be higher on priority list to improve. It is not unusable currently but it is not very discoverable for users due to some odd issues with tabindex on the block wrapper.

@richtabor
Copy link
Member

I have an idea, what if the block had a preview option like the HTML block. With a preview button in the toolbar.

I’d rather merge and circle back with something like the previous idea, where you wouldn’t have to do anything to understand what’s truncated.

@carolinan
Copy link
Contributor Author

Then, let's click the button 😄

@carolinan carolinan merged commit 86d527c into trunk Feb 9, 2023
@carolinan carolinan deleted the try/excerpt-length-setting branch February 9, 2023 03:07
@github-actions github-actions bot added this to the Gutenberg 15.2 milestone Feb 9, 2023
@DaisyOlsen DaisyOlsen added the [Package] Block library /packages/block-library label Feb 14, 2023
Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

I haven't reviewed edit.js much because I'm mainly worried about the PHP issues, which have introduced some bugs here and have correctly triggered test failures in large multisites like WP.com. I think that is the top priority.

That said, the block experience inside the editor also needs to be reviewed more closely. For instance, just from a cursory read and a quick test:

  • Two Undo levels are introduced due to the setAttributes( … ); setExcerpt( … ); sequence of calls. See __unstableMarkAutomaticChange for a likely fix.
  • As I select in and out of the block, the block will seemingly fail at times, returning "No post excerpt found".
  • Ellipsis are appended even when there is no trimming needed.
  • The interaction between the excerptLength attribute and the fact that a user can edit the excerpt directly is strange.

Comment on lines +86 to +88
if ( is_admin() ||
defined( 'REST_REQUEST' ) ||
'REST_REQUEST' ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

This is very wide net to cast which will affect all instances of excerpt filtering, regardless of source (Post Excerpt block, Latest Post block, traditional theme templates, etc.) — see #48403.

Why not surround the rendering logic in render_block_core_post_excerpt with a pair of add_filter / remove_filter calls?

Copy link
Contributor

Choose a reason for hiding this comment

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

What I meant by my suggestion was something like this (untested):

function render_block_core_post_excerpt( $attributes, $content, $block ) {
    global $_block_core_post_excerpt_length;

    // ...

    $_block_core_post_excerpt_length = int( $attributes['excerptLength'] );
    add_filter( 'excerpt_length', '_block_core_post_excerpt_filter', PHP_INT_MAX );
    get_the_excerpt();
    remove_filter( 'excerpt_length', '_block_core_post_excerpt_filter' );

    // ...

with

function _block_core_post_excerpt_filter() {
  global $_block_core_post_excerpt_length;
  return $_block_core_post_excerpt_length;
}

The whole global dance is a possible way to work with the fact that $attributes['excerptLength'] is dynamic.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

There is already a pull request open that tries to address this.

Copy link
Contributor

Choose a reason for hiding this comment

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

There is already a pull request open that tries to address this.

Which?

Choose a reason for hiding this comment

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

Not sure if it's the one @carolinan was referring to, but I opened #48598 when I discovered that my excerpts outside of the block editor were not obeying my own excerpt_length filter and traced it back to the line you referenced here:

This is very wide net to cast which will affect all instances of excerpt filtering, regardless of source (Post Excerpt block, Latest Post block, traditional theme templates, etc.) — see #48403.

My last revision in my PR did something like what you suggest here:

Why not surround the rendering logic in render_block_core_post_excerpt with a pair of add_filter / remove_filter calls?

But it only applies to the rendered block on the page; it is not reflected in the editor. The condition on REST_REQUEST is the part that makes it work in the editor. I was also concerned that condition casts too wide a net and raised the question in my PR, but received no feedback on that point.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, that is the PR I was thinking of

Comment on lines +27 to +31
$excerpt_length = $attributes['excerptLength'];
if ( isset( $excerpt_length ) ) {
$excerpt = wp_trim_words( get_the_excerpt(), $excerpt_length );
} else {
$excerpt = get_the_excerpt();
Copy link
Contributor

Choose a reason for hiding this comment

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

Why not inject a filter with the dynamic excerpt length and just call get_the_excerpt, which is already filtered by wp_trim_excerpt?

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 don't believe I tried that during the development, so there is no obvious reason for not trying that as a possible improvement in a separate PR.

Choose a reason for hiding this comment

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

The addition of the call to "wp_trim_words" will remove any HTML that users have put into a custom excerpt by over-riding get_the_excerpt. Was this deliberate, or an unfortunate by-product?

Copy link
Contributor

Choose a reason for hiding this comment

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

The addition of the call to "wp_trim_words" will remove any HTML that users have put into a custom excerpt by over-riding get_the_excerpt. Was this deliberate, or an unfortunate by-product?

I believe that was accidental, so thank you for the flag.

Copy link

@frzsombor frzsombor Sep 14, 2023

Choose a reason for hiding this comment

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

Workaround to bypass the wp_trim_words function:

function fzs_filter_metadata_registration( $metadata ) {
    if ($metadata['name'] === 'core/post-excerpt') {
	unset($metadata['attributes']['excerptLength']);
    }
    return $metadata;
};
add_filter( 'block_type_metadata', 'fzs_filter_metadata_registration' );

Choose a reason for hiding this comment

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

Thank you - that's a really helpful workaround for now

trimmedExcerpt = rawOrRenderedExcerpt.trim().split( '', excerptLength );
}

trimmedExcerpt = trimmedExcerpt + '...';
Copy link
Contributor

Choose a reason for hiding this comment

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

I'll ask the same thing Rich asked.

@mcsf
Copy link
Contributor

mcsf commented Mar 2, 2023

A very important piece of history is #33366, which removed the wordCount feature due to conflicts with pre-existing excerpt filters. I had completely forgotten about that PR.

So the obligatory question is: have we worked around the issues that applied to #33366 in 2021? How? Or are they no longer applicable?

@carolinan
Copy link
Contributor Author

The PR does not use the rendered content like the previous version, only the excerpt.

@carolinan
Copy link
Contributor Author

carolinan commented Mar 2, 2023

As I select in and out of the block, the block will seemingly fail at times, returning "No post excerpt found".

I don't believe that is introduced in this PR. I keep seeing this on WP trunk without Gutenberg (pre 6.2) on different installs (different hosts so different setups). I can't reproduce it consistenly which is why I have not personally created an issue for it. I know this is not the technical answer you are looking for but as a user I experience it as if the excerpt is not being loaded fast enough.

The interaction between the excerptLength attribute and the fact that a user can edit the excerpt directly is strange.

It is, and that is why there has been so many iterations, and why I have been asking for the option to only be applied to the excerpt when it is not editable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Post Excerpt Affects the Post Excerpt Block Needs User Documentation Needs new user documentation [Package] Block library /packages/block-library [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Change excerpt length in post excerpt block