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

Iterate on widget REST API endpoints #29649

Merged
merged 19 commits into from
Mar 23, 2021
Merged

Conversation

noisysocks
Copy link
Member

@noisysocks noisysocks commented Mar 9, 2021

Summary

Makes the /wp/v2/widget and /wp/v2/widget-types endpoints:

All changes are backwards compatible so that changes to the frontend can be made in a separate PR.

Changes

GET /wp/v2/widgets & GET /wp/v2/widgets/:id

  • Deprecate settings in favour of instance.
    • instance supports attributes that cannot be serialised to JSON via instance.encoded and instance.hash.
      Why: Not all widgets have settings that can be represented as JSON. See Legacy Widget add support for widgets with attributes that can't be serialised into JSON #28902.
    • instance supports opt-in raw representation of attributes that can be serialised to JSON via instance.raw.
      Why: If we know that a widget does have settings that can be represented as JSON, we should expose that so that the block editor can perform e.g. transformations.
    • instance is set to null when widget does not extend WP_Widget.
      Why: If a widget does not extend WP_Widget, we cannot tell ahead of time what settings it has. All that we can say is that it has a HTML form and can accept form data from that HTML form.
  • Update rendered and rendered_form to work for widgets that don't extend WP_Widget by using lower level APIs.
    Why: If a widget does not extend WP_Widget, we need to e.g. invoke the callback in $wp_registered_widgets to display it instead of calling WP_Widget::display().
  • Deprecate widget_class.
    Why: Widgets that do not extend WP_Widget do not have a class. Also, clients should not need to know about PHP class names.
  • Deprecate number.
    Why: Widgets that do not extend WP_Widget do not have a number. Also, id can already be used to uniquely identify the widget.
  • Deprecate name and description.
    Why: These are redundant with fields that are in /wp/v2/widget-types.
  • Extract widget logic to widgets-api.php.
    Why: This allows for less code duplication when merged to Core.

POST /wp/v2/widgets & PUT /wp/v2/widgets/:id

  • Deprecate settings in favour of instance.
    • instance supports attributes that cannot be serialised to JSON via instance.encoded and instance.hash.
      Why: Not all widgets have settings that can be represented as JSON. See Legacy Widget add support for widgets with attributes that can't be serialised into JSON #28902.
    • instance supports opt-in raw representation of attributes that can be serialised to JSON via instance.raw.
      Why: If we know that a widget does have settings that can be represented as JSON, we should expose that so that the block editor can perform e.g. transformations.
    • instance cannot be set when the widget does not extend WP_Widget.
      Why: If a widget does not extend WP_Widget, we cannot tell ahead of time what settings it has. All that we can say is that it has a HTML form and can accept form data from that HTML form.
  • Add ability to send a widget's form to the endpoint to perform an update via form_data.
    Why: This lets clients create an update widgets that do not extend WP_Widget by taking the form from rendered_form and submitting it to the endpoint.
  • Use the the lower level $wp_registered_widget_updates API.
    Why: Not all widgets extend WP_Widget and so we cannot use WP_Widget::update.
  • Extract widget logic to widgets-api.php.
    Why: This allows for less code duplication when merged to Core.

GET /wp/v2/widget-types & GET /wp/v2/widget-types/:id

  • Deprecate option_name.
    Why: This is an implementation detail and cannot be known ahead of time when the widget does not extend WP_Widget.
  • Deprecate widget_class.
    Why: Widgets that do not extend WP_Widget do not have a class. Also, clients should not need to know about PHP class names.
  • Deprecate customize_selective_refresh.
    Why: This data is only ever needed by the Customizer.
  • Use the the lower level $wp_registered_widgets API.
    Why: Not all widgets extend WP_Widget and so we cannot use WP_Widget::id_base.

POST /wp/v2/widget-types/:id/form-renderer

Examples

View examples

Using https://httpie.io. I've manually removed headers, _links, and deprecated properties for brevity.

Viewing a widget that extends WP_Widget

