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

Template Parts: Support REST API meta queries. #21851

Merged
merged 2 commits into from
Apr 27, 2020

Conversation

epiqueras
Copy link
Contributor

Description

Template Part blocks rely on meta queries, but the REST API does not support them by default. So, they break down when they look for wp_template_parts, and the other query arguments don't narrow it down enough to find the correct post on the first page of results.

How to test this?

Verify that inserting template parts works as expected even when you already have a lot of customized template parts.

Types of Changes

Bug Fix: Template Parts now load correctly when you have a lot of wp_template_part posts.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • 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.

@epiqueras epiqueras added [Type] Bug An existing feature does not function as intended [Feature] Full Site Editing labels Apr 24, 2020
@epiqueras epiqueras self-assigned this Apr 24, 2020
@epiqueras epiqueras requested a review from a team April 24, 2020 01:58
@github-actions
Copy link

github-actions bot commented Apr 24, 2020

Size Change: -18.3 kB (2%)

Total Size: 817 kB

Filename Size Change
build/annotations/index.js 3.62 kB +3 B (0%)
build/api-fetch/index.js 4.08 kB +3 B (0%)
build/autop/index.js 2.82 kB -3 B (0%)
build/block-directory/index.js 6.23 kB -6 B (0%)
build/block-editor/index.js 106 kB -118 B (0%)
build/block-editor/style-rtl.css 10.2 kB -14 B (0%)
build/block-editor/style.css 10.2 kB -14 B (0%)
build/block-library/editor-rtl.css 7.03 kB -19 B (0%)
build/block-library/editor.css 7.03 kB -18 B (0%)
build/block-library/index.js 112 kB +69 B (0%)
build/block-serialization-default-parser/index.js 1.88 kB +1 B
build/block-serialization-spec-parser/index.js 3.1 kB -1 B
build/blocks/index.js 48.1 kB -6 B (0%)
build/components/index.js 179 kB -18.6 kB (10%) 👏
build/compose/index.js 6.66 kB +1 B
build/core-data/index.js 11.4 kB +11 B (0%)
build/data/index.js 8.42 kB -6 B (0%)
build/date/index.js 5.47 kB +3 B (0%)
build/dom-ready/index.js 568 B -1 B
build/edit-navigation/index.js 3.54 kB -2 B (0%)
build/edit-post/index.js 27.8 kB +46 B (0%)
build/edit-site/index.js 11 kB +30 B (0%)
build/edit-widgets/index.js 8.33 kB -5 B (0%)
build/editor/index.js 43.4 kB +43 B (0%)
build/element/index.js 4.65 kB -2 B (0%)
build/format-library/index.js 7.63 kB +314 B (4%)
build/i18n/index.js 3.56 kB +1 B
build/is-shallow-equal/index.js 710 B -1 B
build/list-reusable-blocks/index.js 3.12 kB +1 B
build/media-utils/index.js 5.29 kB +2 B (0%)
build/notices/index.js 1.79 kB +1 B
build/nux/index.js 3.4 kB -3 B (0%)
build/primitives/index.js 1.5 kB +7 B (0%)
build/redux-routine/index.js 2.84 kB -1 B
build/rich-text/index.js 14.8 kB +8 B (0%)
build/server-side-render/index.js 2.68 kB +6 B (0%)
build/url/index.js 4.02 kB +2 B (0%)
build/viewport/index.js 1.84 kB +1 B
build/wordcount/index.js 1.18 kB +2 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.02 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 760 B 0 B
build/block-directory/style.css 761 B 0 B
build/block-library/style-rtl.css 7.14 kB 0 B
build/block-library/style.css 7.14 kB 0 B
build/block-library/theme-rtl.css 683 B 0 B
build/block-library/theme.css 685 B 0 B
build/components/style-rtl.css 16.9 kB 0 B
build/components/style.css 16.9 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom/index.js 3.1 kB 0 B
build/edit-navigation/style-rtl.css 485 B 0 B
build/edit-navigation/style.css 485 B 0 B
build/edit-post/style-rtl.css 12.3 kB 0 B
build/edit-post/style.css 12.3 kB 0 B
build/edit-site/style-rtl.css 5.26 kB 0 B
build/edit-site/style.css 5.25 kB 0 B
build/edit-widgets/style-rtl.css 5 kB 0 B
build/edit-widgets/style.css 5 kB 0 B
build/editor/editor-styles-rtl.css 428 B 0 B
build/editor/editor-styles.css 431 B 0 B
build/editor/style-rtl.css 3.27 kB 0 B
build/editor/style.css 3.27 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 622 B 0 B
build/keyboard-shortcuts/index.js 2.51 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.67 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/warning/index.js 1.14 kB 0 B

compressed-size-action

Copy link
Member

@TimothyBJacobs TimothyBJacobs left a comment

Choose a reason for hiding this comment

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

This should be handled by properly registering a collection query parameter using rest_wp_template_collection_params and checking for that value in rest_wp_template_part_query and formatting the meta_query based on the specific parameter value.

For instance, add a theme parameter with a type of string.

We can't blindly open the posts collection to performing arbitrary meta queries.

@TimothyBJacobs TimothyBJacobs added the REST API Interaction Related to REST API label Apr 24, 2020
@epiqueras
Copy link
Contributor Author

This should be handled by properly registering a collection query parameter

What does rest_wp_template_collection_params do if this still works without it?

We can't blindly open the posts collection to performing arbitrary meta queries.

What are the things that could go wrong?

@TimothyBJacobs
Copy link
Member

It registers it as a query parameter so that validation can occur and it is documented in the schema for the resource. That is how the REST API is designed to function. This style is more akin to the legacy filter parameter supported by the REST API which was removed.

Meta query parameters are not a public query parameter, see WP::$public_query_vars so they should not be allowed to be publicly queried. Exposing it would make it possible to determine the private metadata of a post.

@epiqueras
Copy link
Contributor Author

Thanks for the clarification @TimothyBJacobs. I've updated the code.

It registers it as a query parameter so that validation can occur

But it still lets unregistered parameters pass through, right? Because it worked without registering it.

@TimothyBJacobs
Copy link
Member

I've updated the code.

Looks good to me, I'd suggest a small change to make sure we don't stomp on anyone else providing a meta query.

function filter_rest_wp_template_part_query( $args, $request ) {
	if ( $request['theme'] ) {
		$meta_query   = isset( $args['meta_query'] ) ? $args['meta_query'] : array();
		$meta_query[] = array(
			'key'   => 'theme',
			'value' => $request['theme'],
		);

		$args['meta_query'] = $meta_query;
	}

	return $args;
}

But it still lets unregistered parameters pass through, right? Because it worked without registering it.

Correct, we don't error on unknown parameters.

@epiqueras
Copy link
Contributor Author

@TimothyBJacobs Done 😄

Copy link
Member

@TimothyBJacobs TimothyBJacobs left a comment

Choose a reason for hiding this comment

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

lgtm!

@epiqueras epiqueras merged commit 147ad19 into master Apr 27, 2020
@epiqueras epiqueras deleted the fix/template-part-queries branch April 27, 2020 17:54
@github-actions github-actions bot added this to the Gutenberg 8.0 milestone Apr 27, 2020
@epiqueras
Copy link
Contributor Author

Thanks for the quick reviews!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
REST API Interaction Related to REST API [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants