-
Notifications
You must be signed in to change notification settings - Fork 28
REST API: Add source
parameter for types endpoint
#128
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
base: trunk
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In my opinion, most of console logs are not necessary. Let's avoid to fill the logs of CI with them. The rest of the PR is working as expected, nice job!! 🚀
// Mark as created so we don't duplicate it | ||
update_option( 'scf_test_post_type_created', true ); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NIT: Delete option on plugin deactivation / uninstall.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is actually done here, although there was a typo.
What was missing was deleting the post type itself, which I fixed in the latest commit. Since post deletion is done on plugin deactivation on the PHP side, I've moved deleting the option to the same deactivation hook for consistency.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice work!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didn't comb through every little detail, but overall seems pretty good! I just left a concern about caching.
if ( null === $this->cached_post_types ) { | ||
$this->cached_post_types = $this->get_source_post_types( $source ); | ||
} | ||
$source_post_types = $this->cached_post_types; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In practice, the way the REST API works is that one request corresponds to one fresh execution of the WP stack, including running through SCF_Rest_Types_Endpoint
's constructor and down that stack. However, semantically, cached_post_types
is an instance property of a class that represents an endpoint, not a request. Here's my concern when I read this chunk:
Is there any scenario (e.g. request batching or sequential rest_do_request
calls) where it's possible to process more than one request with the same endpoint instance? If so, this cache will need invalidation. At the very least, it should be source-indexed:
$source_post_types = $this->cached_post_types[ $source ];
… but ideally its lifetime should be that of a request.
No?
// For collection requests, we don't need to add any filter here | ||
// as clean_types_response will handle removing null values from the response | ||
// and filter_post_type will handle individual filtering |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In light of this, why even check for $is_collection
? Seems like a distraction, no?
} | ||
|
||
if ( 'scf' === $source || 'other' === $source ) { | ||
$scf_types = array(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why the reassignment?
What
/wp/v2/types
REST API endpoint that allows filtering post types by their origin:core
(WordPress built-in),scf
(for SCF managed types), orother
for the rest of CPTs./wp/v2/types
) and single item (/wp/v2/types/{type}
) endpointsWhy
When working on the Command Palette Integration and considering using the REST API to define CPT-related commands, requesting specifically for the CPTs managed by SCF became a need, and it will be needed, too, when implementing DataViews.
In fact, this branch is directly based on #124 and started in parallel, as we both realized we needed to tweak the Types endpoint if we wanted to leverage the API.
How
source
parameter is not defined, nothing changes.rest_request_before_callbacks
for the single request, returning 404 if the requested type doesn't meet the criteria.rest_prepare_post_type
to filter each post type by source before WordPress prepares it.rest_pre_echo_response
to removenull
values returned byrest_prepare_post_type
in the response array.rest_prepare_post_type
fires once per post type, the Post Types belonging to the requested source are calculated in advance inrest_request_before_callbacks
and reused throughout the whole request.Testing Instructions
- Make a GET request to
/wp/v2/types
to see all post types- Add
?source=core
to filter for WordPress built-in post types only- Add
?source=scf
to see only post types managed by SCF- Try
?source=other
to see post types registered from other sources- Test single post type endpoints like
/wp/v2/types/post?source=core
- Try an invalid source value (e.g.,
?source=invalid
) to verify validation works- Confirm a 404 error when requesting a post type with the wrong source (e.g., /wp/v2/types/post?source=scf`
- Run PHPUnit tests:
composer test:php -- --filter=Test_REST_Types_Endpoint
- Run E2E tests:
npm run test:e2e tests/e2e/rest-api-types-endpoint.spec.ts
Potential follow-ups
source
as a field in the response, as there would be no performance loss.