LW Site Manager
WordPress Site Manager using the Abilities API - full site maintenance via AI/REST.
Overview
| Requires WordPress | 6.9+ |
| Requires PHP | 8.1+ |
| Tested up to | 6.9 |
| License | GPL-2.0-or-later |
| GitHub | lwplugins/lw-site-manager |
Installation
composer require lwplugins/lw-site-managerOr download from GitHub and upload to /wp-content/plugins/lw-site-manager.
Requirements
- PHP 8.1 or higher
- WordPress 6.9 or higher (requires Abilities API)
What is the Abilities API?
The WordPress Abilities API is a feature introduced in WordPress 6.9 that enables WordPress sites to expose structured, discoverable, and secure operations to external systems (AI assistants, automation tools, remote administration panels).
The Abilities API is a standardized interface through which:
- AI systems (Claude, ChatGPT, Gemini) can understand and execute WordPress operations
- Automation tools (n8n, Make, Zapier) can integrate with WordPress
- Central management interfaces can control multiple WordPress sites
Why Abilities API Over REST API?
| Property | REST API | Abilities API |
|---|---|---|
| Discoverability | Requires reading documentation | Self-describing with JSON Schema |
| Validation | Custom implementation | Built-in input/output validation |
| Permissions | Capability-based | Ability-level fine-tuning |
| AI Integration | No native support | MCP-compatible, AI-ready |
| Annotations | None | readonly, destructive, idempotent |
Annotation Meanings
| Annotation | Meaning |
|---|---|
readonly: true | Only reads, does not modify anything (GET request) |
destructive: true | May cause data loss or irreversible changes |
idempotent: true | Multiple executions produce the same result |
These annotations help AI systems and automation tools understand how “dangerous” an operation is and whether user confirmation is needed.
Features
Site Management
- Updates Management - Check and apply updates for core, plugins, and themes
- Plugin Management - Install, activate, deactivate, and delete plugins
- Theme Management - Install, activate, and delete themes
- Content Management - Full CRUD for posts, pages, and custom post types
- Taxonomy Management - Manage categories, tags, and custom taxonomies
- User Management - Create, update, and manage users
- Media Management - Upload and manage media files
- Comments Management - Moderate and manage comments
- Backup & Restore - Create and restore site backups
- Health & Diagnostics - Monitor site health and PHP errors
- Database Maintenance - Optimize, cleanup, and repair database
- Cache Management - Flush object cache, page cache, and OPcache
- Settings Management - Read and update WordPress options
- Meta Management - Manage post, user, and term metadata
- WooCommerce Integration - Manage products, orders, and reports (if WooCommerce is active)
AI Integration
LW Site Manager is designed for AI agent integration via multiple interfaces:
| Interface | Description |
|---|---|
| REST API | Any AI can call abilities via HTTP |
| MCP Adapter | Claude, GPT can use abilities as tools |
| Agentic Loops | AI decides which abilities to call |
+-------------+ MCP +-----------------+ REST +-------------+
| Claude | <----------> | MCP Adapter | <----------> | WordPress |
| (AI) | | | | Abilities |
+-------------+ +-----------------+ +-------------+LW Plugin Abilities
LW Site Manager also exposes abilities from other LW plugins when they are active. See each plugin’s documentation for their available abilities.
Authentication
Use WordPress Application Passwords for API authentication:
- Go to Users > Your Profile > Application Passwords
- Create a new application password
- Use Basic Auth with your username and app password
curl -u "username:xxxx-xxxx-xxxx-xxxx" <URL>REST API Endpoints
| Operation | Endpoint |
|---|---|
| List all abilities | GET /wp-json/wp-abilities/v1/abilities |
| Get single ability | GET /wp-json/wp-abilities/v1/abilities/{name} |
| Execute ability | POST /wp-json/wp-abilities/v1/abilities/{name}/run |
Read-only abilities use GET with input[] query parameters.
Write abilities use POST with {"input":{...}} JSON body.
Ability Categories
| Category | Description | Example Abilities |
|---|---|---|
| maintenance | Backup, cache, DB optimization | create-backup, flush-cache, optimize-database |
| diagnostics | Health check, error log | health-check, error-log |
| updates | Plugin/theme/core updates | check-updates, update-plugin, update-all |
| plugins | Plugin management | list-plugins, install-plugin, activate-plugin |
| themes | Theme management | list-themes, install-theme, activate-theme |
| users | User management | list-users, create-user, update-user |
| content | Posts, pages, comments, media | list-posts, create-post, list-media |
| settings | WordPress settings | get-general-settings, update-reading-settings |
| taxonomies | Categories, tags | list-categories, create-tag |
| meta | Post, user, term metadata | get-post-meta, set-user-meta |
| wc-products | WooCommerce products | wc-list-products, wc-create-product |
| wc-orders | WooCommerce orders | wc-list-orders, wc-update-order-status |
| wc-reports | WooCommerce reports | wc-sales-report, wc-top-sellers |
Plugin Management Abilities
list-plugins
List all installed plugins.
Method: GET
Input:
| Field | Type | Default | Description |
|---|---|---|---|
status | string | all | Filter: all, active, inactive |
Output:
{
"plugins": [
{
"slug": "akismet/akismet.php",
"name": "Akismet Anti-spam",
"version": "5.6",
"author": "Automattic",
"active": true
}
],
"total": 7
}install-plugin
Install a plugin from WordPress.org.
Method: POST
Input:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
slug | string | yes | - | Plugin slug (e.g., hello-dolly) |
activate | boolean | no | false | Activate after installation |
activate-plugin / deactivate-plugin
Activate or deactivate a plugin.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
plugin | string | yes | Plugin slug (e.g., hello-dolly/hello.php) |
delete-plugin
Delete a plugin.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
plugin | string | yes | Plugin file path (e.g., hello-dolly/hello.php) |
update-plugin
Update a single plugin.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
plugin | string | yes | Plugin slug (e.g., classic-editor/classic-editor.php) |
Output:
{
"success": true,
"message": "Plugin updated successfully: 1.6.6 -> 1.6.7",
"old_version": "1.6.6",
"new_version": "1.6.7"
}check-updates
Check for available updates (core, plugins, themes).
Input:
| Field | Type | Default | Description |
|---|---|---|---|
type | string | all | all, core, plugins, themes |
force_refresh | boolean | false | Clear update cache |
update-all
Update all plugins and themes at once.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
include_core | boolean | false | Include WordPress core |
include_plugins | boolean | true | Update plugins |
include_themes | boolean | true | Update themes |
stop_on_error | boolean | true | Stop on PHP error |
Theme Management Abilities
list-themes
List all installed themes.
install-theme
Install a theme from WordPress.org.
Input:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
slug | string | yes | - | Theme slug |
activate | boolean | no | false | Activate after install |
activate-theme / delete-theme / update-theme
Manage theme lifecycle. Input requires theme (string, theme slug).
Content Abilities - Posts
list-posts
List posts with filtering and pagination.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
post_type | string | post | Post type |
limit | integer | 20 | Items (1-100) |
offset | integer | 0 | Skip items |
status | string | any | publish, draft, pending, trash, any |
author | integer | - | Author ID |
category | string | - | Category slug |
tag | string | - | Tag slug |
search | string | - | Search title/content |
date_after | string | - | After date (Y-m-d) |
date_before | string | - | Before date (Y-m-d) |
orderby | string | date | Sort field |
order | string | DESC | ASC, DESC |
get-post
Get detailed post information by id or slug.
create-post
Create a new post.
Input:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
title | string | yes | - | Title |
content | string | no | - | Content (HTML) |
status | string | no | draft | Status |
post_type | string | no | post | Post type |
categories | array | no | - | Category IDs |
tags | array | no | - | Tag names, slugs or IDs |
featured_image | integer | no | - | Featured image ID |
meta | object | no | - | Custom meta fields |
taxonomies | object | no | - | Custom taxonomies |
update-post
Update a post. Requires id, all other fields optional.
delete-post
Delete a post. Input: id (required), force (boolean, skip trash).
restore-post / duplicate-post / bulk-posts
Additional post operations. bulk-posts accepts ids (array) and action (publish, draft, trash, delete, restore).
get-post-types
List available post types. Filter by public (boolean).
set-post-terms / get-post-terms
Manage taxonomy terms for a post. Supports custom post types and custom taxonomies.
Content Abilities - Pages
list-pages
List pages with filtering. Similar to list-posts but defaults to menu_order sort.
get-page / create-page / update-page / delete-page
Full CRUD for pages. Same structure as post abilities with additional parent, menu_order, and template fields.
page-hierarchy
Get hierarchical page tree.
page-templates
List available page templates.
front-page-settings / set-homepage / set-posts-page
Manage homepage and blog page settings.
restore-page / duplicate-page / reorder-pages / set-page-template
Additional page management operations.
Content Abilities - Comments
list-comments
List comments with filtering.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
limit | integer | 50 | Items (1-100) |
status | string | all | all, approve, hold, spam, trash |
post_id | integer | - | Filter by post |
search | string | - | Search content |
get-comment / create-comment / update-comment / delete-comment
Full CRUD for comments.
approve-comment / spam-comment
Quick status actions for comments.
bulk-comments
Bulk operations. Input: ids (array), action (approve, unapprove, spam, trash, delete).
comment-counts
Get comment statistics, optionally filtered by post_id.
Content Abilities - Media
list-media
List media items. Filter by mime_type (e.g., image, video).
get-media
Get detailed media item information including sizes.
upload-media
Upload media from URL or base64 data.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
url | string | - | Source URL (use EITHER url OR data+filename) |
data | string | - | Base64 encoded file data |
filename | string | - | Filename with extension (required with data) |
title | string | no | Media title |
alt | string | no | Alt text |
update-media / delete-media
Update metadata or delete media items.
Taxonomy Abilities - Categories
list-categories / get-category / create-category / update-category / delete-category
Full CRUD for categories. Supports custom taxonomies via the taxonomy parameter (e.g., product_category).
list-categories Input:
| Field | Type | Default | Description |
|---|---|---|---|
taxonomy | string | category | Taxonomy name |
limit | integer | 20 | Items to return |
hide_empty | boolean | false | Hide empty categories |
search | string | - | Search term |
parent | integer | - | Filter by parent |
orderby | string | name | Sort field |
Note: The default category (Uncategorized) cannot be deleted. Posts in deleted categories move to default.
Taxonomy Abilities - Tags
list-tags / get-tag / create-tag / update-tag / delete-tag
Full CRUD for tags. Supports custom taxonomies via the taxonomy parameter (e.g., product_tag).
Note: Tags are not hierarchical. Deleted tags are automatically removed from associated posts.
Meta Abilities
Post Meta
| Ability | Method | Description |
|---|---|---|
get-post-meta | GET | Get post/page metadata |
set-post-meta | POST | Set post/page metadata |
delete-post-meta | DELETE | Delete post/page metadata |
get-post-meta Input:
| Field | Type | Required | Description |
|---|---|---|---|
post_id | integer | yes | Post or page ID |
key | string | no | Specific meta key (returns all if omitted) |
include_private | boolean | no | Include private meta keys (starting with _) |
User Meta
| Ability | Method | Description |
|---|---|---|
get-user-meta | GET | Get user metadata |
set-user-meta | POST | Set user metadata |
delete-user-meta | DELETE | Delete user metadata |
Term Meta
| Ability | Method | Description |
|---|---|---|
get-term-meta | GET | Get category/tag metadata |
set-term-meta | POST | Set category/tag metadata |
delete-term-meta | DELETE | Delete category/tag metadata |
Note: Private meta keys (starting with
_) are not included by default. Useinclude_private: trueto include them. Meta values can be simple types or complex types (arrays, objects) - WordPress handles serialization automatically.
User Management Abilities
list-users
List users with filtering and pagination.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
limit | integer | 50 | Items to return |
orderby | string | registered | Sort: registered, display_name, email, login |
role | string | - | Filter by role |
search | string | - | Search username, email, display_name |
get-user
Get detailed user information by id, email, or login.
create-user
Create a new user.
Input:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
username | string | yes | - | Username |
email | string | yes | - | Email address |
password | string | no | auto-generated | Password |
role | string | no | subscriber | Role |
send_notification | boolean | no | false | Send welcome email |
Note: The
passwordfield is only included in the response if it was auto-generated.
update-user / delete-user
Update user fields or delete a user. Delete supports reassign_to for content reassignment.
reset-password
Reset a user’s password. Identify by id, email, or login.
get-roles
List all available roles with user counts.
Settings Abilities
General Settings
| Ability | Method | Description |
|---|---|---|
get-general-settings | GET | Site title, tagline, email, timezone, etc. |
update-general-settings | POST | Update general settings |
Updatable fields: blogname, blogdescription, admin_email, users_can_register, default_role, timezone_string, date_format, time_format, start_of_week, WPLANG
Note:
siteurlandhomecannot be modified via API for security reasons.
Reading Settings
| Ability | Method | Description |
|---|---|---|
get-reading-settings | GET | Posts per page, RSS, homepage display |
update-reading-settings | POST | Update reading settings |
Discussion Settings
| Ability | Method | Description |
|---|---|---|
get-discussion-settings | GET | Comments, pingbacks, moderation, avatars |
update-discussion-settings | POST | Update discussion settings |
Permalink Settings
| Ability | Method | Description |
|---|---|---|
get-permalink-settings | GET | Permalink structure, category/tag base |
update-permalink-settings | POST | Update permalinks (auto-regenerates rewrite rules) |
Maintenance Abilities
Backup
| Ability | Method | Description |
|---|---|---|
create-backup | POST | Start async backup job |
backup-status | GET | Get backup progress |
cancel-backup | POST | Cancel running backup |
list-backups | GET | List available backups |
restore-backup | DELETE | Restore from backup |
delete-backup | DELETE | Delete a backup file |
create-backup Input:
| Field | Type | Default | Description |
|---|---|---|---|
include_database | boolean | true | Include database |
include_files | boolean | true | Include WordPress files |
Output:
{
"success": true,
"backup_id": "2026-01-13_07-04-13_8fMZyHG8",
"status": "pending",
"total_files": 6270,
"total_size_human": "118 MB",
"chunks_total": 13
}Note: Backups run asynchronously. Use
backup-statusto track progress. Backups are stored inwp-content/uploads/wpsm-backups/.
Health & Diagnostics
health-check
Run a comprehensive site health check.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
include_debug | boolean | false | Include debug information |
Output:
{
"status": "recommended",
"score": 87,
"issues": [
{ "type": "warning", "message": "4 theme update(s) available", "category": "updates" }
],
"php_version": "8.1.31",
"wp_version": "6.9",
"disk_usage": { "total_human": "37 GB", "free_human": "24 GB", "wordpress": { "total": "187 MB" } },
"memory": { "limit": "256 MB", "usage": "8 MB" }
}error-log
Get PHP error log.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
lines | integer | 100 | Lines to retrieve (max 1000) |
filter | string | - | Filter by keyword |
level | string | all | all, error, warning, notice |
Database
optimize-database
Optimize database tables.
Input: tables (array, optional - all tables if empty)
cleanup-database
Delete revisions, transients, spam and other unnecessary data.
Input:
| Field | Type | Default | Description |
|---|---|---|---|
revisions | boolean | true | Delete post revisions |
auto_drafts | boolean | true | Delete auto-draft posts |
trash_posts | boolean | true | Delete trashed posts |
spam_comments | boolean | true | Delete spam comments |
trash_comments | boolean | true | Delete trashed comments |
expired_transients | boolean | true | Delete expired transients |
all_transients | boolean | false | Delete all transients |
Cache
flush-cache
Flush caches (object cache, page cache, OPcache, plugin caches).
Input:
| Field | Type | Default | Description |
|---|---|---|---|
object_cache | boolean | true | Flush object cache |
page_cache | boolean | true | Flush page cache |
opcache | boolean | true | Flush PHP OPcache |
plugin_caches | boolean | true | Flush plugin caches |
Plugin Database Updates
| Ability | Method | Description |
|---|---|---|
check-plugin-db-updates | GET | Check for pending DB updates (WooCommerce, Elementor) |
update-plugin-db | DELETE | Run DB update for specific plugin |
update-all-plugin-dbs | DELETE | Run all pending DB updates |
get-supported-db-plugins | GET | List supported plugins for DB updates |
WooCommerce Abilities
WooCommerce abilities are only available when WooCommerce is active.
Products
| Ability | Method | Description |
|---|---|---|
wc-list-products | GET | List products with filtering |
wc-get-product | GET | Get product details (by id, sku, or slug) |
wc-create-product | POST | Create a product |
wc-update-product | POST | Update a product |
wc-delete-product | DELETE | Delete a product |
wc-duplicate-product | POST | Duplicate a product |
wc-update-stock | POST | Quick stock update (set quantity, adjust +/-, or stock_status) |
wc-list-product-categories | GET | List product categories |
wc-list-variations | GET | List variations of a variable product |
wc-bulk-products | POST | Bulk operations (publish, draft, trash, delete, restore) |
wc-list-products Input:
| Field | Type | Default | Description |
|---|---|---|---|
status | string | any | publish, draft, pending, private, trash, any |
type | string | - | simple, variable, grouped, external |
category | string | - | Category slug or ID |
stock_status | string | - | instock, outofstock, onbackorder |
featured | boolean | - | Featured products only |
on_sale | boolean | - | Products on sale only |
search | string | - | Search in name |
limit | integer | 20 | Items (1-100) |
Orders
| Ability | Method | Description |
|---|---|---|
wc-list-orders | GET | List orders with filtering |
wc-get-order | GET | Get order details (items, addresses, shipping, coupons) |
wc-update-order-status | POST | Change order status |
wc-list-order-statuses | GET | List available order statuses |
wc-create-refund | POST | Create a refund |
wc-list-order-notes | GET | List order notes |
wc-add-order-note | POST | Add a note to an order |
wc-bulk-orders | POST | Bulk status update |
wc-update-order-status Input:
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | yes | Order ID |
status | string | yes | New status (e.g., processing, completed) |
note | string | no | Note for status change |
Reports
| Ability | Method | Description |
|---|---|---|
wc-sales-report | GET | Sales report for a period |
wc-top-sellers | GET | Top-selling products |
wc-orders-totals | GET | Order counts by status |
wc-revenue-stats | GET | Revenue with period comparison |
wc-low-stock-products | GET | Low stock and out of stock products |
wc-products-totals | GET | Product counts by status and stock |
wc-sales-report Input:
| Field | Type | Default | Description |
|---|---|---|---|
period | string | month | day, week, month, year, last_7_days, last_30_days |
date_min | string | - | Custom start date (Y-m-d) |
date_max | string | - | Custom end date (Y-m-d) |
wc-revenue-stats Input:
| Field | Type | Default | Description |
|---|---|---|---|
period | string | last_7_days | today, last_7_days, last_30_days, this_month, this_year |
compare | boolean | false | Compare with previous period |
Output (with comparison):
{
"success": true,
"period": "last_7_days",
"current": { "revenue": 850.00, "orders": 15, "items_sold": 28 },
"previous": { "revenue": 720.00, "orders": 12, "items_sold": 22 },
"changes": {
"revenue": { "value": 130.00, "percentage": 18.06, "trend": "up" },
"orders": { "value": 3, "percentage": 25.00, "trend": "up" }
}
}Extending with Custom Abilities
LW Site Manager provides two action hooks that allow any WordPress plugin to register its own abilities and categories.
Hooks
| Hook | When | Parameters |
|---|---|---|
lw_site_manager_register_categories | During category registration | None |
lw_site_manager_register_abilities | After all core abilities are registered | $permissions (PermissionManager) |
Quick Start
// In your plugin's init or plugins_loaded hook:
add_action( 'lw_site_manager_register_categories', function (): void {
wp_register_ability_category( 'my-plugin', [
'label' => __( 'My Plugin', 'my-plugin' ),
'description' => __( 'My plugin management abilities', 'my-plugin' ),
]);
});
add_action( 'lw_site_manager_register_abilities', function ( $permissions ): void {
wp_register_ability( 'my-plugin/get-status', [
'label' => __( 'Get Status', 'my-plugin' ),
'description' => __( 'Get current plugin status.', 'my-plugin' ),
'category' => 'my-plugin',
'execute_callback' => [ MyService::class, 'get_status' ],
'permission_callback' => $permissions->callback( 'can_manage_options' ),
'input_schema' => [
'type' => 'object',
'default' => [],
],
'output_schema' => [
'type' => 'object',
'properties' => [
'success' => [ 'type' => 'boolean' ],
'status' => [ 'type' => 'string' ],
],
],
'meta' => [
'show_in_rest' => true,
'annotations' => [
'readonly' => true,
'destructive' => false,
'idempotent' => true,
],
],
]);
});Naming Convention
Use your plugin slug as prefix to prevent naming collisions:
my-plugin/get-status
my-plugin/set-options
lw-seo/get-meta
lw-cookie/get-consentPermission Manager
The $permissions parameter provides these methods:
| Method | Capability |
|---|---|
can_manage_options | manage_options |
can_edit_posts | edit_posts |
can_publish_posts | publish_posts |
can_delete_posts | delete_posts |
can_manage_users | list_users |
can_edit_users | edit_users |
can_upload_files | upload_files |
can_manage_categories | manage_categories |
You can also use a custom callback:
'permission_callback' => fn() => current_user_can( 'my_custom_capability' ),Input/Output Schema
Both use JSON Schema format:
'input_schema' => [
'type' => 'object',
'required' => [ 'post_id' ],
'properties' => [
'post_id' => [
'type' => 'integer',
'description' => __( 'The post ID.', 'my-plugin' ),
],
],
],Execute Callback
A static method that receives array $input and returns array (success) or \WP_Error (failure):
class MyService {
public static function get_status( array $input ): array|\WP_Error {
if ( empty( $input['post_id'] ) ) {
return new \WP_Error(
'missing_id',
__( 'Post ID is required.', 'my-plugin' ),
[ 'status' => 400 ]
);
}
$post = get_post( (int) $input['post_id'] );
if ( ! $post ) {
return new \WP_Error( 'not_found', __( 'Post not found.', 'my-plugin' ), [ 'status' => 404 ] );
}
return [ 'success' => true, 'status' => $post->post_status ];
}
}No Hard Dependency
Your plugin should work even if LW Site Manager is not installed. The hooks simply never fire:
// Safe - these hooks are no-ops if site manager is not active.
add_action( 'lw_site_manager_register_categories', [ MyIntegration::class, 'register_category' ] );
add_action( 'lw_site_manager_register_abilities', [ MyIntegration::class, 'register_abilities' ] );Recommended File Structure
your-plugin/
includes/
SiteManager/
Integration.php # Hook registration + category
Abilities.php # wp_register_ability() calls
Service.php # Execute callbacksReal-World Example: LW SEO
includes/SiteManager/
Integration.php # Hook registration
SeoAbilities.php # Ability definitions
SeoService.php # Execute callbacksRegistered abilities:
| Ability | Type | Description |
|---|---|---|
lw-seo/get-meta | readonly | Get SEO meta for a post or term |
lw-seo/set-meta | write | Set SEO meta (title, description, social, signals) |
lw-seo/get-content-signals | readonly | Get resolved AI content signals |
lw-seo/get-markdown | readonly | Get markdown representation of content |
lw-seo/get-options | readonly | Get global SEO settings |
Official Sources
- Introducing the WordPress Abilities APIÂ
- Abilities API - Common APIs HandbookÂ
- Abilities API in WordPress 6.9Â
- @wordpress/abilities PackageÂ
- GitHub: WordPress/abilities-apiÂ
FAQ
What is the WordPress Abilities API?
The WordPress Abilities API is a feature in WordPress 6.9 that allows plugins to register standardized capabilities that can be executed via REST API, PHP, or JavaScript.
How do I authenticate API requests?
Use WordPress Application Passwords. Go to Users > Your Profile > Application Passwords to create one. Then use Basic Auth with your username and app password.
Does this work with WooCommerce?
Yes. When WooCommerce is active, additional abilities for managing products, orders, customers, and reports become available.
How does the HTTP method get determined?
The WordPress Abilities API determines HTTP method based on meta annotations:
readonly: true- GETdestructive: true, idempotent: true- DELETE- otherwise - POST