Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Abilities API: cómo tu plugin le dice a WordPress (y a las IAs) qué sabe hacer

Hasta ahora, cada plugin exponía lo que sabe hacer a su manera: una pantalla, un shortcode, un endpoint REST con su propio formato. Para una persona funciona, pero para un agente de IA que quiere ayudarte a administrar el sitio es un caos: no hay una lista común de «qué se puede hacer aquí».

La Abilities API (API de habilidades) resuelve eso. Cada plugin registra sus habilidades en un registro central de WordPress, describiendo:

  • Qué hace, con un nombre y una descripción legibles.
  • Qué datos recibe y qué devuelve, con un esquema JSON.
  • Quién puede usarla, con una comprobación de permisos.
  • El código que la ejecuta.

Con esa información, cualquier otra pieza (el propio WordPress, otro plugin, un agente de IA) puede descubrir y usar tus habilidades de forma segura y predecible.

La Abilities API se incorporó al núcleo de WordPress en la versión 6.9, después de desarrollarse como un proyecto del equipo de IA de WordPress. Es una API nueva y puede seguir evolucionando: confirma los nombres y parámetros en la documentación oficial de tu versión antes de usarla en producción.

Registrar una habilidad

Un ejemplo con WooCommerce: una habilidad que devuelve cuántos pedidos y cuánto se vendió en los últimos días. En un plugin propio o un mu-plugin:

<?php
/**
 * Plugin Name: Habilidades de la tienda (Curso WordPress)
 */

defined( 'ABSPATH' ) || exit;

// 1. Una categoría para agrupar las habilidades del plugin.
add_action( 'wp_abilities_api_categories_init', function () {
	wp_register_ability_category( 'cwp-tienda', array(
		'label'       => 'Tienda',
		'description' => 'Información de ventas de la tienda.',
	) );
} );

// 2. La habilidad.
add_action( 'wp_abilities_api_init', function () {
	if ( ! function_exists( 'wc_get_orders' ) ) {
		return;
	}
	wp_register_ability( 'cwp/resumen-pedidos', array(
		'label'               => 'Resumen de pedidos',
		'description'         => 'Cantidad de pedidos pagados y total vendido en los últimos días.',
		'category'            => 'cwp-tienda',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'dias' => array( 'type' => 'integer', 'minimum' => 1, 'maximum' => 90, 'default' => 7 ),
			),
		),
		'output_schema'       => array(
			'type'       => 'object',
			'properties' => array(
				'pedidos' => array( 'type' => 'integer' ),
				'total'   => array( 'type' => 'number' ),
				'moneda'  => array( 'type' => 'string' ),
			),
		),
		'permission_callback' => function () {
			return current_user_can( 'manage_woocommerce' );
		},
		'execute_callback'    => function ( $entrada ) {
			$dias    = isset( $entrada['dias'] ) ? absint( $entrada['dias'] ) : 7;
			$pedidos = wc_get_orders( array(
				'status'       => array( 'wc-processing', 'wc-completed' ),
				'date_created' => '>' . ( time() - $dias * DAY_IN_SECONDS ),
				'limit'        => -1,
				'return'       => 'objects',
			) );
			$total = 0;
			foreach ( $pedidos as $pedido ) {
				$total += (float) $pedido->get_total();
			}
			return array(
				'pedidos' => count( $pedidos ),
				'total'   => $total,
				'moneda'  => get_woocommerce_currency(),
			);
		},
		'meta'                => array(
			'show_in_rest' => true,
			'annotations'  => array( 'readonly' => true ),
		),
	) );
} );

Fíjate en lo importante:

  • El nombre lleva un espacio de nombres (cwp/) para no chocar con otros plugins.
  • El esquema de entrada limita los días entre 1 y 90: la API valida los datos antes de llamar a tu código.
  • El permiso se comprueba siempre, venga la petición de donde venga.
  • La anotación readonly indica que la habilidad solo consulta, no modifica nada. Es una pista importante para los agentes de IA.

En tiendas con muchos pedidos, 'limit' => -1 puede ser pesado. Para un caso real, calcula el total con una consulta más eficiente o guarda el resultado en un transitorio por unos minutos.

Usarla desde PHP

Cualquier otro código puede descubrir y ejecutar la habilidad:

<?php
$habilidad = wp_get_ability( 'cwp/resumen-pedidos' );
if ( $habilidad ) {
	$resultado = $habilidad->execute( array( 'dias' => 30 ) );
	if ( is_wp_error( $resultado ) ) {
		error_log( $resultado->get_error_message() );
	}
}

execute() valida la entrada, comprueba el permiso con el usuario actual, ejecuta el código y valida la salida. Si algo falla, devuelve un WP_Error.

Usarla por la API REST

Con show_in_rest activado, las habilidades aparecen en la API REST de WordPress, bajo su propio espacio de nombres. Para ver cuáles hay y cómo se llaman sus rutas en tu versión, consulta el índice de la API desde una sesión con permisos (o con una contraseña de aplicación):

curl -u usuario:contraseña-de-aplicacion https://tudominio.cl/wp-json/ | grep -o '"/wp-abilities[^"]*"' | sort -u

La conexión con la IA: MCP

MCP (Model Context Protocol) es el estándar que usan los asistentes de IA para conectarse con herramientas externas. El equipo de IA de WordPress mantiene un adaptador MCP que toma las habilidades registradas y las ofrece como herramientas a un asistente compatible.

El resultado: le preguntas a tu asistente «¿cuánto vendimos esta semana?» y este, en vez de adivinar, llama a cwp/resumen-pedidos con los permisos del usuario con el que se conectó.

Conectar un agente de IA a tu sitio es darle las llaves de lo que ese usuario puede hacer. Crea un usuario específico para el agente, con el rol mínimo necesario, usa una contraseña de aplicación que puedas revocar, y empieza solo con habilidades de lectura (readonly).

Buenas prácticas al diseñar habilidades

  1. Una habilidad, una acción. «Resumen de pedidos» y «Cambiar estado de pedido» son dos habilidades, no una con un parámetro «modo».
  2. Descripciones claras. El agente de IA decide qué habilidad usar leyendo la descripción: escríbela como si se la explicaras a una persona nueva en el equipo.
  3. Esquemas estrictos. Mientras más acotada sea la entrada, menos sorpresas.
  4. Permisos reales. Nunca __return_true en una habilidad que toque datos.
  5. Marca bien lo destructivo. Si una habilidad borra o modifica, indícalo en sus anotaciones para que el agente pida confirmación.

¿Qué habilidad registrarías primero en tu plugin? Cuéntanos en el foro y la armamos en comunidad.