Antes de WordPress 7.0, los plugins que añadían funcionalidades de IA tenían que solicitar y gestionar una clave API para comunicarse con un proveedor de IA.

Esto conllevaba varios inconvenientes en cuanto al peso del código y la facilidad de mantenimiento. Era necesario incluir en tus plugins bibliotecas SDK pesadas y propietarias, además de escribir solicitudes cURL específicas para cada proveedor.

Este panorama fragmentado ha cambiado por completo con la integración nativa de la IA introducida en WordPress 7.0. Ahora, WordPress cuenta con una funcionalidad centralizada para configurar las credenciales de distintos proveedores de IA, además de una nueva API de PHP. Esta nueva arquitectura te permite enviar comandos, instrucciones, archivos multimedia y estructuras de datos sin problemas, mientras que el núcleo se encarga de gestionar las solicitudes.

La nueva arquitectura ofrece ventajas sustanciales tanto para los administradores de sitios web como para los desarrolladores de plugins.

Los administradores ya no tienen que configurar los ajustes de IA en varios plugins. Desde WordPress 7.0, solo tienes que instalar y activar los conectores de tus plugins, introducir tus claves API en la interfaz unificada de conectores, y estarán disponibles al instante para todos los plugins con IA de tu sitio. Puedes monitorizar de forma sencilla el uso de la IA, cambiar a tu modelo preferido o revocar el acceso de un proveedor para todos los plugins con un solo clic.

Para los desarrolladores de plugins, las ventajas son aún mayores, desde la seguridad de los datos hasta la portabilidad del código y una reducción drástica de la deuda técnica.

¿Estás listo para empezar este viaje por la nueva arquitectura de IA de WordPress? Vamos allá.

Las tres capas de la arquitectura de IA de WordPress

Actualmente, tus sitios de WordPress ya están preparados de forma nativa para la IA. Sin embargo, no se trata de funcionalidades de IA listas para usar, sino más bien de la base para crear sitios web impulsados por la IA.

La nueva arquitectura se estructura en tres capas distintas:

Conector de IA

Antes de WordPress 7.0, cada plugin que añadía funcionalidades de IA a tu sitio necesitaba su propio sistema para almacenar y gestionar tus claves API. Tus credenciales tenían que estar integradas directamente en el plugin o gestionarse a través de una página de configuración personalizada. En cualquier caso, estaba lejos de ser una solución ideal para gestionar datos confidenciales.

Pantalla de conectores
La interfaz centralizada de Conectores de IA en el panel de administración de WordPress.

Una interfaz unificada te permite configurar todos tus proveedores de servicios de IA en un único lugar central. Esta interfaz aporta varias ventajas importantes a la gestión del sitio.

Desde el punto de vista de la gestión y la seguridad, la mayor ventaja es que solo tienes que configurar tus proveedores una vez en la interfaz de Connectors y, a partir de ahí, ya no tendrás que volver a preocuparte por ellos, independientemente del número de plugins que los utilicen. Si alguna vez necesitas cambiar tus claves API, no tendrás que volver a configurar cada plugin; podrás actualizarlas todas a la vez en la pantalla de Conectores.

Centralizar las credenciales también mejora la seguridad de tu sitio, ya que reduce el riesgo de que se filtren datos confidenciales a través de plugins de terceros que podrían estar mal programados o no ser de fiar.

Otra ventaja clave es la portabilidad del código. Tus plugins ya no necesitan saber qué proveedor de IA utilizas, ya que la nueva arquitectura separa la autenticación de la lógica del plugin. Esto significa que, si cambias de proveedor de IA, tu plugin seguirá funcionando sin que tengas que cambiar ni una sola línea de código.

Sin embargo, el verdadero avance en cuanto a portabilidad es que los administradores del sitio pueden configurar varios conectores a la vez. Cuando un plugin activa una solicitud, WordPress selecciona automáticamente el proveedor de IA y el modelo más adecuados para generar la respuesta, basándose tanto en la configuración específica del plugin como en las capacidades de los modelos disponibles.

Cliente de IA

Mientras que la pantalla Conectores ofrece la interfaz de usuario para configurar los proveedores de IA, el cliente de IA te da la herramienta operativa para comunicarte con los modelos de IA.

Se trata de una interfaz de software nativa que estandariza la interacción con los modelos de inteligencia artificial a través de la función global wp_ai_client_prompt() y un conjunto unificado de métodos PHP.

Reducción de la deuda técnica

Para los desarrolladores, una de las principales ventajas de la nueva arquitectura de IA es la reducción de la deuda técnica y las dependencias. Antes de WordPress 7.0, añadir funcionalidades de IA suponía un coste muy elevado en cuanto al mantenimiento del código. Tenías que incluir SDKs propietarios de terceros (como las bibliotecas oficiales de OpenAI o Anthropic) y estar pendiente constantemente de las versiones de las bibliotecas. Esto hacía que el código de los plugins fuera muy pesado y daba lugar a errores de compatibilidad.

