-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Add: WordPress Core Post Management Abilities #74234
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?
Add: WordPress Core Post Management Abilities #74234
Conversation
|
The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message. To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
|
Flaky tests detected in e53d90f. 🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/20526671811
|
SirLouen
left a comment
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.
A 1400 line review 🤔
To have a little more context, is this coming from somewhere? (can you link the specific file?) Or have you copy/pasted a group of files? Maybe I'm looking wrongly, but I can't seem to find equivalents here.
The abilities can be in both Gutenberg and core. Having them in Gutenberg allows us to use them in the workflows functionality that is being worked on by @senadir and allows us to get some testing before core is released.
I wonder if this won't bring too much duplication. Wouldn't it make more sense to be a backport instead of a double port? It reminds me the compat libs but I'm not sure if this should be integrated in a similar fashion.
cc @youknowriad
Yah it is a big change, but having the 4 abilities, ready allows us to see how reusability of artifacts happens between abilities. We can reduce the scope if people prefer, and for example start with just create and update, or find and get.
The equivalents are inside https://github.com/galatanovidiu/mcp-adapter-implementation-example/tree/experiment/layerd-mcp-tools/includes/Abilities/Posts. But this is not a copy paste, is an adaptation of these abilities to core, dealing with more cases, and handling more permission scenarios like assign terms etc which were not covered. At the same time it also removes some functionalities to not have this PR even bigger, e.g: we don't have create taxonomies if they don't exist, on create post ability.
It is not a double port we are adding a PR here in Gutenberg and at the same time proposing the core backport at WordPress/wordpress-develop#10665. It is the same process followed for any other PHP change, the CI even requires a core backport for any php change on Gutenberg. |
Part of: WordPress/ai#40 cc: @Jameswlepage
Inspired by the work on https://github.com/galatanovidiu/mcp-adapter-implementation-example/tree/experiment/layerd-mcp-tools/includes/Abilities by @galatanovidiu.
Core abilities organization
This PR also proposes a logic for how core abilities are organized. In
abilities.php, we have two functions:wp_register_core_abilitiesandwp_register_ability_category(or in the case of Gutenberg,_gutenberg_register_core_abilitiesand_gutenberg_register_core_ability_categories). These functions then call ability registration functions that are inside the abilities folder. If the ability is simple, it can be registered in just a single internal function, e.g.,_wp_register_site_info_ability; for complex abilities, we can register them in a class (like this post management one).The abilities can be in both Gutenberg and core. Having them in Gutenberg allows us to use them in the workflows functionality that is being worked on by @senadir and allows us to get some testing before core is released.
Gutenberg unregisters the equivalent core ones, so Gutenberg is the source of truth. The same ability can exist in Gutenberg and core, but Gutenberg takes precedence so we can test changes in Gutenberg before releasing in core (similar to what happens with blocks and other WordPress artifacts).
Core Post management abilities
This PR adds core post management abilities for the WordPress abilities API:
core/create-post,core/get-post,core/find-posts, andcore/update-post.It supports nested query support for
meta_query,tax_query, anddate_querymatching WordPress's nativeWP_Querystructure with AND/OR relations. This allows very complex query operations which the REST API does not allow and may be useful for agents to find information.It uses the permission callback mechanism and tries to correctly check permissions for all cases. The basic permission checking logic first checks the basic and common use case (user can edit, create, or see a post), then we go into specifics in separate functions that are reused for checking status changes (e.g., publish), author changes, and taxonomy assignment permissions.
The class
WP_Posts_Abilities_Gutenbergis organized into 6 main areas:wp_register_abilitycalls.WP_Queryformat.Missing
The idea of this PR is mainly to get feedback if this is the right direction for the post management abilities. There are some things that are missing:
wp_corePHP API approach where we have thewp_update_postfunction and alsostick_post/unstick_postfunctions. We can decide on what to do regarding the missing edits as follow-ups, as the PR is already too big.Test plan
/wp-admin/edit.php?post_type=post.core/create-postcreates posts with various fields (title, content, status, meta, taxonomies):core/get-postretrieves posts by ID with optional taxonomy/meta inclusion:core/find-postsqueries work with nestedmeta_query,tax_query, anddate_query.a-23|c-1represents a post with meta key "a" value of 23 and meta key "c" value of 1. Also adds the correct tags.core/update-postmodifies existing posts correctly: