La REST API de WordPress
Conecta tu plugin con aplicaciones externas. Descubre cómo registrar endpoints personalizados, gestionar la autenticación y estructurar respuestas mediante la potente WP REST API.
La REST API transformó a WordPress de un gestor tradicional a un potente headless CMS. En este capítulo, aprenderás a conectar tu plugin con aplicaciones externas mediante una arquitectura estandarizada basada en JSON. Exploraremos los conceptos clave y la práctica avanzada: descubrirás cómo registrar rutas y endpoints personalizados, estructurar callbacks eficientes, delegar la validación de argumentos de forma nativa y establecer estrictos controles de acceso y permisos. Al finalizar, serás capaz de construir interfaces de comunicación seguras, escalables y robustas que expandan los límites de tu desarrollo.
13.1 Conceptos clave de la REST API
La REST API de WordPress transformó el CMS de una plataforma tradicional de renderizado de páginas a un robusto framework de aplicaciones. A diferencia de admin-ajax.php (que exploramos en el Capítulo 9) que fue diseñado principalmente para comunicaciones internas del panel de administración o scripts específicos del front-end, la REST API proporciona una interfaz estandarizada, basada en JSON y orientada a recursos. Esto permite que cualquier aplicación externa —ya sea una SPA (Single Page Application) en React, una aplicación móvil nativa o un script de sincronización en Node.js— interactúe bidireccionalmente con la base de datos de WordPress.
Para dominar el desarrollo de integraciones con la REST API, es imprescindible comprender la terminología y la arquitectura conceptual sobre la que se asienta su infraestructura.
Arquitectura Conceptual de la REST API
La comunicación a través de la REST API es stateless (sin estado), lo que significa que cada petición debe contener toda la información necesaria para que el servidor la procese, incluyendo las credenciales de autenticación.
A continuación, se ilustra el flujo de una petición típica:
TEXT
Vocabulario y Componentes Fundamentales
La API de WordPress no reinventa la rueda; implementa los estándares arquitectónicos REST. Sin embargo, utiliza una nomenclatura específica dentro de sus clases PHP que debes conocer.
1. Rutas (Routes)
Una ruta es el "nombre" de la URI a la que te conectas. Las rutas están estructuradas de forma jerárquica y representan el recurso que se está consultando o modificando.
Por ejemplo, en la URL https://tu-sitio.com/wp-json/wp/v2/posts/123, la ruta es /wp/v2/posts/123. Las rutas no indican qué acción se va a realizar, solo dónde se encuentra el recurso.
2. Endpoints
Un endpoint es la conexión entre una Ruta específica y un método HTTP (GET, POST, PUT, DELETE). Una sola ruta puede tener múltiples endpoints.
Por ejemplo, la ruta /wp/v2/posts tiene al menos dos endpoints predeterminados:
- Un endpoint
GETpara listar artículos. - Un endpoint
POSTpara crear un nuevo artículo.
En tu código PHP, registrarás rutas, y dentro de esa configuración, definirás los endpoints que soporta.
3. Namespaces (Espacios de nombres)
El namespace es el primer segmento de la ruta (justo después del prefijo base wp-json/). Su propósito crítico es evitar colisiones entre las rutas del núcleo de WordPress (wp/v2), las de otros plugins y las tuyas.
Un namespace debe seguir siempre el patrón vendor/version. Si estás desarrollando un plugin llamado "Sistema de Inventario", tu namespace no debería ser simplemente inventario, sino sistema-inventario/v1.
TEXT
El versionado (v1) te permite en el futuro lanzar una v2 de tu API con cambios estructurales drásticos sin romper las aplicaciones de los clientes que siguen consumiendo la v1.
4. Peticiones (Requests)
Cuando una llamada llega a un endpoint, WordPress empaqueta todos los datos de esa llamada (cabeceras, parámetros de la URL, cuerpo JSON) en una instancia de la clase WP_REST_Request. Tu función callback recibirá este objeto, lo que centraliza y unifica la forma en que extraes variables, reemplazando el uso tradicional de súper globales en PHP como $_GET o $_POST.
5. Respuestas (Responses)
De manera homóloga a las peticiones, todo lo que tu endpoint devuelva debe estructurarse utilizando la clase WP_REST_Response. Aunque WordPress convertirá automáticamente los arrays o cadenas simples en JSON, utilizar la clase WP_REST_Response te otorga control total para modificar los códigos de estado HTTP (por ejemplo, devolver un 201 Created en lugar de un 200 OK) y añadir cabeceras personalizadas.
6. Controladores (Controllers)
A medida que tu plugin crezca, registrar callbacks mediante funciones anónimas o procedimentales se volverá insostenible. El estándar de WordPress es utilizar el patrón de diseño Controlador. Un controlador de la REST API es una clase PHP que extiende WP_REST_Controller y agrupa todo el registro de rutas, validación y lógica de negocio para un recurso específico (por ejemplo, class Inventario_REST_Productos_Controller).
7. Esquemas (Schemas)
El Schema es la definición formal de la estructura de datos que tu endpoint acepta y devuelve. Basado en el estándar JSON Schema, le dice a WordPress —y a cualquier cliente que consuma la API— qué campos existen, qué tipo de datos son (string, integer, boolean) y cuáles son sus valores predeterminados. WordPress utiliza el Schema automáticamente para sanitizar y validar las peticiones antes de que lleguen a tu código principal, reduciendo significativamente el trabajo manual de validación de variables.
Descubrimiento (Discovery)
El descubrimiento es el mecanismo por el cual un cliente externo puede interactuar con un sitio WordPress y averiguar si la REST API está habilitada, cuál es su prefijo (usualmente wp-json, pero es modificable) y qué rutas están disponibles.
Si realizas una petición GET a la raíz de la API (/wp-json/), WordPress devolverá un índice masivo en JSON detallando todos los namespaces, rutas y endpoints registrados en ese sitio en particular, junto con los métodos admitidos y los argumentos que cada uno acepta. Esta capacidad de autodescubrimiento es vital para herramientas automáticas y clientes robustos que configuran sus acciones basándose en las capacidades expuestas por el servidor.
13.2 Registro de rutas y endpoints
Para exponer la lógica o los datos de tu plugin a través de la REST API, es fundamental registrar explícitamente las rutas y los endpoints que tu aplicación va a soportar. WordPress proporciona un mecanismo centralizado para esto que asegura que tus rutas se integren correctamente en el enrutador principal y aparezcan en el índice de descubrimiento de la API.
Todo registro de rutas debe ejecutarse obligatoriamente enganchado a la acción rest_api_init. Intentar registrar rutas fuera de este hook resultará en un fallo silencioso o en advertencias de PHP.
La función register_rest_route()
El pilar de esta arquitectura es la función register_rest_route. Su firma básica es la siguiente:
PHP
$namespace: El prefijo y versión de tu plugin (ej.mi-plugin/v1).$route: El recurso específico que estás exponiendo (ej./tareas).$args: Un array asociativo que define el método HTTP, la función callback principal, la función de validación de permisos y los argumentos esperados.$override: Un booleano opcional. Si estrue, sobrescribirá una ruta existente que tenga exactamente el mismo namespace y ruta.
Estructuración de Endpoints en una Ruta
Es una práctica recomendada y altamente eficiente agrupar múltiples endpoints que operan sobre el mismo recurso (misma ruta) dentro de una única llamada a register_rest_route.
A continuación, se muestra cómo registrar una ruta /tareas que soporta tanto una petición de lectura (GET) como una de creación (POST):
PHP
Uso de Constantes del Servidor:
Observa el uso de WP_REST_Server::READABLE y WP_REST_Server::CREATABLE. Aunque podrías usar cadenas literales como 'GET' o 'POST', WordPress proporciona constantes dentro de la clase WP_REST_Server que cubren internamente compatibilidad con múltiples métodos (por ejemplo, READABLE mapea a GET, HEAD). Su uso es el estándar en el desarrollo profesional.
WP_REST_Server::READABLE(GET)WP_REST_Server::CREATABLE(POST)WP_REST_Server::EDITABLE(POST, PUT, PATCH)WP_REST_Server::DELETABLE(DELETE)WP_REST_Server::ALLMETHODS(GET, POST, PUT, PATCH, DELETE)
Rutas Dinámicas con Expresiones Regulares
A menudo necesitarás interactuar con un recurso específico, lo que requiere pasar un identificador dinámico en la propia URL, como /mi-plugin/v1/tareas/123.
WordPress utiliza expresiones regulares compatibles con PCRE (Perl Compatible Regular Expressions) para capturar estas variables directamente desde la ruta. El formato de captura nombrada (?P<nombre_variable>patron) es obligatorio para que el enrutador asigne el valor extraído y te lo pase como un parámetro utilizable.
PHP
En este escenario, si un cliente realiza una petición GET a /mi-plugin/v1/tareas/45, la función mi_plugin_obtener_tarea_por_id recibirá un objeto WP_REST_Request que contendrá el valor 45 accesible de forma limpia mediante $request['id'].
Otros patrones de captura comunes incluyen:
- Alfanumérico (ej. un slug):
(?P<slug>[a-zA-Z0-9-]+) - Cualquier cadena:
(?P<nombre>\w+)
El array args (introducido brevemente en el ejemplo anterior) permite definir reglas de validación y limpieza específicas por parámetro. Este es un mecanismo de defensa de primera línea crucial que exploraremos a fondo en la próxima sección.
13.3 Callbacks y validación de args
En la arquitectura de la REST API de WordPress, la ejecución de un endpoint no es un proceso de un solo paso. Para garantizar la seguridad, integridad y previsibilidad de los datos, el enrutador procesa cada petición a través de un "embudo" de callbacks antes de permitir que interactúe con la base de datos o la lógica principal de tu plugin.
Comprender y utilizar correctamente este embudo es lo que diferencia a una API frágil de una robusta y segura.
El embudo de ejecución de una petición
Cuando una petición HTTP coincide con un endpoint registrado, WordPress ejecuta las funciones asociadas (callbacks) en un orden estricto:
TEXT
Definición de Argumentos (args)
Para que las fases de validación y sanitización funcionen, debes declarar qué parámetros espera tu endpoint. Esto se hace en el array args al registrar la ruta.
Cada parámetro puede tener sus propias reglas:
PHP
Validación vs. Sanitización
Es vital entender la diferencia arquitectónica entre estos dos procesos:
- Validación (
validate_callback): Su trabajo es responder con untrueofalse. Revisa el dato y dice: "¿Es esto lo que pedí?". Si devuelvefalse, WordPress aborta inmediatamente la petición y devuelve un error HTTP 400. No modifica el dato. - Sanitización (
sanitize_callback): Su trabajo es devolver un dato modificado y seguro. Toma el valor validado y dice: "Voy a limpiar esto antes de usarlo".
El poder de rest_validate_request_arg:
En lugar de escribir funciones de validación personalizadas para cada parámetro, WordPress proporciona la función nativa rest_validate_request_arg. Si la usas como validate_callback, WordPress leerá las propiedades type, format, enum, minimum, etc., definidas en tu array de argumentos y validará el dato automáticamente basándose en el estándar JSON Schema.
El Callback Principal
Si la petición sobrevive a la validación, la sanitización y los permisos, llega finalmente a tu callback principal. Esta función siempre recibe un único argumento: una instancia de la clase WP_REST_Request.
El objeto WP_REST_Request unifica todos los parámetros, independientemente de si vinieron en la URL (Query String), en el cuerpo de la petición (JSON, FormData) o en la propia ruta (capturas regex).
Extracción de parámetros
Nunca debes usar $_GET o $_POST dentro de un callback de la REST API. Utiliza los métodos del objeto request:
$request->get_param( 'nombre' ): Devuelve el valor de un parámetro específico ya sanitizado.$request->get_params(): Devuelve un array asociativo con todos los parámetros.$request->get_file( 'archivo' ): Accede a los archivos subidos.$request->get_header( 'x-mi-cabecera' ): Recupera una cabecera HTTP específica.
Construcción de la respuesta
Tu callback principal debe devolver siempre una de dos cosas:
- Una instancia de
WP_REST_Response(para éxitos). - Una instancia de
WP_Error(para fallos controlados).
PHP
Integración en el registro de la ruta
Para ver el panorama completo, así es como se ensamblan el registro, los argumentos y los callbacks en un bloque de código profesional:
PHP
Al externalizar la validación y la sanitización en el array de args, el callback principal (mi_plugin_crear_cliente_callback) queda completamente limpio de sentencias if( isset(...) ) o comprobaciones de tipos. Su única responsabilidad se convierte en ejecutar la lógica de negocio, cumpliendo con el principio de responsabilidad única.
13.4 Control de permisos en la API
En las secciones anteriores, pospusimos temporalmente la seguridad asignando la función nativa __return_true al argumento permission_callback. En un entorno de producción, dejar puntos de enlace (endpoints) que modifican datos o exponen información sensible abiertos al público es una vulnerabilidad crítica.
La REST API de WordPress implementa un sistema robusto para separar la lógica de negocio de la lógica de autorización, asegurando que solo los clientes con las credenciales y capacidades correctas puedan ejecutar una acción.
Autenticación vs. Autorización
Antes de escribir código, es vital distinguir dos conceptos que a menudo se confunden en el contexto de las APIs:
- Autenticación (¿Quién eres?): Es el mecanismo mediante el cual WordPress identifica al usuario que hace la petición. Para peticiones internas (como un bloque de Gutenberg), WordPress usa las cookies de sesión junto con un Nonce de la API (
wp_rest). Para clientes externos, se utilizan Contraseñas de Aplicación (Application Passwords) introducidas en WordPress 5.6, u OAuth mediante plugins adicionales. - Autorización (¿Qué puedes hacer?): Una vez que WordPress sabe quién es el usuario, debe determinar si tiene permiso para realizar la acción solicitada. Esto se gestiona mediante el sistema de Roles y Capacidades (que vimos en el Capítulo 12).
El permission_callback se encarga exclusivamente de la Autorización. WordPress ya ha manejado la Autenticación de fondo antes de que tu función se ejecute, inicializando al usuario actual.
Implementación del permission_callback
El parámetro permission_callback acepta cualquier función invocable (callable) de PHP. Al igual que el callback principal y el de validación, recibe el objeto WP_REST_Request como argumento.
Existen tres escenarios principales de retorno para esta función:
- Retornar
true: La petición está autorizada y pasa a la siguiente fase (callback principal). - Retornar
false: La petición es rechazada. WordPress aborta la ejecución y devuelve un error genérico401 Unauthorized(si el usuario no está logueado) o403 Forbidden(si está logueado pero no tiene permisos). - Retornar un
WP_Error: La petición es rechazada, pero te permite enviar un mensaje de error personalizado y un código de estado específico al cliente, mejorando la experiencia de desarrollo (Developer Experience o DX).
Ejemplo Práctico: Restricción por Capacidades
El enfoque más seguro y estándar en WordPress es utilizar current_user_can() dentro de tu callback de permisos.
PHP
Nota técnica: La función nativa rest_authorization_required_code() es muy útil aquí; devuelve 401 si el usuario es un visitante anónimo, y 403 si es un usuario autenticado pero sin los privilegios necesarios.
Verificaciones basadas en el Recurso
A veces, el permiso no depende de un privilegio global, sino del recurso específico que se está intentando manipular. Por ejemplo, un usuario con el rol de "Autor" tiene la capacidad edit_posts, pero solo debería poder editar o borrar mediante la API sus propios artículos, no los de otros.
En estos casos, debes extraer parámetros de la petición dentro del permission_callback para validar la propiedad:
PHP
Endpoints Públicos y la advertencia _doing_it_wrong
Si tu intención es crear un endpoint 100% público (por ejemplo, un endpoint de lectura para mostrar una lista de tiendas en un mapa en el front-end), nunca debes omitir el argumento permission_callback.
Desde la versión 5.5 de WordPress, si omites este parámetro, el sistema funcionará, pero generará un aviso de depuración _doing_it_wrong en los logs del servidor. Esto se implementó para obligar a los desarrolladores a ser explícitos sobre la apertura de un endpoint, evitando que rutas sensibles queden expuestas por olvido.
Para rutas verdaderamente públicas, utiliza siempre la función nativa que devuelve directamente un valor booleano positivo:
PHP
Resumen del capítulo
En este capítulo hemos profundizado en la arquitectura y el flujo de la WP REST API, una herramienta fundamental para desacoplar el back-end de WordPress de aplicaciones cliente modernas.
- Conceptos Clave: Aprendimos la nomenclatura estandarizada: Rutas, Endpoints, Namespaces (
vendor/v1) y el mecanismo de descubrimiento de la API. Comprendimos que toda comunicación empaqueta sus datos en las clasesWP_REST_RequestyWP_REST_Response. - Registro de Rutas: Descubrimos que
register_rest_routecentraliza la creación de recursos atados al hookrest_api_init, utilizando constantes legibles (WP_REST_Server::READABLE) y expresiones regulares para capturar variables dinámicas de la URL. - Validación y Callbacks: Desglosamos el "embudo de ejecución". Externalizar la lógica de chequeo utilizando JSON Schema en el array
args(validate_callbackysanitize_callback) mantiene tu función principal limpia y enfocada únicamente en la lógica de negocio. - Seguridad y Permisos: Finalmente, analizamos el
permission_callbackcomo la barrera de autorización. Utilizandocurrent_user_can()o verificando la propiedad del recurso frente a$request, garantizamos que nuestros endpoints expuestos sean un puente seguro hacia la base de datos y no un vector de ataque.
© 2026 Esdocu. Contenido bajo licencia MIT.
Editar esta página