Además, tenías que escribir muchas líneas de código para gestionar la lógica de red y el análisis de las respuestas. Y, para empeorar aún más las cosas, el código era específico de cada proveedor, así que si decidías cambiar de proveedor de IA, tendrías que reescribir toda la arquitectura de red de tu plugin.

El cliente de IA (AI Client) resuelve este problema de raíz al delegar todo este trabajo pesado en el núcleo (core) de WordPress. Tu código deja de depender del proveedor de IA; solo tienes que escribir tus instrucciones una vez, y WordPress las traducirá al «dialecto» específico del modelo.

Selección inteligente de modelos

Una funcionalidad muy potente de la interfaz fluida del cliente de IA es la posibilidad de configurar los modelos preferidos mediante el método using_model_preference(), disponible a través de la función generadora wp_ai_client_prompt(). Este método te permite declarar una lista ordenada de modelos para la tarea específica de tu plugin. Por ejemplo, el siguiente código solicita la generación de texto utilizando tres modelos preferidos:

$text_result = wp_ai_client_prompt( 'Convert the following transcript into a concise, blog-ready draft.' )
	->using_model_preference(
		'gemini-2.5-flash',
		'claude-3-5-sonnet',
		'gpt-4o'
	)
	->generate_text();

WordPress comprobará los proveedores configurados en la pantalla Conectores y analizará la lista de modelos definidos en el código del plugin, seleccionando el primer conector que también esté disponible en la web. Si ninguno de los modelos especificados en tu código está disponible entre los Conectores activos, WordPress ignorará la lista de preferencias de modelos y recurrirá al primer modelo compatible configurado en la web.

Este mecanismo garantiza que tu plugin siempre funcione, incluso si el administrador de la web cambia a otro proveedor de IA.

Proveedor de IA

Un proveedor de IA es la empresa que posee, entrena y aloja los grandes modelos de lenguaje (LLM) que usamos a diario. OpenAI, Google Gemini y Anthropic son los proveedores de IA más comunes compatibles a través de conectores específicos en WordPress 7.0, pero los desarrolladores pueden registrar proveedores de IA personalizados adicionales.

Cuando el código de tu plugin llama al método generate_text() — o a cualquier otro método de generación — WordPress compila y envía un paquete de datos al proveedor de IA a través del endpoint establecido por el conector. Esta es la secuencia de operaciones que se lleva a cabo en segundo plano:

  • En primer lugar, el proveedor de IA recibe el texto de la solicitud junto con cualquier archivo multimedia adjunto (carga de datos).
  • Una vez recibida, procesa la solicitud aplicando las instrucciones del sistema.
  • A partir de ahí, genera el resultado, ya sea como texto libre o como un objeto JSON.
  • Por último, envía la salida de vuelta a WordPress a través de una respuesta HTTP.

Cada proveedor ofrece una amplia variedad de modelos con diferentes capacidades, velocidades y precios. Estos van desde modelos especializados exclusivamente en el procesamiento de texto hasta modelos multimodales que aceptan archivos multimedia (audio, imágenes, vídeo) junto con una solicitud de texto, pasando por modelos diseñados para tareas específicas, como la generación de imágenes o la conversión de voz a texto.

Modelos Gemini 3
La familia de modelos Gemini 3 de Google.

De nuevo, los modelos disponibles para un sitio de WordPress dependen de los proveedores de IA que configures en la pantalla Conectores. Esto significa que tu plugin no determina qué proveedor concreto se debe usar.

Un análisis en profundidad de la función wp_ai_client_prompt()

La función wp_ai_client_prompt() permite a los plugins comunicarse con modelos de IA de forma estandarizada: no tendrás que instalar bibliotecas externas, gestionar configuraciones específicas de cada proveedor ni codificar manualmente solicitudes HTTP.

Es una interfaz de software que te permite escribir tu código una sola vez, dejando que WordPress se encargue del trabajo pesado y traduzca tus instrucciones al «dialecto» específico de cada modelo.

La función devuelve una instancia de la clase WP_AI_Client_Prompt_Builder, que ofrece una interfaz fluida con métodos encadenables para personalizar tus indicaciones. La función se describe así:

/**
 * Fluent builder for constructing AI prompts, returning WP_Error on failure.
 *
 * This class provides a fluent interface for building prompts with various
 * content types and model configurations. It wraps the PHP AI Client SDK's
 * PromptBuilder and adds WordPress-specific behavior including WP_Error
 * handling instead of exceptions, snake_case method naming, and integration
 * with the Abilities API.
 *
 * Only the generating methods will return a WP_Error, to not break the fluent
 * interface. As soon as any exception is caught in a chain of method calls,
 * the returned instance will be in an error state, and all subsequent method
 * calls will be no-ops that just return the same error state instance. Only
 * when a generating method is called, the WP_Error will be returned.
 */

