WordPress / gutenberg

The Block Editor project for WordPress and beyond. Plugin is available from the official repository.
https://wordpress.org/gutenberg/
Other
10.57k stars 4.22k forks source link

Document structure and stats do not consistently process synced patterns (aka reusable blocks) #33079

Open mrwweb opened 3 years ago

mrwweb commented 3 years ago

Preface: This behaves like a regression for the fix that closed #12042 and #11744.

Description

Step-by-step reproduction instructions

  1. Make a new page
  2. Put some content on the page including multiple paragraphs and headings
  3. Note the Document Outline
  4. Turn at least one heading and paragraph of that content into a reusable block
  5. Note the change to the Document Outline

Expected behaviour

Document Outline reflects entire page content regardless of whether it includes a reusable block.

Actual behaviour

Document outline, word count, and character count exclude content in reusable blocks

Screenshots

Page content with four headings List view of page showing two headings on page and two headings in a reusable block Document Outline showing incorrect word, character, and outline. Showing correct heading and block count

WordPress information

Device information

kathrynwp commented 2 years ago

I can still replicate this with:

WordPress 6.0.1 No plugins active

Initial Document Outline

Add_New_Page_‹_Self-hosted_Test_—_WordPress

Outline After One Heading & One Paragraph made into a Reusable Block

Add_New_Page_‹_Self-hosted_Test_—_WordPress

cbirdsong commented 1 year ago

I can confirm this is still an issue in Wordpress 6.3.

jordesign commented 1 year ago

Confirming this is still true testing WP6.4 RC2 as well - headings and text within Synced patterns are not registered in the outline.

afercia commented 9 months ago

This was also reported in https://github.com/WordPress/gutenberg/issues/51909, for the sunced patterns.

The word and characters count is still incorrect on current trunk version 17.7.0. See screenshot below.

Removing the Low priority label as I think this should be fixed soon. Introducing features that break other existing features and keeping showing users very evident wrong inforation in the user interface is less than ideal. I'm not sure providing users with broken functionality helps with increasing trust with the editor.

Screenshot 2024-02-20 at 09 22 36

afercia commented 9 months ago

After some quick testing, seems that on current trunk headings within synced patterns are now correctly parsed and added in the document outline. See animated GIF below, where after page refresh the synced pattern is fetched and when loaded the additional heading within the pattern is added to the document outline.

Some more extended testing would be welcome.

synced pattern outline

afercia commented 5 months ago

Update: testing on latest trunk 18.6.0-rc.1 this appears to still (again?) be a problem. Headings within Synced Patterens aren't included in the document outline. Which makes this feature visibly not fully functional and it's in this state since a while. I would appreciate this issue to get some more priority as it's a buggy functionality visible to all users.

In the GIF below:

headings within patterns

mrwweb commented 5 months ago

Which makes this feature visibly not fully functional

💯 This feels like a serious bug and one that hasn't been addressed for years now. It should ideally be addressed holistically to resolve both this issue and #5037 at the same time.

It seems like the Document Outline needs to reflect the actual post content so the heading outline includes synced patterns as well as headings in custom blocks. Without that, the heading outline is frequently wrong, potentially providing an accessibility false positive in the outline.

afercia commented 5 months ago

It seems like the Document Outline needs to reflect the actual post content so the heading outline includes synced patterns as well as headings in custom blocks.

I'd totally agree this feature needs to be rethinked. I'm not sure it can be based on the block type. To provide a fully correct outline, this feature needs to be aware of all the headings that are actually rendered, even if they come from, for example, shortcodes (besids patterns, custom blocks, stc.).

afercia commented 2 weeks ago

Looking back into this issue after conversation with @artemiomorales at Roma Core Days 2024. I can still reproduce this problem and it's even a broader issue now as the document outline doesn't sync after other updates of the content for example when binding a heading content to a source.

Maybe the only way to reliably solve the overall issue would be soething like an action components can subscribe to that signals 'content has been updated'. When the editor signals a content update, other components, also the ones provided by plugins, may do their things.

A few cases that can be reproduced on current trunk:

1 Synced patterns

Screenshot:

Image

To my understanding, a synced pattern in the post markup is only a reference e.g. <!-- wp:block {"ref":14285} /--> so there's actually no content in the post content that the editor itself or plugins can fetch. This appears to be an architectural problem because there are many cases where the editor itself or plugins would need to get the actual content.

2 Bound headings (and more in general any bound block) via the Bindings API.

Screenshot:

Image

To my understanding, the post content still contains the original content so that the editor itself and plugins may not be aware the actual rendered content has updated. In the example below, the block markup still has the original heading content First heading while the actual rendered content comes from the bound post meta.

<!-- wp:heading {"metadata":{"bindings":{"content":{"source":"core/post-meta","args":{"key":"text_short"}}}}} -->
<h2 class="wp-block-heading">First heading</h2>
<!-- /wp:heading -->

This appears to be a broader issue and applies to other block attributes as well e.g. the alt text of an image, the content of buttons and any other block attribute value the editor itself or plugins may want to use in other components.

3 Plugins that need to get the actually rendered content after any update to run their things, e.g. Yoast SEO or other plugins. Cc @enricobattocchi

Considering the two cases above and other potential cases in the future, the post content may not contain the actual content any longer. It may only contain references to other posts or references to sources.

However, some functionalities of the editor itseld and plugisn may need to fetch the actual content, and may need to fetch it 'live' after any update.