$ http -a admin:password GET http://wp-git-build.test/wp-json/wp/v2/widgets/archives-3
{
    "id": "archives-3",
    "id_base": "archives",
    "instance": {
        "encoded": "YTozOntzOjU6InRpdGxlIjtzOjA6IiI7czo1OiJjb3VudCI7aTowO3M6ODoiZHJvcGRvd24iO2k6MDt9",
        "hash": "973cb1e41bcdaebe3d3d074f17842461"
    },
    "rendered": "<section id=\"archives-3\" class=\"widget widget_archive\"><h2 class=\"widget-title\">Archives</h2><nav role=\"navigation\" aria-label=\"Archives\">\n\t\t\t<ul>\n\t\t\t\t\t<li><a href='http://wp-git-build.test/2021/03/'>March 2021</a></li>\n\t<li><a href='http://wp-git-build.test/2021/02/'>February 2021</a></li>\n\t\t\t</ul>\n\n\t\t\t</nav></section>",
    "rendered_form": "<p>\n\t\t\t<label for=\"widget-archives-3-title\">Title:</label>\n\t\t\t<input class=\"widefat\" id=\"widget-archives-3-title\" name=\"widget-archives[3][title]\" type=\"text\" value=\"\" />\n\t\t</p>\n\t\t<p>\n\t\t\t<input class=\"checkbox\" type=\"checkbox\" id=\"widget-archives-3-dropdown\" name=\"widget-archives[3][dropdown]\" />\n\t\t\t<label for=\"widget-archives-3-dropdown\">Display as dropdown</label>\n\t\t\t<br/>\n\t\t\t<input class=\"checkbox\" type=\"checkbox\" id=\"widget-archives-3-count\" name=\"widget-archives[3][count]\" />\n\t\t\t<label for=\"widget-archives-3-count\">Show post counts</label>\n\t\t</p>",
    "sidebar": "sidebar-1"
}

Viewing a widget that supports raw instance attributes

$ http -a admin:password GET http://wp-git-build.test/wp-json/wp/v2/widgets/block-7
{
    "id": "block-7",
    "id_base": "block",
    "instance": {
        "encoded": "YToxOntzOjc6ImNvbnRlbnQiO3M6NDk3OiI8IS0tIHdwOnBhcmFncmFwaCAtLT4KPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLjwvcD4KPCEtLSAvd3A6cGFyYWdyYXBoIC0tPiI7fQ==",
        "hash": "f8a6e0fd69fa7db77418b2835cfbfe7d",
        "raw": {
            "content": "<!-- wp:paragraph -->\n<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n<!-- /wp:paragraph -->"
        }
    },
    "rendered": "<section id=\"block-7\" class=\"widget widget_block widget_text\">\n<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>\n</section>",
    "rendered_form": "<textarea id=\"widget-block-7-content\" name=\"widget-block[7][content]\" rows=\"6\" cols=\"50\" class=\"widefat text wp-block-widget-textarea\">&lt;!-- wp:paragraph --&gt;\n&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;\n&lt;!-- /wp:paragraph --&gt;</textarea>",
    "sidebar": "sidebar-1"
}

Viewing a widget that does not extend WP_Widget

$ http -a admin:password GET http://wp-git-build.test/wp-json/wp/v2/widgets/marquee_greeting
{
    "id": "marquee_greeting",
    "id_base": "marquee_greeting",
    "instance": null,
    "rendered": "<marquee>Hey there!!</marquee>",
    "rendered_form": "<p>\n\t\t\t\t<label for=\"marquee-greeting\">Greeting:</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"marquee-greeting\"\n\t\t\t\t\tclass=\"widefat\"\n\t\t\t\t\tname=\"marquee-greeting\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue=\"Hey there!!\"\n\t\t\t\t\tplaceholder=\"Hello!\"\n\t\t\t\t/>\n\t\t\t</p>",
    "sidebar": "sidebar-1"
}

Updating a widget that extends WP_Widget