wp_ai_client_prompt() no realiza una solicitud HTTP inmediata; en su lugar, crea una instancia y devuelve un objeto WP_AI_Client_Prompt_Builder. Más de 50 métodos de configuración asignan valores a las propiedades privadas del objeto mediante una interfaz fluida, lo que hace que el código sea muy legible y fácil de escribir.

Aquí tienes una lista no exhaustiva de los métodos que usarás con más frecuencia:

  • with_text(): Añade texto al mensaje actual.
  • with_file(): Añade un archivo al mensaje actual.
  • with_history(): Añade mensajes del historial de la conversación.
  • using_model_preference(): Establece los modelos preferidos que se evaluarán por orden.
  • using_system_instruction(): Establece la instrucción del sistema.
  • using_max_tokens(): Establece el número máximo de tokens que se van a generar.
  • using_temperature(): Establece la temperatura para la generación.
  • using_top_p(): Establece el valor top-p para la generación.
  • using_top_k(): Establece el valor top-k para la generación.
  • as_output_file_type(): Establece el tipo de archivo de salida.
  • as_json_response(): Configura el mensaje de solicitud para la salida de respuestas JSON.
  • is_supported_for_text_generation(): Comprueba si la configuración activa admite la generación de texto.
  • is_supported_for_image_generation(): Comprueba si la configuración activa admite la generación de imágenes.
  • is_supported_for_text_to_speech_conversion(): Comprueba si la configuración activa admite la conversión de texto a voz.
  • is_supported_for_video_generation(): Comprueba si la configuración activa admite la generación de vídeos.
  • generate_text(): Genera un resultado de texto a partir de la indicación.
  • generate_image(): Genera una imagen a partir de la indicación.
  • convert_text_to_speech(): Convierte texto en voz.
  • generate_speech(): Genera voz a partir de la indicación.
  • generate_video(): Genera un vídeo a partir de la indicación.

Para ver la lista completa de métodos, echa un vistazo al código fuente del núcleo de WordPress.

Supongamos que quieres transcribir con precisión el contenido de un archivo de audio. Podrías usar la función de la siguiente manera:

$transcription_builder = wp_ai_client_prompt( $prompt )
	->with_file( $audio_base64, $mime_type )
	->using_temperature( 0.1 );

if ( ! $transcription_builder->is_supported_for_text_generation() ) {
	// No configured provider supports the current prompt configuration.
	return new WP_Error(
		'no_supported_model',
		'No configured AI model can process this request. Configure a provider in Settings > Connectors.',
		array( 'status' => 400 )
	);
}

$transcript = $transcription_builder->generate_text();

Esto es lo que hace este código:

  • $prompt: Representa la cadena principal que contiene tus instrucciones principales.
  • with_file(): Desbloquea las funciones multimodales de la interfaz. En el ejemplo anterior, pasamos el payload binario del audio precodificado como una cadena codificada en Base64 junto con su tipo MIME correspondiente.
  • using_temperature(): Controla el determinismo de la respuesta. Mientras que un valor bajo (0,1) obliga al modelo a mantenerse fiel al audio, un valor más alto permite una mayor libertad creativa. Puedes combinar este método con el método  using_top_p() (probabilidad máxima) para tener un control más preciso sobre el resultado.
  • is_supported_for_text_generation(): Comprueba si los conectores activos cumplen los requisitos de la solicitud actual antes de dedicar recursos a una llamada de red.
  • generate_text(): Este es el método de finalización de la interfaz fluida. Envía la solicitud HTTP unificada al proveedor activo y devuelve la cadena de texto generada o, en caso de fallo, un objeto  WP_Error .

En resumen, le pasamos al proveedor de IA una indicación de texto y un archivo de audio adjunto. Establecimos una temperatura baja para garantizar el resultado más determinista posible, verificamos que la configuración activa admitiera la generación de texto y, por último, ejecutamos la transcripción de voz a texto basándonos en la respuesta de la IA.

Con otro prompt, podemos devolver la transcripción sin procesar a la IA para que genere una respuesta estructurada como un objeto JSON:

$structured_json = wp_ai_client_prompt(
	"Convert the following transcript into a concise, blog-ready draft in American English.n" .
	"Return JSON with a post title and body sections.n" .
	"Each section must have: heading, level (2 or 3), and paragraphs (array).n" .
	"If useful, include bullet_points (array) for short actionable lists.n" .
	"Use short, clear headings and readable paragraph text.nn" .
	"Transcript:n" . $transcript
)
	->using_system_instruction( "You are a professional WordPress content editor. Always write in American English (use appropriate spelling, grammar, and conventions for that language variant)." )
	->using_temperature( 0.4 )
	->as_json_response( $schema )
	->generate_text();

