wp-kit: use cases
What wp-kit does and how people use it, from the product's readme and the docs in its repository.
Declaring a resource
use MammothWP\WpKit\{Field, Operation, Resource};
final class Things_Resource extends Resource
{
public function name() { return 'things'; }
public function service() { return Things_Service::instance(); }
public function rest_namespace() { return 'my-plugin/v1'; }
public function cli_base() { return 'my-plugin things'; }
public function ability_category() { return 'my-plugin-things'; }
public function operations()
{
return [
'list' => Operation::read('list_items')
->label('List things')
->input([
Field::enum('status', ['enabled', 'disabled'])->multiple(),
Field::int('limit')->default_value(50)->max(200)->describe('Rows to return.'),
])
->rest('GET')
->cli('list', ['columns' => ['id', 'title', 'status']])
->ability('list-things'),
'delete' => Operation::destructive('delete_items')
->input([Field::int_list('ids')->positional()->required()])
->rest('DELETE', '/delete/')
->cli('delete', ['success' => 'Deleted %count% thing(s).'])
->ability('delete-things'),
];
}
}
Then, inside Kit::on_ready():
$registry = (new \MammothWP\WpKit\Registry())->add(new Things_Resource())->ready();
foreach ($registry->all() as $resource) {
(new \MammothWP\WpKit\Adapters\Rest_Adapter($resource))->register();
(new \MammothWP\WpKit\Adapters\Cli_Adapter($resource))->register();
(new \MammothWP\WpKit\Adapters\Ability_Adapter($resource))->register();
}Source: README.md(opens in a new tab)
Choosing surfaces
Every operation is exposed on REST, WP-CLI and the Abilities API unless told otherwise. Leave a layer out per operation with Operation::surfaces(), or for the whole resource by overriding Resource::surfaces(); operations that call surfaces() themselves keep their own choice:
class Admin_Helpers_Resource extends Resource
{
/** No meaningful CLI for editor helpers: register REST and abilities only. */
public function surfaces()
{
return [Context::REST, Context::ABILITY];
}
public function surfaces_reason()
{
return 'editor helpers have no command-line use';
}
}
The reason travels into Inventory::export() so parity tests can tell a deliberate omission from a missing registration. Both accept a callable for decisions that depend on runtime state.
MCP
Every ability the kit registers carries meta.mcp.public = true, so any MCP server built on