$ http -a admin:password PUT http://wp-git-build.test/wp-json/wp/v2/widgets/archives-3 instance:='{"encoded":"YTozOntzOjU6InRpdGxlIjtzOjEzOiJVcGRhdGVkIHRpdGxlIjtzOjU6ImNvdW50IjtpOjA7czo4OiJkcm9wZG93biI7aTowO30=","hash":"85edac770804891295ed387be4c2d35a"}'
{
    "id": "archives-3",
    "id_base": "archives",
    "instance": {
        "encoded": "YTozOntzOjU6InRpdGxlIjtzOjEzOiJVcGRhdGVkIHRpdGxlIjtzOjU6ImNvdW50IjtpOjA7czo4OiJkcm9wZG93biI7aTowO30=",
        "hash": "85edac770804891295ed387be4c2d35a"
    },
    "rendered": "<section id=\"archives-3\" class=\"widget widget_archive\"><h2 class=\"widget-title\">Updated title</h2><nav role=\"navigation\" aria-label=\"Updated title\">\n\t\t\t<ul>\n\t\t\t\t\t<li><a href='http://wp-git-build.test/2021/03/'>March 2021</a></li>\n\t<li><a href='http://wp-git-build.test/2021/02/'>February 2021</a></li>\n\t\t\t</ul>\n\n\t\t\t</nav></section>",
    "rendered_form": "<p>\n\t\t\t<label for=\"widget-archives-3-title\">Title:</label>\n\t\t\t<input class=\"widefat\" id=\"widget-archives-3-title\" name=\"widget-archives[3][title]\" type=\"text\" value=\"Updated title\" />\n\t\t</p>\n\t\t<p>\n\t\t\t<input class=\"checkbox\" type=\"checkbox\" id=\"widget-archives-3-dropdown\" name=\"widget-archives[3][dropdown]\" />\n\t\t\t<label for=\"widget-archives-3-dropdown\">Display as dropdown</label>\n\t\t\t<br/>\n\t\t\t<input class=\"checkbox\" type=\"checkbox\" id=\"widget-archives-3-count\" name=\"widget-archives[3][count]\" />\n\t\t\t<label for=\"widget-archives-3-count\">Show post counts</label>\n\t\t</p>",
    "sidebar": "sidebar-1"
}

Updating a widget that supports raw instance attributes

$ http -a admin:password PUT http://wp-git-build.test/wp-json/wp/v2/widgets/block-7 instance:='{"raw":{"content":"<!-- wp:more /-->"}}'
{
    "id": "block-7",
    "id_base": "block",
    "instance": {
        "encoded": "YToxOntzOjc6ImNvbnRlbnQiO3M6MTc6IjwhLS0gd3A6bW9yZSAvLS0+Ijt9",
        "hash": "039ef226dee3600721702d1ffc731718",
        "raw": {
            "content": "<!-- wp:more /-->"
        }
    },
    "rendered": "<section id=\"block-7\" class=\"widget widget_block\"></section>",
    "rendered_form": "<textarea id=\"widget-block-7-content\" name=\"widget-block[7][content]\" rows=\"6\" cols=\"50\" class=\"widefat text wp-block-widget-textarea\">&lt;!-- wp:more /--&gt;</textarea>",
    "sidebar": "sidebar-1"
}

Updating a widget that does not extend WP_Widget

$ http -a admin:password PUT http://wp-git-build.test/wp-json/wp/v2/widgets/marquee_greeting form_data="marquee-greeting=Updated"
{
    "id": "marquee_greeting",
    "id_base": "marquee_greeting",
    "instance": null,
    "rendered": "<marquee>Updated</marquee>",
    "rendered_form": "<p>\n\t\t\t\t<label for=\"marquee-greeting\">Greeting:</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"marquee-greeting\"\n\t\t\t\t\tclass=\"widefat\"\n\t\t\t\t\tname=\"marquee-greeting\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue=\"Updated\"\n\t\t\t\t\tplaceholder=\"Hello!\"\n\t\t\t\t/>\n\t\t\t</p>",
    "sidebar": "sidebar-1"
}

Transforming form data into an encoded instance

$ http -a admin:password POST http://wp-git-build.test/wp-json/wp/v2/widget-types/search/encode form_data="widget-search[69][title]=Hello+there"
{
    "form": "<p>\n\t\t\t<label for=\"widget-search-1-title\">Title:</label>\n\t\t\t<input class=\"widefat\" id=\"widget-search-1-title\" name=\"widget-search[1][title]\" type=\"text\" value=\"Hello there\" />\n\t\t</p>",
    "instance": {
        "encoded": "YToxOntzOjU6InRpdGxlIjtzOjExOiJIZWxsbyB0aGVyZSI7fQ==",
        "hash": "b106809b8ab93ea67141fe00767f371f"
    }
}

