home / skills / automattic / agent-skills / wp-abilities-api

wp-abilities-api skill

/skills/wp-abilities-api

This skill guides implementing the WordPress Abilities API, including registration, REST exposure, and client consumption for secure permissions.

npx playbooks add skill automattic/agent-skills --skill wp-abilities-api

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
3.6 KB
---
name: wp-abilities-api
description: "Use when working with the WordPress Abilities API (wp_register_ability, wp_register_ability_category, /wp-json/wp-abilities/v1/*, @wordpress/abilities) including defining abilities, categories, meta, REST exposure, and permissions checks for clients."
compatibility: "Targets WordPress 6.9+ (PHP 7.2.24+). Filesystem-based agent with bash + node. Some workflows require WP-CLI."
---

# WP Abilities API

## When to use

Use this skill when the task involves:

- registering abilities or ability categories in PHP,
- exposing abilities to clients via REST (`wp-abilities/v1`),
- consuming abilities in JS (notably `@wordpress/abilities`),
- diagnosing “ability doesn’t show up” / “client can’t see ability” / “REST returns empty”.

## Inputs required

- Repo root (run `wp-project-triage` first if you haven’t).
- Target WordPress version(s) and whether this is WP core or a plugin/theme.
- Where the change should live (plugin vs theme vs mu-plugin).

## Procedure

### 1) Confirm availability and version constraints

- If this is WP core work, check `signals.isWpCoreCheckout` and `versions.wordpress.core`.
- If the project targets WP < 6.9, you may need the Abilities API plugin/package rather than relying on core.

### 2) Find existing Abilities usage

Search for these in the repo:

- `wp_register_ability(`
- `wp_register_ability_category(`
- `wp_abilities_api_init`
- `wp_abilities_api_categories_init`
- `wp-abilities/v1`
- `@wordpress/abilities`

If none exist, decide whether you’re introducing Abilities API fresh (new registrations + client consumption) or only consuming.

### 3) Register categories (optional)

If you need a logical grouping, register an ability category early (see `references/php-registration.md`).

### 4) Register abilities (PHP)

Implement the ability in PHP registration with:

- stable `id` (namespaced),
- `label`/`description`,
- `category`,
- `meta`:
  - add `readonly: true` when the ability is informational,
  - set `show_in_rest: true` for abilities you want visible to clients.

Use the documented init hooks for Abilities API registration so they load at the right time (see `references/php-registration.md`).

### 5) Confirm REST exposure

- Verify the REST endpoints exist and return expected results (see `references/rest-api.md`).
- If the client still can’t see the ability, confirm `meta.show_in_rest` is enabled and you’re querying the right endpoint.

### 6) Consume from JS (if needed)

- Prefer `@wordpress/abilities` APIs for client-side access and checks.
- Ensure build tooling includes the dependency and the project’s build pipeline bundles it.

## Verification

- `wp-project-triage` indicates `signals.usesAbilitiesApi: true` after your change (if applicable).
- REST check (in a WP environment): endpoints under `wp-abilities/v1` return your ability and category when expected.
- If the repo has tests, add/update coverage near:
  - PHP: ability registration and meta exposure
  - JS: ability consumption and UI gating

## Failure modes / debugging

- Ability never appears:
  - registration code not running (wrong hook / file not loaded),
  - missing `meta.show_in_rest`,
  - incorrect category/ID mismatch.
- REST shows ability but JS doesn’t:
  - wrong REST base/namespace,
  - JS dependency not bundled,
  - caching (object/page caches) masking changes.

## Escalation

- If you’re uncertain about version support, confirm target WP core versions and whether Abilities API is expected from core or as a plugin.
- For canonical details, consult:
  - `references/rest-api.md`
  - `references/php-registration.md`

Overview

This skill helps engineers implement and debug the WordPress Abilities API end-to-end. It covers registering abilities and categories in PHP, exposing them via the REST endpoints, and consuming or checking abilities in client-side JavaScript using @wordpress/abilities.

How this skill works

The skill inspects the codebase for PHP registration calls (wp_register_ability, wp_register_ability_category) and REST usage under wp-abilities/v1, plus JS imports of @wordpress/abilities. It guides where to register categories and abilities, which meta flags to set (notably show_in_rest and readonly), verifies REST exposure, and outlines common failure modes and fixes.

When to use it

  • Adding new abilities or categories to a plugin, theme, or core work.
  • Exposing server-side abilities to client apps via the REST API.
  • Troubleshooting abilities that do not appear in REST responses or JS checks.
  • Migrating projects to use @wordpress/abilities for client-side permission checks.
  • Ensuring compatibility on sites targeting WordPress versions before Abilities support in core.

Best practices

  • Use stable, namespaced IDs for abilities and a clear category to avoid collisions.
  • Set meta.show_in_rest = true for any ability clients must consume; use readonly for informational flags.
  • Register abilities on the documented init hooks so registration code always runs.
  • Prefer @wordpress/abilities on the client and ensure your build bundles that dependency.
  • Run REST checks in a local WP environment and clear caches when results differ from expectations.

Example use cases

  • Register a new ability in a plugin and expose it so a React admin app can hide/show UI.
  • Add an ability category for a custom feature set to group related permissions.
  • Fix a missing ability by enabling show_in_rest and correcting the registration hook.
  • Update client code to consume abilities via @wordpress/abilities instead of custom REST parsing.
  • Validate Abilities API availability when supporting sites running older WordPress versions.

FAQ

What if the ability is registered but not returned by the REST endpoint?

Confirm meta.show_in_rest is true, the registration runs on the correct init hook, and you are querying the correct wp-abilities/v1 endpoint; also clear caches.

Do I always need @wordpress/abilities on the client?

It is recommended for consistent checks and helpers, but you can consume the REST endpoint directly if you cannot add the package to your build.