Para este segundo prompt, usamos métodos adicionales para aprovechar otras capacidades de la API:

  • using_system_instruction(): Define el contexto operativo y el papel del modelo, separando claramente su persona («un editor profesional de contenido de WordPress») de los datos propiamente dichos.
  • using_temperature( 0.4 ): Establece una temperatura más alta que en la tarea de transcripción anterior, lo que permite al modelo utilizar un vocabulario más rico y producir un contenido más fluido.
  • as_json_response(): Obliga al modelo a devolver una cadena JSON estructurada que coincida con el diseño definido en tu variable $schema. Esto resulta útil a la hora de preparar contenido para Gutenberg.

Con una salida estructurada en formato JSON, puedes extraer campos individuales y asignarlos mediante código a bloques nativos de Gutenberg utilizando las funciones básicas de WordPress.

Si quieres conocer más a fondo el cliente de IA (AI Client), échale un vistazo también a la nota de desarrollo Presentación del AI Client en WordPress 7.0.

Convierte un archivo de audio en contenido listo para Gutenberg con IA

Ahora que ya entiendes mejor las tres capas de la arquitectura de IA de WordPress, veamos cómo encaja todo con un ejemplo real. En esta sección, aprenderás a crear la lógica esencial de un plugin basado en IA diseñado para generar un borrador de entrada bien elaborado directamente a partir de un archivo de audio.

Los casos de uso de esta funcionalidad son muy amplios y variados. Imagínate crear una entrada de blog completa a partir de una nota de voz rápida enviada a través de tu app de mensajería favorita, o transcribir una entrevista de audio grabada en tu smartphone.

Para implementar esta funcionalidad en tu sitio de WordPress, tendrás que crear un plugin personalizado. Aquí no vamos a hablar de los archivos de plantilla ni del proceso completo de registro del plugin; si quieres conocer los conceptos básicos del desarrollo de plugins, puedes consultar otros tutoriales en el blog de Kinsta o la documentación oficial de WordPress.org.

Nos centraremos en la lógica básica que permite que tu plugin se comunique con tu proveedor de IA. Pero no te preocupes, el plugin está disponible para que lo eches un vistazo y lo descargues en este repositorio de GitHub.

Qué hace este plugin

Para empezar, ve a la página del proyecto en GitHub y descárgate el archivo ZIP del plugin. A continuación, inicia sesión en tu panel de control de WordPress 7.0 y súbelo desde Plugins > Añadir plugin > Subir plugin. Una vez instalado y activado el plugin, ya estás listo para seguir este tutorial.

El plugin AI Content Builder genera un sidebar de configuración personalizada, a la que puedes acceder mediante un icono situado en la esquina superior derecha de la interfaz del editor de bloques. Esta barra lateral cuenta con una interfaz específica para subir archivos de audio y un botón que permite que la IA sobrescriba el título actual de la entrada.

El sidebar de AI Content Builder
El plugin AI Content Builder añade un sidebar de configuración personalizada al editor de bloques.

El botón Subir nota de audio abre el cargador de archivos multimedia de WordPress, lo que te permite subir un nuevo archivo de audio o seleccionar uno ya existente de tu biblioteca multimedia.

La biblioteca multimedia de WordPress
Selecciona o sube archivos de audio en la biblioteca multimedia de WordPress.

Una vez cargado el archivo de audio, el botón Generar Contenido activa una solicitud asíncrona a tu proveedor de IA activo.

La barra lateral del plugin
La barra lateral del plugin con el botón «Generar contenido» activo.

La imagen de abajo muestra el borrador final de la entrada generado por la IA en solo unos segundos.

Marcado generado por IA
Un borrador de entrada de blog bien maquetado, generado por IA a partir de un archivo de audio sin editar.

El contenido resultante está estructurado en bloques nativos de Gutenberg, incluyendo párrafos, encabezados y listas.

Un marcado bien estructurado en el editor de código de WordPress.
Un marcado bien estructurado en el editor de código de WordPress.

Ahora vamos a profundizar en la lógica del plugin.

Lo que necesitas para este plugin

Estos son los requisitos básicos para crear un plugin de WordPress que se integre en la nueva arquitectura de IA para generar el contenido de tus entradas:

  • WordPress 7.0
  • Una clave API de un proveedor de IA que ofrece un modelo capaz de convertir voz en texto. En nuestro ejemplo, vamos a usar Google AI.
  • Tu IDE favorito. Para este plugin, hemos usado VS Code.
  • Un buen conocimiento de WordPress y del desarrollo con Gutenberg, las API REST, PHP y JavaScript.

No tienes que preocuparte por Node.js, los procesos de construcción o la importación de bibliotecas externas, ya que este plugin se basa por completo en las APIs nativas del núcleo de WordPress. El resultado es un plugin ligero y seguro, sin ninguna deuda técnica.

Estructura del plugin y versión mínima de WordPress

El plugin AI Content Builder solo tiene dos archivos:

  • ai-content-builder.php
  • editor.js.

La versión mínima requerida de WordPress es la 7.0, así que asegúrate de indicarla en el encabezado del plugin:

<?php
/**
 * Plugin Name: AI Content Builder
 * Description: Gutenberg sidebar plugin that uploads audio and generates post content using the WordPress 7.0 AI Client.
 * Version: 1.0.0
 * Requires at least: 7.0
 * Requires PHP: 8.0
 * Author: Your Name
 * License: GPL-2.0-or-later
 * Text Domain: ai-content-builder
 */

Teniendo esto en cuenta, echemos un vistazo al proceso de creación de un plugin para WordPress basado en IA.

El flujo de datos del plugin

Antes de meternos de lleno en el código, echemos un vistazo a cómo fluyen los datos desde el backend de WordPress (el editor de bloques) hasta el servidor PHP y el proveedor de IA, y luego de vuelta.

1. Del navegador al servidor: llamada REST asíncrona: el navegador envía el ID de audio al endpoint REST personalizado del plugin. Para evitar que se cuelgue la interfaz de usuario, registramos un endpoint REST que permite realizar peticiones asíncronas al servidor PHP.

2. Primera pasada de la IA: transcripción de voz a texto: el servidor intercepta la solicitud, recupera el audio de la base de datos y envía una consulta al cliente de IA para extraer la transcripción de texto sin procesar.

3. Segunda pasada de la IA: Estructuración del contenido: el servidor devuelve la transcripción sin procesar al cliente de IA y le pide que la formatee como un objeto JSON estructurado.

4. Hidratación de datos (Data hydration) y generación de bloques: el script de JavaScript (JS) recibe el objeto JSON estructurado, lo normaliza y asigna los campos a los bloques nativos de Gutenberg.

Ahora veamos la lógica que hay detrás de cada fase.

1. Registrar un endpoint de API personalizado

El primer paso para crear el plugin AI Content Builder es registrar un endpoint de API. Esto es fundamental porque el modelo de IA puede tardar varios segundos (o incluso minutos) en procesar un archivo de audio y generar una respuesta. Registrar un endpoint REST te permite realizar solicitudes asíncronas a través de los controles de la barra lateral, lo que evita que la interfaz de usuario se cuelgue.

Al registrar un endpoint de API, también puedes realizar llamadas seguras a la IA sin tener que revelar tus credenciales de inicio de sesión, gracias al sistema de autenticación nativo de WordPress.

La lógica para registrar e inicializar el endpoint se gestiona en el archivo PHP del plugin mediante los dos métodos de clase, init() y register_rest_routes().

public static function init(): void {

	// Register the custom REST endpoint used by the sidebar JS.
	add_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );

	...
}

Al vincular la llamada a la función al hook rest_api_init, el plugin solo registra la raíz del endpoint cuando se activa una solicitud de la API REST. Esto mejora el rendimiento al evitar retrasos innecesarios en la carga de la página.

Puedes configurar las rutas usando el método register_rest_routes(), tal y como se muestra en el siguiente código:

public static function register_rest_routes(): void {
	register_rest_route(
		self::REST_NAMESPACE,
		self::REST_ROUTE,
		array(
			'methods'             => WP_REST_Server::CREATABLE, // Alias for POST.
			'callback'            => array( __CLASS__, 'handle_generate_request' ),
			'permission_callback' => static function (): bool {
				// Reject unauthenticated or insufficiently privileged requests early.
				return current_user_can( 'edit_posts' );
			},
			'args'                => array(
				'audio_id' => array(
					'type'     => 'integer',
					'required' => true,
				),
			),
		)
	);
}

Este método hace lo siguiente:

  • La función register_rest_route() admite tres parámetros: el espacio de nombres de la ruta, la propia ruta y un array de configuración.
  • WP_REST_Server::CREATABLE es un alias del método de transporte POST, que se utiliza para garantizar la máxima compatibilidad con la arquitectura interna de WordPress.
  • permission_callback es una función anónima que restringe el acceso a los usuarios autenticados que tienen permiso para crear y editar sus propias entradas. WordPress bloquea entonces la solicitud antes de procesarla y devuelve automáticamente un error 401 Unauthorized (401 No autorizado) o 403 Forbidden (403 Prohibido) en caso de acceso no autorizado.
  • args es un array opcional de parámetros adicionales que se pueden usar para modificar la respuesta de la API. Te permite especificar los datos que debe devolver la solicitud al endpoint.
  • audio_id es un array de parámetros que especifica el tipo de datos que se necesita. Si el tipo de datos devuelto no es un entero o no se ha especificado, la API REST detiene la ejecución y genera un error.

Por último, asegúrate de que la barra lateral del editor sepa dónde enviar los datos. Para ello, utiliza la función wp_localize_script() dentro del método enqueue_editor_assets().

public static function enqueue_editor_assets(): void {
	...

	wp_localize_script(
		'ai-content-builder-editor',
		'AICBData',
		array(
			'restPath' => '/' . self::REST_NAMESPACE . self::REST_ROUTE,
			'nonce'    => wp_create_nonce( 'wp_rest' ),
		)
	);
}
  • La función wp_localize_script() se usa principalmente para asignar un script registrado a una variable de JavaScript, pero aquí la usamos para pasar datos de PHP a JavaScript a través del objeto global AICBData.
  • restPath es la dirección del endpoint; al indicarla aquí, te ahorras tener que escribirla directamente en el archivo de JavaScript.
  • nonce Establece un token de seguridad para evitar el acceso no autorizado.

2. Acceder al cliente de IA para extraer texto de un archivo de audio

El núcleo de nuestro plugin es el método handle_generate_request(). Este método lleva a cabo una secuencia de tareas, que empieza con comprobaciones de seguridad y termina con la generación del contenido de la entrada que se va a insertar en el editor de bloques.

En primer lugar, comprueba que el cliente de IA esté disponible y que la compatibilidad con la IA no se haya desactivado en la web.

public static function handle_generate_request( WP_REST_Request $request ) {
	if ( ! function_exists( 'wp_ai_client_prompt' ) ) {
		return new WP_Error(
			'ai_client_unavailable',
			'WordPress AI Client is not available. This plugin requires WordPress 7.0 .',
			array( 'status' => 500 )
		);
	}

	if ( function_exists( 'wp_supports_ai' ) && ! wp_supports_ai() ) {
		return new WP_Error(
			'ai_disabled',
			'AI support is disabled on this site.',
			array( 'status' => 403 )
		);
	}
	...
}

Si se produce un error, las comprobaciones devuelven un error 500 o 403, respectivamente.

El siguiente bloque de código realiza estas acciones:

  • Extrae el ID del archivo de audio de la solicitud
  • Se asegura de que el ID del archivo de audio sea un número entero positivo
  • Comprueba el tipo de archivo
  • Recupera el tipo MIME
  • Extrae y codifica el contenido del archivo en Base64
$audio_id = absint( $request->get_param( 'audio_id' ) );
if ( ! $audio_id ) {
	return new WP_Error( 'invalid_audio_id', 'Invalid audio ID.', array( 'status' => 400 ) );
}

$attachment = get_post( $audio_id );
if ( ! $attachment || 'attachment' !== $attachment->post_type ) {
	return new WP_Error( 'audio_not_found', 'Audio attachment not found.', array( 'status' => 404 ) );
}

$mime_type = (string) get_post_mime_type( $audio_id );
if ( 0 !== strpos( $mime_type, 'audio/' ) ) {
	return new WP_Error( 'invalid_audio_type', 'Attachment must be an audio file.', array( 'status' => 400 ) );
}

$audio_path = get_attached_file( $audio_id );
if ( ! $audio_path || ! file_exists( $audio_path ) ) {
	return new WP_Error( 'audio_path_missing', 'Audio file path not found on server.', array( 'status' => 404 ) );
}

$audio_bytes = file_get_contents( $audio_path );
if ( false === $audio_bytes ) {
	return new WP_Error( 'audio_read_failed', 'Unable to read audio file.', array( 'status' => 500 ) );
}

$audio_base64 = base64_encode( $audio_bytes );
Error de tipo de archivo no válido
Se genera un mensaje de error cuando intentas procesar un tipo de archivo no válido

Así, el archivo binario se ha convertido en una cadena que se puede pasar al cliente de IA. Ahora podemos pasar a extraer el texto:

$output_language = self::get_output_language();

$transcription_builder = wp_ai_client_prompt(
	"Transcribe this voice note accurately into $output_language. Return plain text only."
)
	->with_file( $audio_base64, $mime_type )
	->using_temperature( 0.1 );

if ( ! $transcription_builder->is_supported_for_text_generation() ) {
	return new WP_Error(
		'no_supported_model',
		'No configured AI model can process this request. Configure a provider in Settings > Connectors.',
		array( 'status' => 400 )
	);
}

$transcript = $transcription_builder->generate_text();

Aquí tienes un resumen de lo que hace el código de arriba.

  • get_output_language() es un método estático definido en otra parte del script que devuelve la configuración regional del sitio. (Consulta GitHub.)
  • wp_ai_client_prompt()inicializa una nueva solicitud pasando el prompt principal.
  • with_file() Le indica al cliente de IA que estamos enviando una solicitud multimodal; este acepta el contenido del archivo en Base64 y el tipo MIME.
  • using_temperature() te permite especificar el nivel de determinismo de la respuesta. Establecemos un valor bajo para obtener una transcripción fiel del audio.
  • El método is_supported_for_text_generation() comprueba si el proveedor de IA puede generar texto a partir de los datos proporcionados; si el proveedor no admite entradas multimodales, el plugin se detiene y devuelve un mensaje de error.
  • El método generate_text() inicia la solicitud HTTP.

3. Convertir la transcripción del audio en contenido estructurado

Ahora que ya tenemos la transcripción, el plugin tiene que volver a comunicarse con el proveedor de IA para obtener una respuesta JSON estructurada. Para ello, tenemos que definir un array estructurado en formato JSON.

$schema = array(
	'type'       => 'object',
	'properties' => array(
		'title'    => array( 'type' => 'string' ),
		'sections' => array(
			'type'  => 'array',
			'items' => array(
				'type'       => 'object',
				'properties' => array(
					'heading'    => array( 'type' => 'string' ),
					'level'      => array(
						'type' => 'integer',
					),
					'paragraphs' => array(
						'type'  => 'array',
						'items' => array( 'type' => 'string' ),
					),
					'bullet_points' => array(
						'type'  => 'array',
						'items' => array( 'type' => 'string' ),
					),
				),
				'required'   => array( 'heading', 'level', 'paragraphs' ),
			),
		),
	),
	'required'   => array( 'title', 'sections' ),
);

Con esta estructura, la IA te responderá con un objeto JSON que contiene un título y un array de secciones. Cada sección debe incluir un encabezado, un nivel de encabezado, al menos un párrafo y una lista con viñetas.

Ahora que ya tenemos el esquema definido, podemos pasar a configurar la segunda solicitud al cliente de IA:

$structured_json = wp_ai_client_prompt(
	"Convert the following transcript into a concise, blog-ready draft in $output_language.n" .
	"Return JSON with a post title and body sections.n" .
	"Each section must have: heading, level (2 or 3), and paragraphs (array).n" .
	"If useful, include bullet_points (array) for short actionable lists.n" .
	"Use short, clear headings and readable paragraph text.nn" .
	"Transcript:n" . $transcript
)
	->using_system_instruction( "You are a professional WordPress content editor. Always write in $output_language (use appropriate spelling, grammar, and conventions for that language variant)." )
	->using_temperature( 0.4 )
	->as_json_response( $schema )
	->generate_text();

if ( is_wp_error( $structured_json ) ) {
	return $structured_json;
}

Analicemos los puntos clave de este código:

  • using_system_instruction() define la personalidad del modelo.
  • using_temperature( 0,4 ) establece un valor de temperatura más alto, lo que le da a la IA mayor libertad creativa para generar una respuesta y producir una prosa más fluida y rica.
  • as_json_response( $schema ) indica al cliente que proporcione la respuesta en un formato estructurado.
  • El plugin se detiene si hay algún error.

El siguiente paso es descodificar y depurar los datos.

$structured = json_decode( (string) $structured_json, true );

if ( ! is_array( $structured ) ) {
	return new WP_Error(
		'invalid_ai_json',
		'Could not parse structured AI response.',
		array( 'status' => 500 )
	);
}

$normalized = self::normalize_structured_post( $structured );

if ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {
	return new WP_Error(
		'empty_structured_content',
		'The AI provider returned empty structured content.',
		array( 'status' => 500 )
	);
}

En el código anterior:

  • La función json_decode() convierte la cadena JSON en un array asociativo de PHP.
  • Si el JSON tiene un formato incorrecto, la siguiente comprobación devuelve un código de estado 500 junto con un mensaje de error claro.
  • El método estático normalize_structured_post() limpia y normaliza la salida del proveedor antes de pasarla a JavaScript (mira la definición de esta función en GitHub).

Lo único que queda por hacer ahora es pasar el resultado a JavaScript para generar bloques nativos de Gutenberg.

4. Generar una salida compatible con Gutenberg

El siguiente paso es asignar la salida JSON a bloques nativos de Gutenberg. Esta fase se lleva a cabo en el lado del cliente y la gestiona el archivo editor.js.

Cuando el usuario selecciona un archivo de audio, se ejecuta el siguiente código:

function AIContentBuilderSidebar() {

	const [ audioId, setAudioId ] = useState( 0 );
	...

	const onSelectAudio = function ( media ) {
		if ( ! media || ! media.id ) {
			return;
		}
		setAudioId( media.id );
		setAudioLabel( media.title || media.filename || ( 'Audio #'   media.id ) );
		setNotice( null );
	};
	...
}

Este código recupera el ID del archivo de audio grabado de la base de datos de WordPress.

Cuando haces clic en el botón Generar contenido, la función onGenerate() usa apiFetch() para enviar una solicitud POST al endpoint de la API, incluyendo el ID del audio, entre otras cosas.

const onGenerate = async function () {

	...

	try {
		const response = await apiFetch( {
			path: AICBData.restPath,
			method: 'POST',
			headers: {
				'X-WP-Nonce': AICBData.nonce,
			},
			data: {
				audio_id: audioId,
			},
		} );
		...
	}
	...
}
  • await pausa la función temporalmente para evitar que el navegador se cuelgue mientras espera la respuesta de la IA.
  • Una vez recibido, el objeto JSON se guarda temporalmente en la variable response .

El contenido de la variable response será un objeto estructurado de la siguiente manera:

{
	title: "Two Wheels to the Medina: ...",
	sections: [
		{
			heading: "A Well-Deserved Rest in the Red City",
			level: 2,
			paragraphs: [ "On April 24th, our group of seven motorcyclists..." ],
			bullet_points: []
		},
		{
			heading: "Diving into the Medina and Jemaa el-Fnaa",
			level: 2,
			paragraphs: [ "We spent the day exploring the historic Medina..." ],
			bullet_points: [ 
				"Navigating the vibrant, maze-like alleys of the ancient Medina", 
				"Tasting traditional Berber tagines and Moroccan mint tea",
				"Shopping for handmade leather goods, spices, and lanterns in the souks" 
			]
		},
		{...}
	],
	content: "Fallback plain text...",
	transcript: "Full transcript..."
}

Este objeto proporciona los datos necesarios para crear los bloques. Sin embargo, el script puede recibir tanto una cadena JSON como un JSON anidado dentro de un objeto. Por lo tanto, se necesita un paso adicional de normalización antes de extraer los datos para la generación de bloques:

const normalizedSections = normalizeSectionsPayload( response.sections );
  • La función normalizeSectionsPayload() normaliza los payloads de sections con valores inciertos y las convierte en un array. (Echa un vistazo al código en GitHub.)

A continuación, la variable normalizedSections se pasa como argumento a la función que convierte los campos de sections en bloques nativos de Gutenberg:

const structuredBlocks = buildBlocksFromSections( normalizedSections );

A continuación tienes un fragmento de la función buildBlocksFromSections():

function buildBlocksFromSections( sections ) {
	if ( ! Array.isArray( sections ) ) {
		return [];
	}

	const blocks = [];

	sections.forEach( function ( section ) {
		if ( ! section || 'object' !== typeof section ) {
				return;
			}

			const heading =
				( 'string' === typeof section.heading )
					? section.heading.trim()
					: '';

			const level = ( 3 === section.level ) ? 3 : 2;

			if ( heading ) {
				blocks.push(
					createBlock( 'core/heading', {
						content: heading,
						level: level,
					} )
				);
			}

			...

		} );
	return blocks;
}

En el código anterior, el bucle forEach() recorre el array de datos, extrayendo section.heading y section.level para que los utilice la función nativa createBlock().

Para ver la correspondencia entre section.paragraphs y section.bullet_points, echa un vistazo al código fuente en GitHub.

Posibilidades de ampliación infinitas

La incorporación de la IA en WordPress abre nuevos horizontes tanto para los administradores de sitios web como para los desarrolladores. Antes tenías que crear toda una infraestructura de red desde cero solo para incorporar funcionalidades de IA a tu sitio de WordPress, pero ahora automatizar tu flujo de trabajo editorial y añadir funcionalidades basadas en IA se ha vuelto increíblemente sencillo.

El plugin de ejemplo que se muestra en la segunda parte de este artículo solo ilustra un caso de uso concreto. Sin embargo, deja claro cómo ahora puedes crear herramientas que simplifican muchísimo la gestión de tu sitio y la edición de contenidos. Además, esta arquitectura te abre las puertas a funciones avanzadas que antes resultaban demasiado complejas de implementar o demasiado caras.

Y, sin embargo, esto no es más que el principio. La inteligencia artificial es una realidad en constante evolución que, sin duda, va a desencadenar una oleada de innovación a gran escala.

Hablando de innovación… ¿Ya has probado el alojamiento de Kinsta? Si quieres potenciar tu sitio web con la mejor tecnología disponible hoy en día para WordPress, prueba Kinsta sin compromiso o ponte en contacto con nuestro equipo de ventas para saber más.

Carlo Daniele Kinsta

Carlo es un diseñador y desarrollador de front-end freelance. Cuando escribe artículos y tutoriales, Carlo se ocupa principalmente de los estándares web, pero cuando juega con sitios web, su mejor compañero de trabajo es WordPress.