@noisysocks noisysocks added REST API Interaction Related to REST API [Feature] Widgets Screen The block-based screen that replaced widgets.php. [Feature] Widgets Customizer Ability to add and edit blocks in Customize → Widgets. labels Mar 9, 2021
@github-actions
Copy link

github-actions bot commented Mar 9, 2021

Size Change: +4.09 kB (0%)

Total Size: 1.4 MB

Filename Size Change
build/a11y/index.js 1.14 kB -1 B (0%)
build/annotations/index.js 3.78 kB +1 B (0%)
build/block-directory/index.js 8.63 kB -4 B (0%)
build/block-editor/index.js 127 kB +1.36 kB (+1%)
build/block-editor/style-rtl.css 12.4 kB +79 B (+1%)
build/block-editor/style.css 12.4 kB +80 B (+1%)
build/block-library/blocks/cover/editor-rtl.css 605 B +6 B (+1%)
build/block-library/blocks/cover/editor.css 605 B +6 B (+1%)
build/block-library/blocks/freeform/editor-rtl.css 2.46 kB +7 B (0%)
build/block-library/blocks/freeform/editor.css 2.46 kB +7 B (0%)
build/block-library/blocks/gallery/editor-rtl.css 704 B +15 B (+2%)
build/block-library/blocks/gallery/editor.css 705 B +15 B (+2%)
build/block-library/blocks/group/editor-rtl.css 160 B -158 B (-50%) 🏆
build/block-library/blocks/group/editor.css 160 B -157 B (-50%) 🏆
build/block-library/blocks/navigation-link/editor-rtl.css 626 B +6 B (+1%)
build/block-library/blocks/navigation-link/editor.css 627 B +6 B (+1%)
build/block-library/blocks/navigation-link/style-rtl.css 685 B +14 B (+2%)
build/block-library/blocks/navigation-link/style.css 682 B +14 B (+2%)
build/block-library/blocks/navigation/editor-rtl.css 1.11 kB +24 B (+2%)
build/block-library/blocks/navigation/editor.css 1.11 kB +24 B (+2%)
build/block-library/blocks/page-list/editor-rtl.css 170 B -45 B (-21%) 🎉
build/block-library/blocks/page-list/editor.css 170 B -45 B (-21%) 🎉
build/block-library/blocks/page-list/style-rtl.css 537 B +10 B (+2%)
build/block-library/blocks/page-list/style.css 536 B +10 B (+2%)
build/block-library/blocks/query/editor-rtl.css 820 B +6 B (+1%)
build/block-library/blocks/query/editor.css 819 B +7 B (+1%)
build/block-library/blocks/shortcode/editor-rtl.css 512 B +8 B (+2%)
build/block-library/blocks/shortcode/editor.css 512 B +8 B (+2%)
build/block-library/blocks/social-links/editor-rtl.css 776 B +7 B (+1%)
build/block-library/blocks/social-links/editor.css 776 B +7 B (+1%)
build/block-library/blocks/social-links/style-rtl.css 1.32 kB +8 B (+1%)
build/block-library/blocks/social-links/style.css 1.33 kB +8 B (+1%)
build/block-library/blocks/template-part/editor-rtl.css 552 B -5 B (-1%)
build/block-library/blocks/template-part/editor.css 551 B -5 B (-1%)
build/block-library/editor-rtl.css 9.48 kB -97 B (-1%)
build/block-library/editor.css 9.48 kB -98 B (-1%)
build/block-library/index.js 148 kB +647 B (0%)
build/block-library/style-rtl.css 8.88 kB +34 B (0%)
build/block-library/style.css 8.89 kB +33 B (0%)
build/blocks/index.js 48.3 kB +31 B (0%)
build/components/index.js 284 kB +530 B (0%)
build/components/style-rtl.css 16.2 kB +39 B (0%)
build/components/style.css 16.2 kB +42 B (0%)
build/compose/index.js 11.2 kB +88 B (+1%)
build/core-data/index.js 16.7 kB +3 B (0%)
build/customize-widgets/index.js 3.95 kB -1 B (0%)
build/data-controls/index.js 830 B +1 B (0%)
build/data/index.js 8.87 kB -1 B (0%)
build/date/index.js 31.8 kB +2 B (0%)
build/deprecated/index.js 787 B +18 B (+2%)
build/dom/index.js 4.98 kB +52 B (+1%)
build/edit-navigation/index.js 11.9 kB +18 B (0%)
build/edit-navigation/style-rtl.css 1.31 kB +2 B (0%)
build/edit-navigation/style.css 1.31 kB +3 B (0%)
build/edit-post/index.js 307 kB +711 B (0%)
build/edit-post/style-rtl.css 7.12 kB +259 B (+4%)
build/edit-post/style.css 7.11 kB +253 B (+4%)
build/edit-site/index.js 27.2 kB +37 B (0%)
build/edit-site/style-rtl.css 4.56 kB +65 B (+1%)
build/edit-site/style.css 4.55 kB +64 B (+1%)
build/edit-widgets/index.js 20.2 kB +33 B (0%)
build/editor/index.js 41.9 kB +78 B (0%)
build/editor/style-rtl.css 3.9 kB +8 B (0%)
build/editor/style.css 3.9 kB +8 B (0%)
build/element/index.js 4.61 kB +1 B (0%)
build/format-library/index.js 6.75 kB -1 B (0%)
build/keyboard-shortcuts/index.js 2.53 kB +4 B (0%)
build/media-utils/index.js 5.34 kB +1 B (0%)
build/notices/index.js 1.85 kB +3 B (0%)
build/nux/index.js 3.41 kB -1 B (0%)
build/primitives/index.js 1.42 kB +1 B (0%)
build/react-i18n/index.js 1.46 kB +2 B (0%)
build/redux-routine/index.js 2.84 kB +2 B (0%)
build/rich-text/index.js 13.3 kB -112 B (-1%)
build/shortcode/index.js 1.7 kB -1 B (0%)
build/url/index.js 3.02 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 664 B 0 B
build/block-directory/style-rtl.css 1 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 479 B 0 B
build/block-library/blocks/button/style.css 479 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 364 B 0 B
build/block-library/blocks/buttons/style.css 363 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.24 kB 0 B
build/block-library/blocks/cover/style.css 1.24 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.11 kB 0 B
build/block-library/blocks/gallery/style.css 1.1 kB 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation/style-rtl.css 204 B 0 B
build/block-library/blocks/navigation/style.css 205 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 115 B 0 B
build/block-library/blocks/site-logo/style.css 115 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/spacer/editor-rtl.css 317 B 0 B
build/block-library/blocks/spacer/editor.css 317 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 402 B 0 B
build/block-library/blocks/table/style.css 402 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 50 B 0 B
build/block-library/blocks/verse/editor.css 50 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 187 B 0 B
build/block-library/blocks/video/style.css 187 B 0 B
build/block-library/common-rtl.css 1.1 kB 0 B
build/block-library/common.css 1.1 kB 0 B
build/block-library/theme-rtl.css 700 B 0 B
build/block-library/theme.css 701 B 0 B
build/block-serialization-default-parser/index.js 1.87 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/customize-widgets/style-rtl.css 168 B 0 B
build/customize-widgets/style.css 168 B 0 B
build/dom-ready/index.js 576 B 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 347 B 0 B
build/editor/editor-styles.css 347 B 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 2.28 kB 0 B
build/html-entities/index.js 623 B 0 B
build/i18n/index.js 4.01 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keycodes/index.js 1.95 kB 0 B
build/list-reusable-blocks/index.js 3.14 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.89 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/reusable-blocks/index.js 3.78 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/server-side-render/index.js 2.58 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/viewport/index.js 1.86 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@TimothyBJacobs
Copy link
Member

