Skip to content

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

Open
wants to merge 32 commits into
base: trunk
Choose a base branch
from

Conversation

priethor
Copy link
Contributor

@priethor priethor commented May 12, 2025

What

  • Added a new source parameter to the /wp/v2/types REST API endpoint that allows filtering post types by their origin: core (WordPress built-in), scf (for SCF managed types), or other for the rest of CPTs.
  • Works with both collection (/wp/v2/types) and single item (/wp/v2/types/{type}) endpoints
  • Properly documented in the OpenAPI schema

Why

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

  • If the source parameter is not defined, nothing changes.
  • For specific, single-type requests:
    • Hooks to rest_request_before_callbacks for the single request, returning 404 if the requested type doesn't meet the criteria.
  • For collection requests:
    • Hooks to rest_prepare_post_type to filter each post type by source before WordPress prepares it.
    • Hooks to rest_pre_echo_response to remove null values returned by rest_prepare_post_type in the response array.
    • Since the filter rest_prepare_post_type fires once per post type, the Post Types belonging to the requested source are calculated in advance in rest_request_before_callbacks and reused throughout the whole request.

Testing Instructions

  1. API Endpoint Testing:
    - 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
  2. Validation Testing:
    - 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
  3. Unit and E2E Tests (heavily assisted by AI):
    - 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

  • Add a transient cache for the post type source calculation.
  • With the transient cache in place, return the post type source as a field in the response, as there would be no performance loss.
  • Add a hook so that other plugins can register their own sources.

@priethor priethor self-assigned this May 12, 2025
@priethor priethor marked this pull request as ready for review May 12, 2025 15:52
@priethor priethor added the [Type] Enhancement New feature or request label May 12, 2025
@priethor priethor marked this pull request as draft May 12, 2025 18:12
@priethor priethor marked this pull request as ready for review May 19, 2025 15:02
@cbravobernal cbravobernal self-requested a review May 20, 2025 14:55
@@ -3,7 +3,7 @@
* REST API
*
* @package Secure Custom Fields
* @since ACF 6.4.0
* @since 6.5.0
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we specify SCF 6.5.0 . So LLMs don't mess.

Comment on lines +90 to +93
console.log('All types:', Object.keys(allTypes));
console.log('SCF types:', Object.keys(scfTypes));
console.log('Core types:', Object.keys(coreTypes));
console.log('Other types:', Object.keys(otherTypes));
Copy link
Contributor

Choose a reason for hiding this comment

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

Let's remove the logs here.

console.log(`Test post type ${customTestType} not found - skipping SCF single post type tests`);
}
} catch (error) {
console.log(`Error checking SCF test type: ${error.message}`);
Copy link
Contributor

Choose a reason for hiding this comment

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

We are mixing console.error and console.logs in errors :-)

Comment on lines +275 to +287
console.log('SCF post types:', Object.keys(scfTypes));

const coreTypes = await requestUtils.rest({
path: '/wp/v2/types',
params: { source: 'core' }
});
console.log('Core post types:', Object.keys(coreTypes));

const otherTypes = await requestUtils.rest({
path: '/wp/v2/types',
params: { source: 'other' }
});
console.log('Other post types:', Object.keys(otherTypes));
Copy link
Contributor

Choose a reason for hiding this comment

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

Let's remove this logs too.

Comment on lines +325 to +332
if (inScf) {
console.log(`✅ Perfect! Test post type is in SCF source as desired`);
} else if (inOther) {
console.log(`⚠️ Acceptable: Test post type in other source (our filter hook didn't work)`);
}
} else {
console.log(`⚠️ Test post type ${customTestType} not found - skipping this part of the test`);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

We don't need this too.

Copy link
Contributor

@cbravobernal cbravobernal left a 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!! 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Type] Enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants