[wp-trac] [WordPress Trac] #53816: Overview: Refactor the widgets read/write logic

WordPress Trac noreply at wordpress.org
Wed Jul 28 15:36:57 UTC 2021


#53816: Overview: Refactor the widgets read/write logic
--------------------------+-----------------------------
 Reporter:  zieladam      |      Owner:  (none)
     Type:  defect (bug)  |     Status:  new
 Priority:  normal        |  Milestone:  Awaiting Review
Component:  General       |    Version:
 Severity:  normal        |   Keywords:
  Focuses:                |
--------------------------+-----------------------------
 This is an overview/epic issue that serves as the place to have a
 discussion and also points to many smaller sub-issues.

 Widgets-related logic in core got quite confusing over the years. As a
 result, we've dealt with problems such as
 [https://github.com/WordPress/gutenberg/issues/33335#issuecomment-879903958
 Blocks moving to "Inactive widgets" after saving] (temporarily solved by
 adding an unexpected [https://github.com/WordPress/wordpress-
 develop/pull/1498 wp_get_sidebars_widgets();] call).

 There are a few problems there:

 * We have multiple global variables with closely related or even roughly
 the same data (`$sidebars_widgets`+`$_wp_sidebars_widgets`, also
 `$wp_registered_sidebars`, `$sidebars_widgets`, `$wp_registered_widgets`,
 `$wp_registered_sidebars`). If we update one, we should also update the
 others for consistency. Sometimes we don't and  we run into
 [https://github.com/WordPress/gutenberg/issues/33335#issuecomment-879903958
 undefined behaviors].
 * We use a function called `retrieve_widgets` as a mean to fix any
 discrepancies in the stored sidebar-to-widget mapping. It's called
 `retrieve`, but it actually does some writing. This is a source of
 confusion in itself so I [https://core.trac.wordpress.org/ticket/53811
 proposed renaming it].
 * We [https://github.com/WordPress/wordpress-develop/pull/1433 we have to
 call retrieve_widgets in GET API endpoints] which makes it read-write, not
 read-only. This breaks HTTP caching and is also a
 [https://github.com/WordPress/gutenberg/issues/33335#issuecomment-879903958
 source of bugs].

 I don't think we're able to address the proliferation of global variables
 – it seems like a major BC break. However, we should still be able to
 improve the `retrieve_widgets` situation.

 Ideally it would:

 ☐ Be less monolithic and have a clear, encapsulated flow of logic (as
 suggested by @helloFromTonya)
 ☐ [https://core.trac.wordpress.org/ticket/53811 Have a name suggesting a
 write, e.g. `remap_widgets`]
 ☐ [https://github.com/WordPress/wordpress-develop/pull/1525 Always be
 called **after** a write]
 ☐ Always be called **after** a theme change
 ☐ Never be required to perform a read
 ☐ Never be called in GET request handlers

 cc @timotybjacobs @noisysocks @adraganescu @talldan @hellofromTonya
 @desrosj

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/53816>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list