These changes are looking great to me. Will review more carefully after the tests are updated.

@draganescu
Copy link
Contributor

This is going great! 👏

@noisysocks
Copy link
Member Author

I've fixed all test failures and as such will mark this as ready to review. I'm still working on adding new tests for the new functionality.

@noisysocks noisysocks marked this pull request as ready for review March 11, 2021 02:02
@noisysocks
Copy link
Member Author

noisysocks commented Mar 11, 2021

OK, I added a few tests which cover the new functionality.

I couldn't figure out how to write a test for POSTing form data because WP_REST_Request doesn't have a set_content_type method. Any ideas @TimothyBJacobs?

It would be nice to DRY up the unit tests. Probably we can use data providers to test all of the combinations of methods (GET, POST, PUT), ways of representing a widget (encoded instance, raw instance, form data), and widget types (multi-widget, legacy widget). I don't think it's a blocker here though. This PR is already large enough and it will be easier to remove bloat once we delete the properties that this PR deprecates.

@noisysocks
Copy link
Member Author

Checks are failing because of #29752.

Copy link
Member

@spacedmonkey spacedmonkey left a comment

Choose a reason for hiding this comment

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

Can you please provide more detail on this change? Most of the changes seem to make this less RESTFUL and remove data from the api. I don't see what problem you are trying to solve here. What exactly was wrong with the apis in the first place?

