[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-wordpress-wp-rest-api":3,"mdc--7lw65w-key":37,"related-org-wordpress-wp-rest-api":1035,"related-repo-wordpress-wp-rest-api":1234},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"wp-rest-api","build and debug WordPress REST API endpoints","Use when building, extending, or debugging WordPress REST API endpoints\u002Froutes: register_rest_route, WP_REST_Controller\u002Fcontroller classes, schema\u002Fargument validation, permission_callback\u002Fauthentication, response shaping, register_rest_field\u002Fregister_meta, or exposing CPTs\u002Ftaxonomies via show_in_rest.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"wordpress","WordPress","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fwordpress.png",[12,16,19,20,23],{"name":13,"slug":14,"type":15},"PHP","php","tag",{"name":17,"slug":18,"type":15},"Backend","backend",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"REST API","rest-api",{"name":24,"slug":25,"type":15},"API Development","api-development",1892,"https:\u002F\u002Fgithub.com\u002FWordPress\u002Fagent-skills","2026-04-06T18:58:16.607969",null,284,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Expert-level WordPress knowledge for AI coding assistants - blocks, themes, plugins, and best practices","https:\u002F\u002Fgithub.com\u002FWordPress\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fwp-rest-api","---\nname: wp-rest-api\ndescription: \"Use when building, extending, or debugging WordPress REST API endpoints\u002Froutes: register_rest_route, WP_REST_Controller\u002Fcontroller classes, schema\u002Fargument validation, permission_callback\u002Fauthentication, response shaping, register_rest_field\u002Fregister_meta, or exposing CPTs\u002Ftaxonomies via show_in_rest.\"\ncompatibility: \"Targets WordPress 7.0+ (PHP 7.4.0+). Filesystem-based agent with bash + node. Some workflows require WP-CLI.\"\n---\n\n# WP REST API\n\n## When to use\n\nUse this skill when you need to:\n\n- create or update REST routes\u002Fendpoints\n- debug 401\u002F403\u002F404 errors or permission\u002Fnonce issues\n- add custom fields\u002Fmeta to REST responses\n- expose custom post types or taxonomies via REST\n- implement schema + argument validation\n- adjust response links\u002Fembedding\u002Fpagination\n\n## Inputs required\n\n- Repo root + target plugin\u002Ftheme\u002Fmu-plugin (path to entrypoint).\n- Desired namespace + version (e.g. `my-plugin\u002Fv1`) and routes.\n- Authentication mode (cookie + nonce vs application passwords vs auth plugin).\n- Target WordPress version constraints (if below 7.0, call out).\n\n## Procedure\n\n### 0) Triage and locate REST usage\n\n1. Run triage:\n   - `node skills\u002Fwp-project-triage\u002Fscripts\u002Fdetect_wp_project.mjs`\n2. Search for existing REST usage:\n   - `register_rest_route`\n   - `WP_REST_Controller`\n   - `rest_api_init`\n   - `show_in_rest`, `rest_base`, `rest_controller_class`\n\nIf this is a full site repo, pick the specific plugin\u002Ftheme before changing code.\n\n### 1) Choose the right approach\n\n- **Expose CPT\u002Ftaxonomy in `wp\u002Fv2`:**\n  - Use `show_in_rest => true` + `rest_base` if needed.\n  - Optionally provide `rest_controller_class`.\n  - Read `references\u002Fcustom-content-types.md`.\n- **Custom endpoints:**\n  - Use `register_rest_route()` on `rest_api_init`.\n  - Prefer a controller class (`WP_REST_Controller` subclass) for anything non-trivial.\n  - Read `references\u002Froutes-and-endpoints.md` and `references\u002Fschema.md`.\n\n### 2) Register routes safely (namespaces, methods, permissions)\n\n- Use a unique namespace `vendor\u002Fv1`; avoid `wp\u002F*` unless core.\n- Always provide `permission_callback` (use `__return_true` for public endpoints).\n- Use `WP_REST_Server::READABLE\u002FCREATABLE\u002FEDITABLE\u002FDELETABLE` constants.\n- Return data via `rest_ensure_response()` or `WP_REST_Response`.\n- Return errors via `WP_Error` with an explicit `status`.\n\nRead `references\u002Froutes-and-endpoints.md`.\n\n### 3) Validate\u002Fsanitize request args\n\n- Define `args` with `type`, `default`, `required`, `validate_callback`, `sanitize_callback`.\n- Prefer JSON Schema validation with `rest_validate_value_from_schema` then `rest_sanitize_value_from_schema`.\n- Never read `$_GET`\u002F`$_POST` directly inside endpoints; use `WP_REST_Request`.\n\nRead `references\u002Fschema.md`.\n\n### 4) Responses, fields, and links\n\n- Do **not** remove core fields from default endpoints; add fields instead.\n- Use `register_rest_field` for computed fields; `register_meta` with `show_in_rest` for meta.\n- For `object`\u002F`array` meta, define schema in `show_in_rest.schema`.\n- If you need unfiltered post content (e.g., ToC plugins injecting HTML), request `?context=edit` to access `content.raw` (auth required). Pair with `_fields=content.raw` to keep responses small.\n- Add related resource links via `WP_REST_Response::add_link()`.\n\nRead `references\u002Fresponses-and-fields.md`.\n\n### 5) Authentication and authorization\n\n- For wp-admin\u002FJS: cookie auth + `X-WP-Nonce` (action `wp_rest`).\n- For external clients: application passwords (basic auth) or an auth plugin.\n- Use capability checks in `permission_callback` (authorization), not just “logged in”.\n\nRead `references\u002Fauthentication.md`.\n\n### 6) Client-facing behavior (discovery, pagination, embeds)\n\n- Ensure discovery works (`Link` header or `\u003Clink rel=\"https:\u002F\u002Fapi.w.org\u002F\">`).\n- Support `_fields`, `_embed`, `_method`, `_envelope`, pagination headers.\n- Remember `per_page` is capped at 100.\n\nRead `references\u002Fdiscovery-and-params.md`.\n\n## Verification\n\n- `\u002Fwp-json\u002F` index includes your namespace.\n- `OPTIONS` on your route returns schema (when provided).\n- Endpoint returns expected data; permission failures return 401\u002F403 as appropriate.\n- CPT\u002Ftaxonomy routes appear under `wp\u002Fv2` when `show_in_rest` is true.\n- Run repo lint\u002Ftests and any PHP\u002FJS build steps.\n\n## Failure modes \u002F debugging\n\n- 404: `rest_api_init` not firing, route typo, or permalinks off (use `?rest_route=`).\n- 401\u002F403: missing nonce\u002Fauth, or `permission_callback` too strict.\n- `_doing_it_wrong` for missing `permission_callback`: add it (use `__return_true` if public).\n- Invalid params: missing\u002Fincorrect `args` schema or validation callbacks.\n- Fields missing: `show_in_rest` false, meta not registered, or CPT lacks `custom-fields` support.\n\n## Escalation\n\nIf version support or behavior is unclear, consult the REST API Handbook and core docs before inventing patterns.\n",{"data":38,"body":40},{"name":4,"description":6,"compatibility":39},"Targets WordPress 7.0+ (PHP 7.4.0+). Filesystem-based agent with bash + node. Some workflows require WP-CLI.",{"type":41,"children":42},"root",[43,51,58,64,99,105,137,143,150,230,235,241,368,374,471,481,487,586,596,602,711,722,728,769,780,786,856,867,873,927,933,1024,1030],{"type":44,"tag":45,"props":46,"children":47},"element","h1",{"id":4},[48],{"type":49,"value":50},"text","WP REST API",{"type":44,"tag":52,"props":53,"children":55},"h2",{"id":54},"when-to-use",[56],{"type":49,"value":57},"When to use",{"type":44,"tag":59,"props":60,"children":61},"p",{},[62],{"type":49,"value":63},"Use this skill when you need to:",{"type":44,"tag":65,"props":66,"children":67},"ul",{},[68,74,79,84,89,94],{"type":44,"tag":69,"props":70,"children":71},"li",{},[72],{"type":49,"value":73},"create or update REST routes\u002Fendpoints",{"type":44,"tag":69,"props":75,"children":76},{},[77],{"type":49,"value":78},"debug 401\u002F403\u002F404 errors or permission\u002Fnonce issues",{"type":44,"tag":69,"props":80,"children":81},{},[82],{"type":49,"value":83},"add custom fields\u002Fmeta to REST responses",{"type":44,"tag":69,"props":85,"children":86},{},[87],{"type":49,"value":88},"expose custom post types or taxonomies via REST",{"type":44,"tag":69,"props":90,"children":91},{},[92],{"type":49,"value":93},"implement schema + argument validation",{"type":44,"tag":69,"props":95,"children":96},{},[97],{"type":49,"value":98},"adjust response links\u002Fembedding\u002Fpagination",{"type":44,"tag":52,"props":100,"children":102},{"id":101},"inputs-required",[103],{"type":49,"value":104},"Inputs required",{"type":44,"tag":65,"props":106,"children":107},{},[108,113,127,132],{"type":44,"tag":69,"props":109,"children":110},{},[111],{"type":49,"value":112},"Repo root + target plugin\u002Ftheme\u002Fmu-plugin (path to entrypoint).",{"type":44,"tag":69,"props":114,"children":115},{},[116,118,125],{"type":49,"value":117},"Desired namespace + version (e.g. ",{"type":44,"tag":119,"props":120,"children":122},"code",{"className":121},[],[123],{"type":49,"value":124},"my-plugin\u002Fv1",{"type":49,"value":126},") and routes.",{"type":44,"tag":69,"props":128,"children":129},{},[130],{"type":49,"value":131},"Authentication mode (cookie + nonce vs application passwords vs auth plugin).",{"type":44,"tag":69,"props":133,"children":134},{},[135],{"type":49,"value":136},"Target WordPress version constraints (if below 7.0, call out).",{"type":44,"tag":52,"props":138,"children":140},{"id":139},"procedure",[141],{"type":49,"value":142},"Procedure",{"type":44,"tag":144,"props":145,"children":147},"h3",{"id":146},"_0-triage-and-locate-rest-usage",[148],{"type":49,"value":149},"0) Triage and locate REST usage",{"type":44,"tag":151,"props":152,"children":153},"ol",{},[154,171],{"type":44,"tag":69,"props":155,"children":156},{},[157,159],{"type":49,"value":158},"Run triage:\n",{"type":44,"tag":65,"props":160,"children":161},{},[162],{"type":44,"tag":69,"props":163,"children":164},{},[165],{"type":44,"tag":119,"props":166,"children":168},{"className":167},[],[169],{"type":49,"value":170},"node skills\u002Fwp-project-triage\u002Fscripts\u002Fdetect_wp_project.mjs",{"type":44,"tag":69,"props":172,"children":173},{},[174,176],{"type":49,"value":175},"Search for existing REST usage:\n",{"type":44,"tag":65,"props":177,"children":178},{},[179,188,197,206],{"type":44,"tag":69,"props":180,"children":181},{},[182],{"type":44,"tag":119,"props":183,"children":185},{"className":184},[],[186],{"type":49,"value":187},"register_rest_route",{"type":44,"tag":69,"props":189,"children":190},{},[191],{"type":44,"tag":119,"props":192,"children":194},{"className":193},[],[195],{"type":49,"value":196},"WP_REST_Controller",{"type":44,"tag":69,"props":198,"children":199},{},[200],{"type":44,"tag":119,"props":201,"children":203},{"className":202},[],[204],{"type":49,"value":205},"rest_api_init",{"type":44,"tag":69,"props":207,"children":208},{},[209,215,217,223,224],{"type":44,"tag":119,"props":210,"children":212},{"className":211},[],[213],{"type":49,"value":214},"show_in_rest",{"type":49,"value":216},", ",{"type":44,"tag":119,"props":218,"children":220},{"className":219},[],[221],{"type":49,"value":222},"rest_base",{"type":49,"value":216},{"type":44,"tag":119,"props":225,"children":227},{"className":226},[],[228],{"type":49,"value":229},"rest_controller_class",{"type":44,"tag":59,"props":231,"children":232},{},[233],{"type":49,"value":234},"If this is a full site repo, pick the specific plugin\u002Ftheme before changing code.",{"type":44,"tag":144,"props":236,"children":238},{"id":237},"_1-choose-the-right-approach",[239],{"type":49,"value":240},"1) Choose the right approach",{"type":44,"tag":65,"props":242,"children":243},{},[244,308],{"type":44,"tag":69,"props":245,"children":246},{},[247,261],{"type":44,"tag":248,"props":249,"children":250},"strong",{},[251,253,259],{"type":49,"value":252},"Expose CPT\u002Ftaxonomy in ",{"type":44,"tag":119,"props":254,"children":256},{"className":255},[],[257],{"type":49,"value":258},"wp\u002Fv2",{"type":49,"value":260},":",{"type":44,"tag":65,"props":262,"children":263},{},[264,284,296],{"type":44,"tag":69,"props":265,"children":266},{},[267,269,275,277,282],{"type":49,"value":268},"Use ",{"type":44,"tag":119,"props":270,"children":272},{"className":271},[],[273],{"type":49,"value":274},"show_in_rest => true",{"type":49,"value":276}," + ",{"type":44,"tag":119,"props":278,"children":280},{"className":279},[],[281],{"type":49,"value":222},{"type":49,"value":283}," if needed.",{"type":44,"tag":69,"props":285,"children":286},{},[287,289,294],{"type":49,"value":288},"Optionally provide ",{"type":44,"tag":119,"props":290,"children":292},{"className":291},[],[293],{"type":49,"value":229},{"type":49,"value":295},".",{"type":44,"tag":69,"props":297,"children":298},{},[299,301,307],{"type":49,"value":300},"Read ",{"type":44,"tag":119,"props":302,"children":304},{"className":303},[],[305],{"type":49,"value":306},"references\u002Fcustom-content-types.md",{"type":49,"value":295},{"type":44,"tag":69,"props":309,"children":310},{},[311,316],{"type":44,"tag":248,"props":312,"children":313},{},[314],{"type":49,"value":315},"Custom endpoints:",{"type":44,"tag":65,"props":317,"children":318},{},[319,337,349],{"type":44,"tag":69,"props":320,"children":321},{},[322,323,329,331,336],{"type":49,"value":268},{"type":44,"tag":119,"props":324,"children":326},{"className":325},[],[327],{"type":49,"value":328},"register_rest_route()",{"type":49,"value":330}," on ",{"type":44,"tag":119,"props":332,"children":334},{"className":333},[],[335],{"type":49,"value":205},{"type":49,"value":295},{"type":44,"tag":69,"props":338,"children":339},{},[340,342,347],{"type":49,"value":341},"Prefer a controller class (",{"type":44,"tag":119,"props":343,"children":345},{"className":344},[],[346],{"type":49,"value":196},{"type":49,"value":348}," subclass) for anything non-trivial.",{"type":44,"tag":69,"props":350,"children":351},{},[352,353,359,361,367],{"type":49,"value":300},{"type":44,"tag":119,"props":354,"children":356},{"className":355},[],[357],{"type":49,"value":358},"references\u002Froutes-and-endpoints.md",{"type":49,"value":360}," and ",{"type":44,"tag":119,"props":362,"children":364},{"className":363},[],[365],{"type":49,"value":366},"references\u002Fschema.md",{"type":49,"value":295},{"type":44,"tag":144,"props":369,"children":371},{"id":370},"_2-register-routes-safely-namespaces-methods-permissions",[372],{"type":49,"value":373},"2) Register routes safely (namespaces, methods, permissions)",{"type":44,"tag":65,"props":375,"children":376},{},[377,398,419,431,451],{"type":44,"tag":69,"props":378,"children":379},{},[380,382,388,390,396],{"type":49,"value":381},"Use a unique namespace ",{"type":44,"tag":119,"props":383,"children":385},{"className":384},[],[386],{"type":49,"value":387},"vendor\u002Fv1",{"type":49,"value":389},"; avoid ",{"type":44,"tag":119,"props":391,"children":393},{"className":392},[],[394],{"type":49,"value":395},"wp\u002F*",{"type":49,"value":397}," unless core.",{"type":44,"tag":69,"props":399,"children":400},{},[401,403,409,411,417],{"type":49,"value":402},"Always provide ",{"type":44,"tag":119,"props":404,"children":406},{"className":405},[],[407],{"type":49,"value":408},"permission_callback",{"type":49,"value":410}," (use ",{"type":44,"tag":119,"props":412,"children":414},{"className":413},[],[415],{"type":49,"value":416},"__return_true",{"type":49,"value":418}," for public endpoints).",{"type":44,"tag":69,"props":420,"children":421},{},[422,423,429],{"type":49,"value":268},{"type":44,"tag":119,"props":424,"children":426},{"className":425},[],[427],{"type":49,"value":428},"WP_REST_Server::READABLE\u002FCREATABLE\u002FEDITABLE\u002FDELETABLE",{"type":49,"value":430}," constants.",{"type":44,"tag":69,"props":432,"children":433},{},[434,436,442,444,450],{"type":49,"value":435},"Return data via ",{"type":44,"tag":119,"props":437,"children":439},{"className":438},[],[440],{"type":49,"value":441},"rest_ensure_response()",{"type":49,"value":443}," or ",{"type":44,"tag":119,"props":445,"children":447},{"className":446},[],[448],{"type":49,"value":449},"WP_REST_Response",{"type":49,"value":295},{"type":44,"tag":69,"props":452,"children":453},{},[454,456,462,464,470],{"type":49,"value":455},"Return errors via ",{"type":44,"tag":119,"props":457,"children":459},{"className":458},[],[460],{"type":49,"value":461},"WP_Error",{"type":49,"value":463}," with an explicit ",{"type":44,"tag":119,"props":465,"children":467},{"className":466},[],[468],{"type":49,"value":469},"status",{"type":49,"value":295},{"type":44,"tag":59,"props":472,"children":473},{},[474,475,480],{"type":49,"value":300},{"type":44,"tag":119,"props":476,"children":478},{"className":477},[],[479],{"type":49,"value":358},{"type":49,"value":295},{"type":44,"tag":144,"props":482,"children":484},{"id":483},"_3-validatesanitize-request-args",[485],{"type":49,"value":486},"3) Validate\u002Fsanitize request args",{"type":44,"tag":65,"props":488,"children":489},{},[490,538,558],{"type":44,"tag":69,"props":491,"children":492},{},[493,495,501,503,509,510,516,517,523,524,530,531,537],{"type":49,"value":494},"Define ",{"type":44,"tag":119,"props":496,"children":498},{"className":497},[],[499],{"type":49,"value":500},"args",{"type":49,"value":502}," with ",{"type":44,"tag":119,"props":504,"children":506},{"className":505},[],[507],{"type":49,"value":508},"type",{"type":49,"value":216},{"type":44,"tag":119,"props":511,"children":513},{"className":512},[],[514],{"type":49,"value":515},"default",{"type":49,"value":216},{"type":44,"tag":119,"props":518,"children":520},{"className":519},[],[521],{"type":49,"value":522},"required",{"type":49,"value":216},{"type":44,"tag":119,"props":525,"children":527},{"className":526},[],[528],{"type":49,"value":529},"validate_callback",{"type":49,"value":216},{"type":44,"tag":119,"props":532,"children":534},{"className":533},[],[535],{"type":49,"value":536},"sanitize_callback",{"type":49,"value":295},{"type":44,"tag":69,"props":539,"children":540},{},[541,543,549,551,557],{"type":49,"value":542},"Prefer JSON Schema validation with ",{"type":44,"tag":119,"props":544,"children":546},{"className":545},[],[547],{"type":49,"value":548},"rest_validate_value_from_schema",{"type":49,"value":550}," then ",{"type":44,"tag":119,"props":552,"children":554},{"className":553},[],[555],{"type":49,"value":556},"rest_sanitize_value_from_schema",{"type":49,"value":295},{"type":44,"tag":69,"props":559,"children":560},{},[561,563,569,571,577,579,585],{"type":49,"value":562},"Never read ",{"type":44,"tag":119,"props":564,"children":566},{"className":565},[],[567],{"type":49,"value":568},"$_GET",{"type":49,"value":570},"\u002F",{"type":44,"tag":119,"props":572,"children":574},{"className":573},[],[575],{"type":49,"value":576},"$_POST",{"type":49,"value":578}," directly inside endpoints; use ",{"type":44,"tag":119,"props":580,"children":582},{"className":581},[],[583],{"type":49,"value":584},"WP_REST_Request",{"type":49,"value":295},{"type":44,"tag":59,"props":587,"children":588},{},[589,590,595],{"type":49,"value":300},{"type":44,"tag":119,"props":591,"children":593},{"className":592},[],[594],{"type":49,"value":366},{"type":49,"value":295},{"type":44,"tag":144,"props":597,"children":599},{"id":598},"_4-responses-fields-and-links",[600],{"type":49,"value":601},"4) Responses, fields, and links",{"type":44,"tag":65,"props":603,"children":604},{},[605,617,643,670,699],{"type":44,"tag":69,"props":606,"children":607},{},[608,610,615],{"type":49,"value":609},"Do ",{"type":44,"tag":248,"props":611,"children":612},{},[613],{"type":49,"value":614},"not",{"type":49,"value":616}," remove core fields from default endpoints; add fields instead.",{"type":44,"tag":69,"props":618,"children":619},{},[620,621,627,629,635,636,641],{"type":49,"value":268},{"type":44,"tag":119,"props":622,"children":624},{"className":623},[],[625],{"type":49,"value":626},"register_rest_field",{"type":49,"value":628}," for computed fields; ",{"type":44,"tag":119,"props":630,"children":632},{"className":631},[],[633],{"type":49,"value":634},"register_meta",{"type":49,"value":502},{"type":44,"tag":119,"props":637,"children":639},{"className":638},[],[640],{"type":49,"value":214},{"type":49,"value":642}," for meta.",{"type":44,"tag":69,"props":644,"children":645},{},[646,648,654,655,661,663,669],{"type":49,"value":647},"For ",{"type":44,"tag":119,"props":649,"children":651},{"className":650},[],[652],{"type":49,"value":653},"object",{"type":49,"value":570},{"type":44,"tag":119,"props":656,"children":658},{"className":657},[],[659],{"type":49,"value":660},"array",{"type":49,"value":662}," meta, define schema in ",{"type":44,"tag":119,"props":664,"children":666},{"className":665},[],[667],{"type":49,"value":668},"show_in_rest.schema",{"type":49,"value":295},{"type":44,"tag":69,"props":671,"children":672},{},[673,675,681,683,689,691,697],{"type":49,"value":674},"If you need unfiltered post content (e.g., ToC plugins injecting HTML), request ",{"type":44,"tag":119,"props":676,"children":678},{"className":677},[],[679],{"type":49,"value":680},"?context=edit",{"type":49,"value":682}," to access ",{"type":44,"tag":119,"props":684,"children":686},{"className":685},[],[687],{"type":49,"value":688},"content.raw",{"type":49,"value":690}," (auth required). Pair with ",{"type":44,"tag":119,"props":692,"children":694},{"className":693},[],[695],{"type":49,"value":696},"_fields=content.raw",{"type":49,"value":698}," to keep responses small.",{"type":44,"tag":69,"props":700,"children":701},{},[702,704,710],{"type":49,"value":703},"Add related resource links via ",{"type":44,"tag":119,"props":705,"children":707},{"className":706},[],[708],{"type":49,"value":709},"WP_REST_Response::add_link()",{"type":49,"value":295},{"type":44,"tag":59,"props":712,"children":713},{},[714,715,721],{"type":49,"value":300},{"type":44,"tag":119,"props":716,"children":718},{"className":717},[],[719],{"type":49,"value":720},"references\u002Fresponses-and-fields.md",{"type":49,"value":295},{"type":44,"tag":144,"props":723,"children":725},{"id":724},"_5-authentication-and-authorization",[726],{"type":49,"value":727},"5) Authentication and authorization",{"type":44,"tag":65,"props":729,"children":730},{},[731,752,757],{"type":44,"tag":69,"props":732,"children":733},{},[734,736,742,744,750],{"type":49,"value":735},"For wp-admin\u002FJS: cookie auth + ",{"type":44,"tag":119,"props":737,"children":739},{"className":738},[],[740],{"type":49,"value":741},"X-WP-Nonce",{"type":49,"value":743}," (action ",{"type":44,"tag":119,"props":745,"children":747},{"className":746},[],[748],{"type":49,"value":749},"wp_rest",{"type":49,"value":751},").",{"type":44,"tag":69,"props":753,"children":754},{},[755],{"type":49,"value":756},"For external clients: application passwords (basic auth) or an auth plugin.",{"type":44,"tag":69,"props":758,"children":759},{},[760,762,767],{"type":49,"value":761},"Use capability checks in ",{"type":44,"tag":119,"props":763,"children":765},{"className":764},[],[766],{"type":49,"value":408},{"type":49,"value":768}," (authorization), not just “logged in”.",{"type":44,"tag":59,"props":770,"children":771},{},[772,773,779],{"type":49,"value":300},{"type":44,"tag":119,"props":774,"children":776},{"className":775},[],[777],{"type":49,"value":778},"references\u002Fauthentication.md",{"type":49,"value":295},{"type":44,"tag":144,"props":781,"children":783},{"id":782},"_6-client-facing-behavior-discovery-pagination-embeds",[784],{"type":49,"value":785},"6) Client-facing behavior (discovery, pagination, embeds)",{"type":44,"tag":65,"props":787,"children":788},{},[789,809,843],{"type":44,"tag":69,"props":790,"children":791},{},[792,794,800,802,808],{"type":49,"value":793},"Ensure discovery works (",{"type":44,"tag":119,"props":795,"children":797},{"className":796},[],[798],{"type":49,"value":799},"Link",{"type":49,"value":801}," header or ",{"type":44,"tag":119,"props":803,"children":805},{"className":804},[],[806],{"type":49,"value":807},"\u003Clink rel=\"https:\u002F\u002Fapi.w.org\u002F\">",{"type":49,"value":751},{"type":44,"tag":69,"props":810,"children":811},{},[812,814,820,821,827,828,834,835,841],{"type":49,"value":813},"Support ",{"type":44,"tag":119,"props":815,"children":817},{"className":816},[],[818],{"type":49,"value":819},"_fields",{"type":49,"value":216},{"type":44,"tag":119,"props":822,"children":824},{"className":823},[],[825],{"type":49,"value":826},"_embed",{"type":49,"value":216},{"type":44,"tag":119,"props":829,"children":831},{"className":830},[],[832],{"type":49,"value":833},"_method",{"type":49,"value":216},{"type":44,"tag":119,"props":836,"children":838},{"className":837},[],[839],{"type":49,"value":840},"_envelope",{"type":49,"value":842},", pagination headers.",{"type":44,"tag":69,"props":844,"children":845},{},[846,848,854],{"type":49,"value":847},"Remember ",{"type":44,"tag":119,"props":849,"children":851},{"className":850},[],[852],{"type":49,"value":853},"per_page",{"type":49,"value":855}," is capped at 100.",{"type":44,"tag":59,"props":857,"children":858},{},[859,860,866],{"type":49,"value":300},{"type":44,"tag":119,"props":861,"children":863},{"className":862},[],[864],{"type":49,"value":865},"references\u002Fdiscovery-and-params.md",{"type":49,"value":295},{"type":44,"tag":52,"props":868,"children":870},{"id":869},"verification",[871],{"type":49,"value":872},"Verification",{"type":44,"tag":65,"props":874,"children":875},{},[876,887,898,903,922],{"type":44,"tag":69,"props":877,"children":878},{},[879,885],{"type":44,"tag":119,"props":880,"children":882},{"className":881},[],[883],{"type":49,"value":884},"\u002Fwp-json\u002F",{"type":49,"value":886}," index includes your namespace.",{"type":44,"tag":69,"props":888,"children":889},{},[890,896],{"type":44,"tag":119,"props":891,"children":893},{"className":892},[],[894],{"type":49,"value":895},"OPTIONS",{"type":49,"value":897}," on your route returns schema (when provided).",{"type":44,"tag":69,"props":899,"children":900},{},[901],{"type":49,"value":902},"Endpoint returns expected data; permission failures return 401\u002F403 as appropriate.",{"type":44,"tag":69,"props":904,"children":905},{},[906,908,913,915,920],{"type":49,"value":907},"CPT\u002Ftaxonomy routes appear under ",{"type":44,"tag":119,"props":909,"children":911},{"className":910},[],[912],{"type":49,"value":258},{"type":49,"value":914}," when ",{"type":44,"tag":119,"props":916,"children":918},{"className":917},[],[919],{"type":49,"value":214},{"type":49,"value":921}," is true.",{"type":44,"tag":69,"props":923,"children":924},{},[925],{"type":49,"value":926},"Run repo lint\u002Ftests and any PHP\u002FJS build steps.",{"type":44,"tag":52,"props":928,"children":930},{"id":929},"failure-modes-debugging",[931],{"type":49,"value":932},"Failure modes \u002F debugging",{"type":44,"tag":65,"props":934,"children":935},{},[936,955,967,992,1004],{"type":44,"tag":69,"props":937,"children":938},{},[939,941,946,948,954],{"type":49,"value":940},"404: ",{"type":44,"tag":119,"props":942,"children":944},{"className":943},[],[945],{"type":49,"value":205},{"type":49,"value":947}," not firing, route typo, or permalinks off (use ",{"type":44,"tag":119,"props":949,"children":951},{"className":950},[],[952],{"type":49,"value":953},"?rest_route=",{"type":49,"value":751},{"type":44,"tag":69,"props":956,"children":957},{},[958,960,965],{"type":49,"value":959},"401\u002F403: missing nonce\u002Fauth, or ",{"type":44,"tag":119,"props":961,"children":963},{"className":962},[],[964],{"type":49,"value":408},{"type":49,"value":966}," too strict.",{"type":44,"tag":69,"props":968,"children":969},{},[970,976,978,983,985,990],{"type":44,"tag":119,"props":971,"children":973},{"className":972},[],[974],{"type":49,"value":975},"_doing_it_wrong",{"type":49,"value":977}," for missing ",{"type":44,"tag":119,"props":979,"children":981},{"className":980},[],[982],{"type":49,"value":408},{"type":49,"value":984},": add it (use ",{"type":44,"tag":119,"props":986,"children":988},{"className":987},[],[989],{"type":49,"value":416},{"type":49,"value":991}," if public).",{"type":44,"tag":69,"props":993,"children":994},{},[995,997,1002],{"type":49,"value":996},"Invalid params: missing\u002Fincorrect ",{"type":44,"tag":119,"props":998,"children":1000},{"className":999},[],[1001],{"type":49,"value":500},{"type":49,"value":1003}," schema or validation callbacks.",{"type":44,"tag":69,"props":1005,"children":1006},{},[1007,1009,1014,1016,1022],{"type":49,"value":1008},"Fields missing: ",{"type":44,"tag":119,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":49,"value":214},{"type":49,"value":1015}," false, meta not registered, or CPT lacks ",{"type":44,"tag":119,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":49,"value":1021},"custom-fields",{"type":49,"value":1023}," support.",{"type":44,"tag":52,"props":1025,"children":1027},{"id":1026},"escalation",[1028],{"type":49,"value":1029},"Escalation",{"type":44,"tag":59,"props":1031,"children":1032},{},[1033],{"type":49,"value":1034},"If version support or behavior is unclear, consult the REST API Handbook and core docs before inventing patterns.",{"items":1036,"total":1233},[1037,1048,1065,1077,1104,1125,1143,1159,1172,1187,1205,1218],{"slug":1038,"name":1038,"fn":1039,"description":1040,"org":1041,"tags":1042,"stars":26,"repoUrl":27,"updatedAt":1047},"blueprint","create WordPress Playground blueprint files","Use when the deliverable is WordPress Playground Blueprint JSON or a Blueprint bundle, including creating, editing, reviewing, validating schema keys, choosing steps\u002Fresources, and debugging Blueprint files. For only running or sharing a Playground environment, use wp-playground.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1043,1044],{"name":9,"slug":8,"type":15},{"name":1045,"slug":1046,"type":15},"WordPress Playground","wordpress-playground","2026-07-27T06:08:32.306955",{"slug":1049,"name":1049,"fn":1050,"description":1051,"org":1052,"tags":1053,"stars":26,"repoUrl":27,"updatedAt":1064},"wordpress-router","route WordPress codebase tasks","Use when the user asks about WordPress codebases (plugins, themes, block themes, Gutenberg blocks, WP core checkouts) and you need to quickly classify the repo and route to the correct workflow\u002Fskill (blocks, theme.json, REST API, WP-CLI, performance, security, testing, release packaging).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1054,1057,1060,1061],{"name":1055,"slug":1056,"type":15},"Engineering","engineering",{"name":1058,"slug":1059,"type":15},"Triage","triage",{"name":9,"slug":8,"type":15},{"name":1062,"slug":1063,"type":15},"Workflow Automation","workflow-automation","2026-04-06T18:58:21.644368",{"slug":1066,"name":1066,"fn":1067,"description":1068,"org":1069,"tags":1070,"stars":26,"repoUrl":27,"updatedAt":1076},"wp-abilities-api","manage WordPress Abilities API definitions","Use when working with the WordPress Abilities API (wp_register_ability, wp_register_ability_category, \u002Fwp-json\u002Fwp-abilities\u002Fv1\u002F*, @wordpress\u002Fabilities) including defining abilities, categories, meta, REST exposure, and permissions checks for clients.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1071,1074,1075],{"name":1072,"slug":1073,"type":15},"Access Control","access-control",{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:58:17.857773",{"slug":1078,"name":1078,"fn":1079,"description":1080,"org":1081,"tags":1082,"stars":26,"repoUrl":27,"updatedAt":1103},"wp-abilities-audit","audit WordPress plugins for Abilities API registration","Audit a WordPress plugin's REST surface and produce a standardized audit document proposing Abilities API registrations. Produces a markdown doc with a YAML schema and prose sections that humans and agents can both consume when planning a registration rollout. Works on any WP plugin.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1083,1086,1089,1092,1095,1098,1099,1100],{"name":1084,"slug":1085,"type":15},"Abilities API","abilities-api",{"name":1087,"slug":1088,"type":15},"Audit","audit",{"name":1090,"slug":1091,"type":15},"Code Analysis","code-analysis",{"name":1093,"slug":1094,"type":15},"Documentation","documentation",{"name":1096,"slug":1097,"type":15},"Plugin Development","plugin-development",{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":1101,"slug":1102,"type":15},"YAML","yaml","2026-05-28T06:48:49.361753",{"slug":1105,"name":1105,"fn":1106,"description":1107,"org":1108,"tags":1109,"stars":26,"repoUrl":27,"updatedAt":1124},"wp-abilities-verify","verify WordPress plugin Abilities API registrations","Verify a WordPress plugin's Abilities API registrations: enumerate abilities, check that callback behavior matches each annotation's claim (the adversarial readonly-but-writes detection), validate permissions and schemas, and validate audit documents produced by wp-abilities-audit.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1110,1111,1112,1113,1114,1117,1120,1123],{"name":1084,"slug":1085,"type":15},{"name":1090,"slug":1091,"type":15},{"name":1096,"slug":1097,"type":15},{"name":21,"slug":22,"type":15},{"name":1115,"slug":1116,"type":15},"Security","security",{"name":1118,"slug":1119,"type":15},"Testing","testing",{"name":1121,"slug":1122,"type":15},"Validation","validation",{"name":9,"slug":8,"type":15},"2026-05-28T06:48:50.590811",{"slug":1126,"name":1126,"fn":1127,"description":1128,"org":1129,"tags":1130,"stars":26,"repoUrl":27,"updatedAt":1142},"wp-block-development","develop WordPress Gutenberg blocks","Use when developing WordPress (Gutenberg) blocks: block.json metadata, register_block_type(_from_metadata), attributes\u002Fserialization, supports, dynamic rendering (render.php\u002Frender_callback), deprecations\u002Fmigrations, viewScript vs viewScriptModule, and @wordpress\u002Fscripts\u002F@wordpress\u002Fcreate-block build and test workflows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1131,1134,1135,1138,1141],{"name":1132,"slug":1133,"type":15},"Frontend","frontend",{"name":13,"slug":14,"type":15},{"name":1136,"slug":1137,"type":15},"React","react",{"name":1139,"slug":1140,"type":15},"UI Components","ui-components",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:24.172876",{"slug":1144,"name":1144,"fn":1145,"description":1146,"org":1147,"tags":1148,"stars":26,"repoUrl":27,"updatedAt":1158},"wp-block-themes","develop WordPress block themes","Use when developing WordPress block themes: theme.json (global settings\u002Fstyles), templates and template parts, patterns, style variations, and Site Editor troubleshooting (style hierarchy, overrides, caching).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1149,1152,1153,1156,1157],{"name":1150,"slug":1151,"type":15},"Design","design",{"name":1132,"slug":1133,"type":15},{"name":1154,"slug":1155,"type":15},"Themes","themes",{"name":1139,"slug":1140,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:58:27.909889",{"slug":1160,"name":1160,"fn":1161,"description":1162,"org":1163,"tags":1164,"stars":26,"repoUrl":27,"updatedAt":1171},"wp-interactivity-api","build interactive features with WordPress Interactivity API","Use when building or debugging WordPress Interactivity API features (data-wp-* directives, @wordpress\u002Finteractivity store\u002Fstate\u002Factions, block viewScriptModule integration, wp_interactivity_*()) including performance, hydration, and directive behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1165,1166,1167,1170],{"name":24,"slug":25,"type":15},{"name":1132,"slug":1133,"type":15},{"name":1168,"slug":1169,"type":15},"JavaScript","javascript",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:20.397676",{"slug":1173,"name":1173,"fn":1174,"description":1175,"org":1176,"tags":1177,"stars":26,"repoUrl":27,"updatedAt":1186},"wp-patterns","generate WordPress block patterns","Generate technically correct, design-distinctive WordPress block patterns. Use when creating block patterns, starter page patterns, template patterns, template part patterns, or improving pattern design quality. Covers pattern registration (PHP headers, auto\u002Fmanual), block markup syntax, theme.json design tokens, categories, template types, accessibility, and i18n\u002Fescaping.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1178,1181,1182,1185],{"name":1179,"slug":1180,"type":15},"Block Editor","block-editor",{"name":1150,"slug":1151,"type":15},{"name":1183,"slug":1184,"type":15},"Templates","templates",{"name":9,"slug":8,"type":15},"2026-07-24T05:38:43.101238",{"slug":1188,"name":1188,"fn":1189,"description":1190,"org":1191,"tags":1192,"stars":26,"repoUrl":27,"updatedAt":1204},"wp-performance","investigate and improve WordPress performance","Use when investigating or improving WordPress performance (backend-only agent): profiling and measurement (WP-CLI profile\u002Fdoctor, Server-Timing, Query Monitor via REST headers), database\u002Fquery optimization, autoloaded options, object caching, cron, HTTP API calls, and safe verification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1193,1194,1197,1200,1203],{"name":17,"slug":18,"type":15},{"name":1195,"slug":1196,"type":15},"Database","database",{"name":1198,"slug":1199,"type":15},"Performance","performance",{"name":1201,"slug":1202,"type":15},"SQL","sql",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:22.909053",{"slug":1206,"name":1206,"fn":1207,"description":1208,"org":1209,"tags":1210,"stars":26,"repoUrl":27,"updatedAt":1217},"wp-phpstan","run PHPStan static analysis on WordPress projects","Use when configuring, running, or fixing PHPStan static analysis in WordPress projects (plugins\u002Fthemes\u002Fsites): phpstan.neon setup, baselines, WordPress-specific typing, and handling third-party plugin classes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1211,1212,1213,1216],{"name":1090,"slug":1091,"type":15},{"name":13,"slug":14,"type":15},{"name":1214,"slug":1215,"type":15},"QA","qa",{"name":9,"slug":8,"type":15},"2026-04-06T18:58:15.318063",{"slug":1219,"name":1219,"fn":1220,"description":1221,"org":1222,"tags":1223,"stars":26,"repoUrl":27,"updatedAt":1232},"wp-playground","manage WordPress Playground instances","Use as the WordPress Playground routing wrapper for ambiguous Playground work, local CLI runs with @wp-playground\u002Fcli, playground.wordpress.net share links, browser previews, snapshots, mounts, version switching, and Xdebug. For Blueprint JSON authoring or review, use the blueprint skill directly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1224,1227,1230,1231],{"name":1225,"slug":1226,"type":15},"Local Development","local-development",{"name":1228,"slug":1229,"type":15},"Sandboxing","sandboxing",{"name":9,"slug":8,"type":15},{"name":1045,"slug":1046,"type":15},"2026-07-27T06:08:31.31025",18,{"items":1235,"total":1233},[1236,1241,1248,1254,1265,1276,1284],{"slug":1038,"name":1038,"fn":1039,"description":1040,"org":1237,"tags":1238,"stars":26,"repoUrl":27,"updatedAt":1047},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1239,1240],{"name":9,"slug":8,"type":15},{"name":1045,"slug":1046,"type":15},{"slug":1049,"name":1049,"fn":1050,"description":1051,"org":1242,"tags":1243,"stars":26,"repoUrl":27,"updatedAt":1064},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1244,1245,1246,1247],{"name":1055,"slug":1056,"type":15},{"name":1058,"slug":1059,"type":15},{"name":9,"slug":8,"type":15},{"name":1062,"slug":1063,"type":15},{"slug":1066,"name":1066,"fn":1067,"description":1068,"org":1249,"tags":1250,"stars":26,"repoUrl":27,"updatedAt":1076},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1251,1252,1253],{"name":1072,"slug":1073,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"slug":1078,"name":1078,"fn":1079,"description":1080,"org":1255,"tags":1256,"stars":26,"repoUrl":27,"updatedAt":1103},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1257,1258,1259,1260,1261,1262,1263,1264],{"name":1084,"slug":1085,"type":15},{"name":1087,"slug":1088,"type":15},{"name":1090,"slug":1091,"type":15},{"name":1093,"slug":1094,"type":15},{"name":1096,"slug":1097,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":1101,"slug":1102,"type":15},{"slug":1105,"name":1105,"fn":1106,"description":1107,"org":1266,"tags":1267,"stars":26,"repoUrl":27,"updatedAt":1124},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1268,1269,1270,1271,1272,1273,1274,1275],{"name":1084,"slug":1085,"type":15},{"name":1090,"slug":1091,"type":15},{"name":1096,"slug":1097,"type":15},{"name":21,"slug":22,"type":15},{"name":1115,"slug":1116,"type":15},{"name":1118,"slug":1119,"type":15},{"name":1121,"slug":1122,"type":15},{"name":9,"slug":8,"type":15},{"slug":1126,"name":1126,"fn":1127,"description":1128,"org":1277,"tags":1278,"stars":26,"repoUrl":27,"updatedAt":1142},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1279,1280,1281,1282,1283],{"name":1132,"slug":1133,"type":15},{"name":13,"slug":14,"type":15},{"name":1136,"slug":1137,"type":15},{"name":1139,"slug":1140,"type":15},{"name":9,"slug":8,"type":15},{"slug":1144,"name":1144,"fn":1145,"description":1146,"org":1285,"tags":1286,"stars":26,"repoUrl":27,"updatedAt":1158},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1287,1288,1289,1290,1291],{"name":1150,"slug":1151,"type":15},{"name":1132,"slug":1133,"type":15},{"name":1154,"slug":1155,"type":15},{"name":1139,"slug":1140,"type":15},{"name":9,"slug":8,"type":15}]