@noisysocks
Copy link
Member Author

noisysocks commented Mar 12, 2021

Can you please provide more detail on this change? Most of the changes seem to make this less RESTFUL and remove data from the api. I don't see what problem you are trying to solve here. What exactly was wrong with the apis in the first place?

I added a little more justification to each of the dot points underneath "Changes" in this PR's description. Let me know if you'd like to elaborate on anything in particular there.

@noisysocks
Copy link
Member Author

Spoke to @TimothyBJacobs about making this more RESTful. Let's:

  • Use a write-only form_data property instead of accepting application/x-www-form-urlencoded requests.
  • Use a seperate /preview endpoint instead of ?preview=1.

Makes the /wp/v2/widget and /wp/v2/widget-types endpoints:

- Work with widget instance attributes that cannot be serialized to JSON
- Less reliant on widget implementation details
- Work better with widgets that don't extend WP_Widget
@noisysocks noisysocks force-pushed the try/rewrite-widget-endpoints branch from 6737d4b to 1fa6816 Compare March 16, 2021 00:22
@noisysocks
Copy link
Member Author

noisysocks commented Mar 19, 2021

I haven't tested the front-end

We can be reasonably confident that this doesn't break any existing functionality on the frontend because there are E2E tests in adding-widgets.test.js that cover displaying widgets, saving widgets, etc.

@noisysocks noisysocks added the [Type] Breaking Change For PRs that introduce a change that will break existing functionality label Mar 19, 2021
@noisysocks
Copy link
Member Author

noisysocks commented Mar 19, 2021

I think it would be helpful to call out what is being deprecated in the Gutenberg plugin release notes, so I've added [Type] Breaking Change even though this PR doesn't actually contain any breaking changes.

Here's what can be included in the release notes:

The /wp/v2/widgets and /wp/v2/widget-types REST API endpoints have been re-written to work better with different types of widgets. Please note that several properties and endpoints have been marked as deprecated and will be removed in a future Gutenberg release.

/wp/v2/widgets

  • widget_class property. Use id_base instead.
  • name property. Use widget-types endpoint instead.
  • description property. Use widget-types endpoint instead.
  • number property. Use id instead.
  • settings property. Use instance instead.

/wp/v2/widget-types

  • option_name property. Use id instead.
  • widget_class property. Use id instead.
  • customize_selective_refresh property.
  • /form-renderer endpoint. Use /encode instead.

@noisysocks
Copy link
Member Author

This is ready for re-review.

Copy link
Member

@spacedmonkey spacedmonkey left a comment

Choose a reason for hiding this comment

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

I also have one question, but I think this is looking good.

@noisysocks
Copy link
Member Author

Thanks for reviewing!

Copy link
Member

@spacedmonkey spacedmonkey left a comment

Choose a reason for hiding this comment

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

Looking good

@noisysocks noisysocks merged commit 5c525d6 into trunk Mar 23, 2021
@noisysocks noisysocks deleted the try/rewrite-widget-endpoints branch March 23, 2021 01:49
@github-actions github-actions bot added this to the Gutenberg 10.3 milestone Mar 23, 2021
@noisysocks
Copy link
Member Author

Thank you @TimothyBJacobs and @spacedmonkey!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Widgets Customizer Ability to add and edit blocks in Customize → Widgets. [Feature] Widgets Screen The block-based screen that replaced widgets.php. REST API Interaction Related to REST API [Type] Breaking Change For PRs that introduce a change that will break existing functionality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants