{"id":83937,"date":"2026-07-22T14:45:27","date_gmt":"2026-07-22T12:45:27","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=83937&#038;preview=true&#038;preview_id=83937"},"modified":"2026-07-28T15:51:30","modified_gmt":"2026-07-28T13:51:30","slug":"ia-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/","title":{"rendered":"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real"},"content":{"rendered":"<p>Antes de <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, <a href=\"https:\/\/kinsta.com\/es\/blog\/plugins-ia-wordpress\/\">los plugins que a\u00f1ad\u00edan funcionalidades de IA<\/a> ten\u00edan que solicitar y gestionar una clave API para comunicarse con un proveedor de IA.<\/p>\n<p>Esto conllevaba varios inconvenientes en cuanto al peso del c\u00f3digo y la facilidad de mantenimiento. Era necesario incluir en tus plugins bibliotecas SDK pesadas y propietarias, adem\u00e1s de escribir solicitudes cURL espec\u00edficas para cada proveedor.<\/p>\n<p>Este panorama fragmentado ha cambiado por completo con la <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-7-0\/#integration-with-ai\">integraci\u00f3n nativa de la IA introducida en WordPress 7.0<\/a>. Ahora, WordPress cuenta con una funcionalidad centralizada para configurar las credenciales de distintos proveedores de IA, adem\u00e1s 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\u00facleo se encarga de gestionar las solicitudes.<\/p>\n<p>La nueva arquitectura ofrece ventajas sustanciales tanto para los administradores de sitios web como para los desarrolladores de plugins.<\/p>\n<p>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\u00e1n 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.<\/p>\n<p>Para los desarrolladores de plugins, las ventajas son a\u00fan mayores, desde la seguridad de los datos hasta la portabilidad del c\u00f3digo y una reducci\u00f3n dr\u00e1stica de la <a href=\"https:\/\/kinsta.com\/es\/blog\/agencias-wordpress-escalables\/#technical-debt\">deuda t\u00e9cnica<\/a>.<\/p>\n<p>\u00bfEst\u00e1s listo para empezar este viaje por la nueva arquitectura de IA de WordPress? Vamos all\u00e1.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Las tres capas de la arquitectura de IA de WordPress<\/h2>\n<p>Actualmente, tus sitios de WordPress ya est\u00e1n preparados de forma nativa para la IA. Sin embargo, no se trata de funcionalidades de IA listas para usar, sino m\u00e1s bien de la base para crear sitios web impulsados por la IA.<\/p>\n<p>La nueva arquitectura se estructura en tres capas distintas:<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Conector de IA<\/h3>\n<p>Antes de <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, cada plugin que a\u00f1ad\u00eda funcionalidades de IA a tu sitio necesitaba su propio sistema para almacenar y gestionar tus claves API. Tus credenciales ten\u00edan que estar integradas directamente en el plugin o gestionarse a trav\u00e9s de una p\u00e1gina de configuraci\u00f3n personalizada. En cualquier caso, estaba lejos de ser una soluci\u00f3n ideal para gestionar datos confidenciales.<\/p>\n<figure id=\"attachment_211404\" aria-describedby=\"caption-attachment-211404\" style=\"width: 1462px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211404 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/connectors-screen.png\" alt=\"Pantalla de conectores\" width=\"1462\" height=\"1404\"><figcaption id=\"caption-attachment-211404\" class=\"wp-caption-text\">La interfaz centralizada de Conectores de IA en el panel de administraci\u00f3n de WordPress.<\/figcaption><\/figure>\n<p>Una interfaz unificada te permite configurar todos tus proveedores de servicios de IA en un \u00fanico lugar central. Esta interfaz aporta varias ventajas importantes a la gesti\u00f3n del sitio.<\/p>\n<p>Desde el punto de vista de la gesti\u00f3n 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\u00ed, ya no tendr\u00e1s que volver a preocuparte por ellos, independientemente del n\u00famero de plugins que los utilicen. Si alguna vez necesitas cambiar tus claves API, no tendr\u00e1s que volver a configurar cada plugin; podr\u00e1s actualizarlas todas a la vez en la pantalla de Conectores.<\/p>\n<p>Centralizar las credenciales tambi\u00e9n mejora la seguridad de tu sitio, ya que reduce el riesgo de que se filtren datos confidenciales a trav\u00e9s de plugins de terceros que podr\u00edan estar mal programados o no ser de fiar.<\/p>\n<p>Otra ventaja clave es la portabilidad del c\u00f3digo. Tus plugins ya no necesitan saber qu\u00e9 proveedor de IA utilizas, ya que la nueva arquitectura separa la autenticaci\u00f3n de la l\u00f3gica del plugin. Esto significa que, si cambias de proveedor de IA, tu plugin seguir\u00e1 funcionando sin que tengas que cambiar ni una sola l\u00ednea de c\u00f3digo.<\/p>\n<p>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\u00e1ticamente el proveedor de IA y el modelo m\u00e1s adecuados para generar la respuesta, bas\u00e1ndose tanto en la <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/#ai-model-preferences\">configuraci\u00f3n espec\u00edfica del plugin<\/a> como en las capacidades de los modelos disponibles.<\/p>\n<h3>Cliente de IA<\/h3>\n<p>Mientras que la pantalla Conectores ofrece la interfaz de usuario para configurar los proveedores de IA, el <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">cliente de IA<\/a> te da la herramienta operativa para comunicarte con los modelos de IA.<\/p>\n<p>Se trata de una interfaz de software nativa que estandariza la interacci\u00f3n con los modelos de inteligencia artificial a trav\u00e9s de la funci\u00f3n global <code>wp_ai_client_prompt()<\/code>\u00a0y un conjunto unificado de m\u00e9todos PHP.<\/p>\n<h4>Reducci\u00f3n de la deuda t\u00e9cnica<\/h4>\n<p>Para los desarrolladores, una de las principales ventajas de la nueva arquitectura de IA es la reducci\u00f3n de la deuda t\u00e9cnica y las dependencias. Antes de WordPress 7.0, a\u00f1adir funcionalidades de IA supon\u00eda un coste muy elevado en cuanto al mantenimiento del c\u00f3digo. Ten\u00edas que incluir SDKs propietarios de terceros (como las bibliotecas oficiales de <a href=\"https:\/\/developers.openai.com\/api\/docs\/libraries\">OpenAI<\/a> o <a href=\"https:\/\/platform.claude.com\/docs\/en\/api\/client-sdks\">Anthropic<\/a>) y estar pendiente constantemente de las versiones de las bibliotecas. Esto hac\u00eda que el c\u00f3digo de los plugins fuera muy pesado y daba lugar a errores de compatibilidad.<\/p>\n<p>Adem\u00e1s, ten\u00edas que escribir muchas l\u00edneas de c\u00f3digo para gestionar la l\u00f3gica de red y el an\u00e1lisis de las respuestas. Y, para empeorar a\u00fan m\u00e1s las cosas, el c\u00f3digo era espec\u00edfico de cada proveedor, as\u00ed que si decid\u00edas cambiar de proveedor de IA, tendr\u00edas que reescribir toda la arquitectura de red de tu plugin.<\/p>\n<p>El cliente de IA (AI Client) resuelve este problema de ra\u00edz al delegar todo este trabajo pesado en el n\u00facleo (core) de WordPress. Tu c\u00f3digo deja de depender del proveedor de IA; solo tienes que escribir tus instrucciones una vez, y WordPress las traducir\u00e1 al \u00abdialecto\u00bb espec\u00edfico del modelo.<\/p>\n<h4>Selecci\u00f3n inteligente de modelos<\/h4>\n<p>Una funcionalidad muy potente de la interfaz fluida del cliente de IA es la posibilidad de configurar los modelos preferidos mediante el m\u00e9todo <code>using_model_preference()<\/code>, disponible a trav\u00e9s de la funci\u00f3n generadora <code>wp_ai_client_prompt()<\/code>. Este m\u00e9todo te permite declarar una lista ordenada de modelos para la tarea espec\u00edfica de tu plugin. Por ejemplo, el siguiente c\u00f3digo solicita la generaci\u00f3n de texto utilizando tres modelos preferidos:<\/p>\n<pre><code class=\"language-php\">$text_result = wp_ai_client_prompt( 'Convert the following transcript into a concise, blog-ready draft.' )\n\t-&gt;using_model_preference(\n\t\t'gemini-2.5-flash',\n\t\t'claude-3-5-sonnet',\n\t\t'gpt-4o'\n\t)\n\t-&gt;generate_text();<\/code><\/pre>\n<p>WordPress comprobar\u00e1 los proveedores configurados en la pantalla Conectores y analizar\u00e1 la lista de modelos definidos en el c\u00f3digo del plugin, seleccionando el primer conector que tambi\u00e9n est\u00e9 disponible en la web. Si ninguno de los modelos especificados en tu c\u00f3digo est\u00e1 disponible entre los Conectores activos, WordPress ignorar\u00e1 la lista de preferencias de modelos y recurrir\u00e1 al primer modelo compatible configurado en la web.<\/p>\n<p>Este mecanismo garantiza que tu plugin siempre funcione, incluso si el administrador de la web cambia a otro proveedor de IA.<\/p>\n<h3>Proveedor de IA<\/h3>\n<p>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\u00e1s comunes compatibles a trav\u00e9s de conectores espec\u00edficos en WordPress 7.0, pero los desarrolladores pueden registrar proveedores de IA personalizados adicionales.<\/p>\n<p>Cuando el c\u00f3digo de tu plugin llama al m\u00e9todo <code>generate_text()<\/code> \u2014 o a cualquier otro m\u00e9todo de generaci\u00f3n \u2014\u00a0WordPress compila y env\u00eda un paquete de datos al proveedor de IA a trav\u00e9s del endpoint establecido por el conector. Esta es la secuencia de operaciones que se lleva a cabo en segundo plano:<\/p>\n<ul>\n<li>En primer lugar, el proveedor de IA recibe el texto de la solicitud junto con cualquier archivo multimedia adjunto (carga de datos).<\/li>\n<li>Una vez recibida, procesa la solicitud aplicando las instrucciones del sistema.<\/li>\n<li>A partir de ah\u00ed, genera el resultado, ya sea como texto libre o como un objeto JSON.<\/li>\n<li>Por \u00faltimo, env\u00eda la salida de vuelta a WordPress a trav\u00e9s de una respuesta HTTP.<\/li>\n<\/ul>\n<p>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\u00e1genes, v\u00eddeo) junto con una solicitud de texto, pasando por modelos dise\u00f1ados para tareas espec\u00edficas, como la generaci\u00f3n de im\u00e1genes o la conversi\u00f3n de voz a texto.<\/p>\n<figure id=\"attachment_211411\" aria-describedby=\"caption-attachment-211411\" style=\"width: 1718px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211411 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/gemini-3-models.png\" alt=\"Modelos Gemini 3\" width=\"1718\" height=\"1534\"><figcaption id=\"caption-attachment-211411\" class=\"wp-caption-text\">La familia de modelos Gemini 3 de Google.<\/figcaption><\/figure>\n<p>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\u00e9 proveedor concreto se debe usar.<\/p>\n<h2>Un an\u00e1lisis en profundidad de la funci\u00f3n wp_ai_client_prompt()<\/h2>\n<p>La funci\u00f3n <code>wp_ai_client_prompt()<\/code> permite a los plugins comunicarse con modelos de IA de forma estandarizada: no tendr\u00e1s que instalar bibliotecas externas, gestionar configuraciones espec\u00edficas de cada proveedor ni codificar manualmente solicitudes HTTP.<\/p>\n<p>Es una interfaz de software que te permite escribir tu c\u00f3digo una sola vez, dejando que WordPress se encargue del trabajo pesado y traduzca tus instrucciones al \u00abdialecto\u00bb espec\u00edfico de cada modelo.<\/p>\n<p>La funci\u00f3n devuelve una instancia de la <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ai_client_prompt_builder\/\">clase <code>WP_AI_Client_Prompt_Builder<\/code><\/a>, que ofrece una interfaz fluida con m\u00e9todos encadenables para personalizar tus indicaciones. La funci\u00f3n se <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\">describe as\u00ed<\/a>:<\/p>\n<pre><code class=\"language-php\">\/**\n * Fluent builder for constructing AI prompts, returning WP_Error on failure.\n *\n * This class provides a fluent interface for building prompts with various\n * content types and model configurations. It wraps the PHP AI Client SDK's\n * PromptBuilder and adds WordPress-specific behavior including WP_Error\n * handling instead of exceptions, snake_case method naming, and integration\n * with the Abilities API.\n *\n * Only the generating methods will return a WP_Error, to not break the fluent\n * interface. As soon as any exception is caught in a chain of method calls,\n * the returned instance will be in an error state, and all subsequent method\n * calls will be no-ops that just return the same error state instance. Only\n * when a generating method is called, the WP_Error will be returned.\n *\/<\/code><\/pre>\n<p><code>wp_ai_client_prompt()<\/code> no realiza una solicitud HTTP inmediata; en su lugar, crea una instancia y devuelve un objeto <code>WP_AI_Client_Prompt_Builder<\/code>. M\u00e1s de 50 m\u00e9todos de configuraci\u00f3n asignan valores a las propiedades privadas del objeto mediante una <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fluent_interface\" target=\"_blank\" rel=\"noopener noreferrer\">interfaz fluida<\/a>, lo que hace que el c\u00f3digo sea muy legible y f\u00e1cil de escribir.<\/p>\n<p>Aqu\u00ed tienes una lista no exhaustiva de los m\u00e9todos que usar\u00e1s con m\u00e1s frecuencia:<\/p>\n<ul>\n<li><code>with_text()<\/code>: A\u00f1ade texto al mensaje actual.<\/li>\n<li><code>with_file()<\/code>: A\u00f1ade un archivo al mensaje actual.<\/li>\n<li><code>with_history()<\/code>: A\u00f1ade mensajes del historial de la conversaci\u00f3n.<\/li>\n<li><code>using_model_preference()<\/code>: Establece los modelos preferidos que se evaluar\u00e1n por orden.<\/li>\n<li><code>using_system_instruction()<\/code>: Establece la instrucci\u00f3n del sistema.<\/li>\n<li><code>using_max_tokens()<\/code>: Establece el n\u00famero m\u00e1ximo de tokens que se van a generar.<\/li>\n<li><code>using_temperature()<\/code>: Establece la temperatura para la generaci\u00f3n.<\/li>\n<li><code>using_top_p()<\/code>: Establece el valor top-p para la generaci\u00f3n.<\/li>\n<li><code>using_top_k()<\/code>: Establece el valor top-k para la generaci\u00f3n.<\/li>\n<li><code>as_output_file_type()<\/code>: Establece el tipo de archivo de salida.<\/li>\n<li><code>as_json_response()<\/code>: Configura el mensaje de solicitud para la salida de respuestas JSON.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: Comprueba si la configuraci\u00f3n activa admite la generaci\u00f3n de texto.<\/li>\n<li><code>is_supported_for_image_generation()<\/code>: Comprueba si la configuraci\u00f3n activa admite la generaci\u00f3n de im\u00e1genes.<\/li>\n<li><code>is_supported_for_text_to_speech_conversion()<\/code>: Comprueba si la configuraci\u00f3n activa admite la conversi\u00f3n de texto a voz.<\/li>\n<li><code>is_supported_for_video_generation()<\/code>: Comprueba si la configuraci\u00f3n activa admite la generaci\u00f3n de v\u00eddeos.<\/li>\n<li><code>generate_text()<\/code>: Genera un resultado de texto a partir de la indicaci\u00f3n.<\/li>\n<li><code>generate_image()<\/code>: Genera una imagen a partir de la indicaci\u00f3n.<\/li>\n<li><code>convert_text_to_speech()<\/code>: Convierte texto en voz.<\/li>\n<li><code>generate_speech()<\/code>: Genera voz a partir de la indicaci\u00f3n.<\/li>\n<li><code>generate_video()<\/code>: Genera un v\u00eddeo a partir de la indicaci\u00f3n.<\/li>\n<\/ul>\n<p>Para ver la lista completa de m\u00e9todos, echa un vistazo al <a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.0\/src\/wp-includes\/ai-client\/class-wp-ai-client-prompt-builder.php#L33\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo fuente del n\u00facleo de WordPress<\/a>.<\/p>\n<p>Supongamos que quieres transcribir con precisi\u00f3n el contenido de un archivo de audio. Podr\u00edas usar la funci\u00f3n de la siguiente manera:<\/p>\n<pre><code class=\"language-php\">$transcription_builder = wp_ai_client_prompt( $prompt )\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\t\/\/ No configured provider supports the current prompt configuration.\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Esto es lo que hace este c\u00f3digo:<\/p>\n<ul>\n<li><code>$prompt<\/code>: Representa la cadena principal que contiene tus instrucciones principales.<\/li>\n<li><code>with_file()<\/code>: 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.<\/li>\n<li><code>using_temperature()<\/code>: Controla el determinismo de la respuesta. Mientras que un valor bajo (0,1) obliga al modelo a mantenerse fiel al audio, un valor m\u00e1s alto permite una mayor libertad creativa. Puedes combinar este m\u00e9todo con el m\u00e9todo\u00a0 <code>using_top_p()<\/code> (probabilidad m\u00e1xima) para tener un control m\u00e1s preciso sobre el resultado.<\/li>\n<li><code>is_supported_for_text_generation()<\/code>: Comprueba si los conectores activos cumplen los requisitos de la solicitud actual antes de dedicar recursos a una llamada de red.<\/li>\n<li><code>generate_text()<\/code>: Este es el m\u00e9todo de finalizaci\u00f3n de la interfaz fluida. Env\u00eda la solicitud HTTP unificada al proveedor activo y devuelve la cadena de texto generada o, en caso de fallo, un objeto\u00a0 <code>WP_Error<\/code> .<\/li>\n<\/ul>\n<p>En resumen, le pasamos al proveedor de IA una indicaci\u00f3n de texto y un archivo de audio adjunto. Establecimos una temperatura baja para garantizar el resultado m\u00e1s determinista posible, verificamos que la configuraci\u00f3n activa admitiera la generaci\u00f3n de texto y, por \u00faltimo, ejecutamos la transcripci\u00f3n de voz a texto bas\u00e1ndonos en la respuesta de la IA.<\/p>\n<p>Con otro prompt, podemos devolver la transcripci\u00f3n sin procesar a la IA para que genere una respuesta estructurada como un objeto JSON:<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in American English.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;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).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();<\/code><\/pre>\n<p>Para este segundo prompt, usamos m\u00e9todos adicionales para aprovechar otras capacidades de la API:<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code>: Define el contexto operativo y el papel del modelo, separando claramente su persona (\u00abun editor profesional de contenido de WordPress\u00bb) de los datos propiamente dichos.<\/li>\n<li><code>using_temperature( 0.4 )<\/code>: Establece una temperatura m\u00e1s alta que en la tarea de transcripci\u00f3n anterior, lo que permite al modelo utilizar un vocabulario m\u00e1s rico y producir un contenido m\u00e1s fluido.<\/li>\n<li><code>as_json_response()<\/code>: Obliga al modelo a devolver una cadena JSON estructurada que coincida con el dise\u00f1o definido en tu variable <code>$schema<\/code>. Esto resulta \u00fatil a la hora de preparar contenido para Gutenberg.<\/li>\n<\/ul>\n<p>Con una salida estructurada en formato JSON, puedes extraer campos individuales y asignarlos mediante c\u00f3digo a bloques nativos de Gutenberg utilizando las funciones b\u00e1sicas de WordPress.<\/p>\n<p>Si quieres conocer m\u00e1s a fondo el cliente de IA (AI Client), \u00e9chale un vistazo tambi\u00e9n a la nota de desarrollo <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\">Presentaci\u00f3n del AI Client en WordPress 7.0<\/a>.<\/p>\n<h2>Convierte un archivo de audio en contenido listo para Gutenberg con IA<\/h2>\n<p>Ahora que ya entiendes mejor las tres capas de la arquitectura de IA de WordPress, veamos c\u00f3mo encaja todo con un ejemplo real. En esta secci\u00f3n, aprender\u00e1s a crear la l\u00f3gica esencial de un plugin basado en IA dise\u00f1ado para generar un borrador de entrada bien elaborado directamente a partir de un archivo de audio.<\/p>\n<p>Los casos de uso de esta funcionalidad son muy amplios y variados. Imag\u00ednate crear una entrada de blog completa a partir de una nota de voz r\u00e1pida enviada a trav\u00e9s de tu app de mensajer\u00eda favorita, o transcribir una entrevista de audio grabada en tu smartphone.<\/p>\n<p>Para implementar esta funcionalidad en tu sitio de WordPress, tendr\u00e1s que crear un plugin personalizado. Aqu\u00ed no vamos a hablar de los archivos de plantilla ni del proceso completo de registro del plugin; si quieres conocer los conceptos b\u00e1sicos del desarrollo de plugins, puedes consultar <a href=\"https:\/\/kinsta.com\/es\/blog\/plugin-gutenberg\/\">otros tutoriales<\/a> en el blog de Kinsta o la <a href=\"https:\/\/make.wordpress.org\/cli\/handbook\/how-to\/how-to-create-custom-plugins\/\">documentaci\u00f3n oficial de WordPress.org<\/a>.<\/p>\n<p>Nos centraremos en la l\u00f3gica b\u00e1sica que permite que tu plugin se comunique con tu proveedor de IA. Pero no te preocupes, el plugin est\u00e1 disponible para que lo eches un vistazo y lo descargues en <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\">este repositorio de GitHub<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>El plugin de ejemplo de este tutorial se ha creado en WordPress 7.0. No funcionar\u00e1 en versiones anteriores del CMS.<\/p>\n<\/aside>\n\n<h3>Qu\u00e9 hace este plugin<\/h3>\n<p>Para empezar, ve a la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina del proyecto en GitHub<\/a> y desc\u00e1rgate el archivo ZIP del plugin. A continuaci\u00f3n, inicia sesi\u00f3n en tu panel de control de WordPress 7.0 y s\u00fabelo desde <strong>Plugins<\/strong> &gt; <strong>A\u00f1adir plugin<\/strong> &gt; <strong>Subir plugin<\/strong>. Una vez instalado y activado el plugin, ya est\u00e1s listo para seguir este tutorial.<\/p>\n<p>El plugin <strong>AI Content Builder<\/strong> genera un sidebar de configuraci\u00f3n 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\u00edfica para subir archivos de audio y un bot\u00f3n que permite que la IA sobrescriba el t\u00edtulo actual de la entrada.<\/p>\n<figure id=\"attachment_211625\" aria-describedby=\"caption-attachment-211625\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211625 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-content-builder-sidebar.png\" alt=\"El sidebar de AI Content Builder\" width=\"1612\" height=\"1054\"><figcaption id=\"caption-attachment-211625\" class=\"wp-caption-text\">El plugin AI Content Builder a\u00f1ade un sidebar de configuraci\u00f3n personalizada al editor de bloques.<\/figcaption><\/figure>\n<p>El bot\u00f3n <strong>Subir nota de audio<\/strong>\u00a0abre 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.<\/p>\n<figure id=\"attachment_211626\" aria-describedby=\"caption-attachment-211626\" style=\"width: 1560px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211626 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/select-or-upload-media.png\" alt=\"La biblioteca multimedia de WordPress\" width=\"1560\" height=\"1328\"><figcaption id=\"caption-attachment-211626\" class=\"wp-caption-text\">Selecciona o sube archivos de audio en la biblioteca multimedia de WordPress.<\/figcaption><\/figure>\n<p>Una vez cargado el archivo de audio, el bot\u00f3n <strong>Generar Contenido<\/strong>\u00a0activa una solicitud as\u00edncrona a tu proveedor de IA activo.<\/p>\n<figure id=\"attachment_211627\" aria-describedby=\"caption-attachment-211627\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211627 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/generate-content-button.png\" alt=\"La barra lateral del plugin\" width=\"1616\" height=\"1062\"><figcaption id=\"caption-attachment-211627\" class=\"wp-caption-text\">La barra lateral del plugin con el bot\u00f3n \u00abGenerar contenido\u00bb activo.<\/figcaption><\/figure>\n<p>La imagen de abajo muestra el borrador final de la entrada generado por la IA en solo unos segundos.<\/p>\n<figure id=\"attachment_211628\" aria-describedby=\"caption-attachment-211628\" style=\"width: 1612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211628 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/ai-generated-post-content.png\" alt=\"Marcado generado por IA\" width=\"1612\" height=\"1336\"><figcaption id=\"caption-attachment-211628\" class=\"wp-caption-text\">Un borrador de entrada de blog bien maquetado, generado por IA a partir de un archivo de audio sin editar.<\/figcaption><\/figure>\n<p>El contenido resultante est\u00e1 estructurado en bloques nativos de Gutenberg, incluyendo p\u00e1rrafos, encabezados y listas.<\/p>\n<figure id=\"attachment_211629\" aria-describedby=\"caption-attachment-211629\" style=\"width: 1616px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211629 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/post-content-in-code-editor.png\" alt=\"Un marcado bien estructurado en el editor de c\u00f3digo de WordPress.\" width=\"1616\" height=\"1396\"><figcaption id=\"caption-attachment-211629\" class=\"wp-caption-text\">Un marcado bien estructurado en el editor de c\u00f3digo de WordPress.<\/figcaption><\/figure>\n<p>Ahora vamos a profundizar en la l\u00f3gica del plugin.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Este plugin se ha creado espec\u00edficamente para este tutorial y solo tiene fines ilustrativos. No lo uses en un entorno de producci\u00f3n.<\/p>\n<\/aside>\n\n<h3>Lo que necesitas para este plugin<\/h3>\n<p>Estos son los requisitos b\u00e1sicos para crear un plugin de WordPress que se integre en la nueva arquitectura de IA para generar el contenido de tus entradas:<\/p>\n<ul>\n<li>WordPress 7.0<\/li>\n<li>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.<\/li>\n<li>Tu IDE favorito. Para este plugin, hemos usado VS Code.<\/li>\n<li>Un buen conocimiento de WordPress y del desarrollo con Gutenberg, las API REST, PHP y JavaScript.<\/li>\n<\/ul>\n<p>No tienes que preocuparte por Node.js, los procesos de construcci\u00f3n o la importaci\u00f3n de bibliotecas externas, ya que este plugin se basa por completo en las APIs nativas del n\u00facleo de WordPress. El resultado es un plugin ligero y seguro, sin ninguna deuda t\u00e9cnica.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Por cuestiones de espacio, las siguientes secciones se centrar\u00e1n exclusivamente en el c\u00f3digo que regula la comunicaci\u00f3n con el cliente de IA y la gesti\u00f3n del contenido generado por IA. El resto del c\u00f3digo est\u00e1 completamente documentado en el <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/tree\/35ef318c10768969e235c89617a59cc4b6b38eb4\" target=\"_blank\" rel=\"noopener noreferrer\">repositorio de GitHub<\/a>.<\/p>\n<\/aside>\n\n<h3>Estructura del plugin y versi\u00f3n m\u00ednima de WordPress<\/h3>\n<p>El plugin AI Content Builder solo tiene dos archivos:<\/p>\n<ul>\n<li><code>ai-content-builder.php<\/code><\/li>\n<li><code>editor.js.<\/code><\/li>\n<\/ul>\n<p>La versi\u00f3n m\u00ednima requerida de WordPress es la 7.0, as\u00ed que aseg\u00farate de indicarla en el encabezado del plugin:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name: AI Content Builder\n * Description: Gutenberg sidebar plugin that uploads audio and generates post content using the WordPress 7.0 AI Client.\n * Version: 1.0.0\n * Requires at least: 7.0\n * Requires PHP: 8.0\n * Author: Your Name\n * License: GPL-2.0-or-later\n * Text Domain: ai-content-builder\n *\/<\/code><\/pre>\n<p>Teniendo esto en cuenta, echemos un vistazo al proceso de creaci\u00f3n de un plugin para WordPress basado en IA.<\/p>\n<h3>El flujo de datos del plugin<\/h3>\n<p>Antes de meternos de lleno en el c\u00f3digo, echemos un vistazo a c\u00f3mo 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.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#register-api-endpoint\">1. Del navegador al servidor: llamada REST as\u00edncrona<\/a>: el navegador env\u00eda 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\u00edncronas al servidor PHP.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#first-ai-pass\">2. Primera pasada de la IA: transcripci\u00f3n de voz a texto<\/a>: el servidor intercepta la solicitud, recupera el audio de la base de datos y env\u00eda una consulta al cliente de IA para extraer la transcripci\u00f3n de texto sin procesar.<\/p>\n<p><a href=\"#second-ai-pass\">3. Segunda pasada de la IA: Estructuraci\u00f3n del contenido<\/a>: el servidor devuelve la transcripci\u00f3n sin procesar al cliente de IA y le pide que la formatee como un objeto JSON estructurado.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#block-generation\">4. Hidrataci\u00f3n de datos (Data hydration) y generaci\u00f3n de bloques<\/a>: el script de JavaScript (JS) recibe el objeto JSON estructurado, lo normaliza y asigna los campos a los bloques nativos de Gutenberg.<\/p>\n<p>Ahora veamos la l\u00f3gica que hay detr\u00e1s de cada fase.<\/p>\n<h3>1. Registrar un endpoint de API personalizado<\/h3>\n<p>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. <b>Registrar un endpoint REST te permite realizar solicitudes as\u00edncronas a trav\u00e9s de los controles de la barra lateral, lo que evita que la interfaz de usuario se cuelgue.<\/b><\/p>\n<p>Al registrar un endpoint de API, tambi\u00e9n puedes realizar llamadas seguras a la IA sin tener que revelar tus credenciales de inicio de sesi\u00f3n, gracias al sistema de autenticaci\u00f3n nativo de WordPress.<\/p>\n<p>La l\u00f3gica para registrar e inicializar el endpoint se gestiona en el archivo PHP del plugin mediante los dos m\u00e9todos de clase, <code>init()<\/code> y <code>register_rest_routes()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function init(): void {\n\n\t\/\/ Register the custom REST endpoint used by the sidebar JS.\n\tadd_action( 'rest_api_init', array( __CLASS__, 'register_rest_routes' ) );\n\n\t...\n}<\/code><\/pre>\n<p>Al vincular la llamada a la funci\u00f3n al hook <code>rest_api_init<\/code>, el plugin solo registra la ra\u00edz 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\u00e1gina.<\/p>\n<p>Puedes configurar las rutas usando el m\u00e9todo <code>register_rest_routes()<\/code>, tal y como se muestra en el siguiente c\u00f3digo:<\/p>\n<pre><code class=\"language-php\">public static function register_rest_routes(): void {\n\tregister_rest_route(\n\t\tself::REST_NAMESPACE,\n\t\tself::REST_ROUTE,\n\t\tarray(\n\t\t\t'methods'             =&gt; WP_REST_Server::CREATABLE, \/\/ Alias for POST.\n\t\t\t'callback'            =&gt; array( __CLASS__, 'handle_generate_request' ),\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\t\/\/ Reject unauthenticated or insufficiently privileged requests early.\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'args'                =&gt; array(\n\t\t\t\t'audio_id' =&gt; array(\n\t\t\t\t\t'type'     =&gt; 'integer',\n\t\t\t\t\t'required' =&gt; true,\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}<\/code><\/pre>\n<p>Este m\u00e9todo hace lo siguiente:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_rest_route\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funci\u00f3n <code>register_rest_route()<\/code><\/a>\u00a0admite tres par\u00e1metros: el espacio de nombres de la ruta, la propia ruta y un array de configuraci\u00f3n.<\/li>\n<li><code>WP_REST_Server::CREATABLE<\/code> es un alias del m\u00e9todo de transporte POST, que se utiliza para garantizar la m\u00e1xima compatibilidad con la arquitectura interna de WordPress.<\/li>\n<li><code>permission_callback<\/code> es una funci\u00f3n an\u00f3nima 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\u00e1ticamente un error <a href=\"https:\/\/kinsta.com\/es\/blog\/error-401\/\">401 Unauthorized<\/a> (401 No autorizado) o <a href=\"https:\/\/kinsta.com\/es\/blog\/error-403-forbidden\/\">403 Forbidden<\/a> (403 Prohibido) en caso de acceso no autorizado.<\/li>\n<li><code>args<\/code> es un array opcional de par\u00e1metros adicionales que se pueden usar para modificar la respuesta de la API. Te permite especificar los datos que debe devolver la solicitud al endpoint.<\/li>\n<li><code>audio_id<\/code> es un array de par\u00e1metros 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\u00f3n y genera un error.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Echa un vistazo a la documentaci\u00f3n oficial para obtener m\u00e1s informaci\u00f3n sobre <a href=\"https:\/\/developer.wordpress.org\/rest-api\/extending-the-rest-api\/routes-and-endpoints\/\">rutas y endpoints<\/a>.<\/p>\n<\/aside>\n\n<p>Por \u00faltimo, aseg\u00farate de que la barra lateral del editor sepa d\u00f3nde enviar los datos. Para ello, utiliza la funci\u00f3n <code>wp_localize_script()<\/code> dentro del m\u00e9todo <code>enqueue_editor_assets()<\/code>.<\/p>\n<pre><code class=\"language-php\">public static function enqueue_editor_assets(): void {\n\t...\n\n\twp_localize_script(\n\t\t'ai-content-builder-editor',\n\t\t'AICBData',\n\t\tarray(\n\t\t\t'restPath' =&gt; '\/' . self::REST_NAMESPACE . self::REST_ROUTE,\n\t\t\t'nonce'    =&gt; wp_create_nonce( 'wp_rest' ),\n\t\t)\n\t);\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_localize_script\/\" target=\"_blank\" rel=\"noopener noreferrer\">La funci\u00f3n <code>wp_localize_script()<\/code><\/a> se usa principalmente para asignar un script registrado a una variable de JavaScript, pero aqu\u00ed la usamos para pasar datos de PHP a JavaScript a trav\u00e9s del objeto global <code>AICBData<\/code>.<\/li>\n<li><code>restPath<\/code> es la direcci\u00f3n del endpoint; al indicarla aqu\u00ed, te ahorras tener que escribirla directamente en el archivo de JavaScript.<\/li>\n<li><code>nonce<\/code> Establece un token de seguridad para <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_create_nonce\/\" target=\"_blank\" rel=\"noopener noreferrer\">evitar el acceso no autorizado<\/a>.<\/li>\n<\/ul>\n<h3 id=\"first-ai-pass\">2. Acceder al cliente de IA para extraer texto de un archivo de audio<\/h3>\n<p>El n\u00facleo de nuestro plugin es el m\u00e9todo <code>handle_generate_request()<\/code>. Este m\u00e9todo lleva a cabo una secuencia de tareas, que empieza con comprobaciones de seguridad y termina con la generaci\u00f3n del contenido de la entrada que se va a insertar en el editor de bloques.<\/p>\n<p>En primer lugar, comprueba que el cliente de IA est\u00e9 disponible y que la compatibilidad con la IA no se haya desactivado en la web.<\/p>\n<pre><code class=\"language-php\">public static function handle_generate_request( WP_REST_Request $request ) {\n\tif ( ! function_exists( 'wp_ai_client_prompt' ) ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_client_unavailable',\n\t\t\t'WordPress AI Client is not available. This plugin requires WordPress 7.0 .',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\tif ( function_exists( 'wp_supports_ai' ) && ! wp_supports_ai() ) {\n\t\treturn new WP_Error(\n\t\t\t'ai_disabled',\n\t\t\t'AI support is disabled on this site.',\n\t\t\tarray( 'status' =&gt; 403 )\n\t\t);\n\t}\n\t...\n}<\/code><\/pre>\n<p>Si se produce un error, las comprobaciones devuelven un error 500 o 403, respectivamente.<\/p>\n<p>El siguiente bloque de c\u00f3digo realiza estas acciones:<\/p>\n<ul>\n<li>Extrae el ID del archivo de audio de la solicitud<\/li>\n<li>Se asegura de que el ID del archivo de audio sea un n\u00famero entero positivo<\/li>\n<li>Comprueba el tipo de archivo<\/li>\n<li>Recupera el tipo MIME<\/li>\n<li>Extrae y codifica el contenido del archivo en Base64<\/li>\n<\/ul>\n<pre><code class=\"language-php\">$audio_id = absint( $request-&gt;get_param( 'audio_id' ) );\nif ( ! $audio_id ) {\n\treturn new WP_Error( 'invalid_audio_id', 'Invalid audio ID.', array( 'status' =&gt; 400 ) );\n}\n\n$attachment = get_post( $audio_id );\nif ( ! $attachment || 'attachment' !== $attachment-&gt;post_type ) {\n\treturn new WP_Error( 'audio_not_found', 'Audio attachment not found.', array( 'status' =&gt; 404 ) );\n}\n\n$mime_type = (string) get_post_mime_type( $audio_id );\nif ( 0 !== strpos( $mime_type, 'audio\/' ) ) {\n\treturn new WP_Error( 'invalid_audio_type', 'Attachment must be an audio file.', array( 'status' =&gt; 400 ) );\n}\n\n$audio_path = get_attached_file( $audio_id );\nif ( ! $audio_path || ! file_exists( $audio_path ) ) {\n\treturn new WP_Error( 'audio_path_missing', 'Audio file path not found on server.', array( 'status' =&gt; 404 ) );\n}\n\n$audio_bytes = file_get_contents( $audio_path );\nif ( false === $audio_bytes ) {\n\treturn new WP_Error( 'audio_read_failed', 'Unable to read audio file.', array( 'status' =&gt; 500 ) );\n}\n\n$audio_base64 = base64_encode( $audio_bytes );<\/code><\/pre>\n<figure id=\"attachment_211767\" aria-describedby=\"caption-attachment-211767\" style=\"width: 1594px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211767 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/mime-type-error.png\" alt=\"Error de tipo de archivo no v\u00e1lido\" width=\"1594\" height=\"1190\"><figcaption id=\"caption-attachment-211767\" class=\"wp-caption-text\">Se genera un mensaje de error cuando intentas procesar un tipo de archivo no v\u00e1lido<\/figcaption><\/figure>\n<p>As\u00ed, el archivo binario se ha convertido en una cadena que se puede pasar al cliente de IA. Ahora podemos pasar a extraer el texto:<\/p>\n<pre><code class=\"language-php\">$output_language = self::get_output_language();\n\n$transcription_builder = wp_ai_client_prompt(\n\t\"Transcribe this voice note accurately into $output_language. Return plain text only.\"\n)\n\t-&gt;with_file( $audio_base64, $mime_type )\n\t-&gt;using_temperature( 0.1 );\n\nif ( ! $transcription_builder-&gt;is_supported_for_text_generation() ) {\n\treturn new WP_Error(\n\t\t'no_supported_model',\n\t\t'No configured AI model can process this request. Configure a provider in Settings &gt; Connectors.',\n\t\tarray( 'status' =&gt; 400 )\n\t);\n}\n\n$transcript = $transcription_builder-&gt;generate_text();<\/code><\/pre>\n<p>Aqu\u00ed tienes un resumen de lo que hace el c\u00f3digo de arriba.<\/p>\n<ul>\n<li><code>get_output_language()<\/code> es un m\u00e9todo est\u00e1tico definido en otra parte del script que devuelve la configuraci\u00f3n regional del sitio. (Consulta <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L135\">GitHub<\/a>.)<\/li>\n<li><code>wp_ai_client_prompt()<\/code>inicializa una nueva solicitud pasando el prompt principal.<\/li>\n<li><code>with_file()<\/code> Le indica al cliente de IA que estamos enviando una solicitud multimodal; este acepta el contenido del archivo en Base64 y el tipo MIME.<\/li>\n<li><code>using_temperature()<\/code> te permite especificar el nivel de determinismo de la respuesta. Establecemos un valor bajo para obtener una transcripci\u00f3n fiel del audio.<\/li>\n<li>El m\u00e9todo <code>is_supported_for_text_generation()<\/code> 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.<\/li>\n<li>El m\u00e9todo <code>generate_text()<\/code>\u00a0inicia la solicitud HTTP.<\/li>\n<\/ul>\n<h3 id=\"second-ai-pass\">3. Convertir la transcripci\u00f3n del audio en contenido estructurado<\/h3>\n<p>Ahora que ya tenemos la transcripci\u00f3n, 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.<\/p>\n<pre><code class=\"language-php\">$schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'title'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t'sections' =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array(\n\t\t\t\t'type'       =&gt; 'object',\n\t\t\t\t'properties' =&gt; array(\n\t\t\t\t\t'heading'    =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t'level'      =&gt; array(\n\t\t\t\t\t\t'type' =&gt; 'integer',\n\t\t\t\t\t),\n\t\t\t\t\t'paragraphs' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t\t'bullet_points' =&gt; array(\n\t\t\t\t\t\t'type'  =&gt; 'array',\n\t\t\t\t\t\t'items' =&gt; array( 'type' =&gt; 'string' ),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\t'required'   =&gt; array( 'heading', 'level', 'paragraphs' ),\n\t\t\t),\n\t\t),\n\t),\n\t'required'   =&gt; array( 'title', 'sections' ),\n);<\/code><\/pre>\n<p>Con esta estructura, la IA te responder\u00e1 con un objeto JSON que contiene un t\u00edtulo y un array de secciones. Cada secci\u00f3n debe incluir un encabezado, un nivel de encabezado, al menos un p\u00e1rrafo y una lista con vi\u00f1etas.<\/p>\n<p>Ahora que ya tenemos el esquema definido, podemos pasar a configurar la segunda solicitud al cliente de IA:<\/p>\n<pre><code class=\"language-php\">$structured_json = wp_ai_client_prompt(\n\t\"Convert the following transcript into a concise, blog-ready draft in $output_language.n\" .\n\t\"Return JSON with a post title and body sections.n\" .\n\t\"Each section must have: heading, level (2 or 3), and paragraphs (array).n\" .\n\t\"If useful, include bullet_points (array) for short actionable lists.n\" .\n\t\"Use short, clear headings and readable paragraph text.nn\" .\n\t\"Transcript:n\" . $transcript\n)\n\t-&gt;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).\" )\n\t-&gt;using_temperature( 0.4 )\n\t-&gt;as_json_response( $schema )\n\t-&gt;generate_text();\n\nif ( is_wp_error( $structured_json ) ) {\n\treturn $structured_json;\n}<\/code><\/pre>\n<p>Analicemos los puntos clave de este c\u00f3digo:<\/p>\n<ul>\n<li><code>using_system_instruction()<\/code> define la personalidad del modelo.<\/li>\n<li><code>using_temperature( 0,4 )<\/code> establece un valor de temperatura m\u00e1s alto, lo que le da a la IA mayor libertad creativa para generar una respuesta y producir una prosa m\u00e1s fluida y rica.<\/li>\n<li><code>as_json_response( $schema )<\/code> indica al cliente que proporcione la respuesta en un formato estructurado.<\/li>\n<li>El plugin se detiene si hay alg\u00fan error.<\/li>\n<\/ul>\n<p>El siguiente paso es descodificar y depurar los datos.<\/p>\n<pre><code class=\"language-php\">$structured = json_decode( (string) $structured_json, true );\n\nif ( ! is_array( $structured ) ) {\n\treturn new WP_Error(\n\t\t'invalid_ai_json',\n\t\t'Could not parse structured AI response.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}\n\n$normalized = self::normalize_structured_post( $structured );\n\nif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\treturn new WP_Error(\n\t\t'empty_structured_content',\n\t\t'The AI provider returned empty structured content.',\n\t\tarray( 'status' =&gt; 500 )\n\t);\n}<\/code><\/pre>\n<p>En el c\u00f3digo anterior:<\/p>\n<ul>\n<li>La funci\u00f3n <code>json_decode()<\/code> convierte la cadena JSON en un array asociativo de PHP.<\/li>\n<li>Si el JSON tiene un formato incorrecto, la siguiente comprobaci\u00f3n devuelve un c\u00f3digo de estado 500 junto con un mensaje de error claro.<\/li>\n<li>El m\u00e9todo est\u00e1tico <code>normalize_structured_post()<\/code> limpia y normaliza la salida del proveedor antes de pasarla a JavaScript (mira la definici\u00f3n de esta funci\u00f3n en <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/ai-content-builder.php#L476\">GitHub<\/a>).<\/li>\n<\/ul>\n<p>Lo \u00fanico que queda por hacer ahora es pasar el resultado a JavaScript para generar bloques nativos de Gutenberg.<\/p>\n<h3 id=\"block-generation\">4. Generar una salida compatible con Gutenberg<\/h3>\n<p>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 <code>editor.js<\/code>.<\/p>\n<p>Cuando el usuario selecciona un archivo de audio, se ejecuta el <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L342\" target=\"_blank\" rel=\"noopener noreferrer\">siguiente c\u00f3digo<\/a>:<\/p>\n<pre><code class=\"language-javascript\">function AIContentBuilderSidebar() {\n\n\tconst [ audioId, setAudioId ] = useState( 0 );\n\t...\n\n\tconst onSelectAudio = function ( media ) {\n\t\tif ( ! media || ! media.id ) {\n\t\t\treturn;\n\t\t}\n\t\tsetAudioId( media.id );\n\t\tsetAudioLabel( media.title || media.filename || ( 'Audio #'   media.id ) );\n\t\tsetNotice( null );\n\t};\n\t...\n}<\/code><\/pre>\n<p>Este c\u00f3digo recupera el ID del archivo de audio grabado de la base de datos de WordPress.<\/p>\n<p>Cuando haces clic en el bot\u00f3n <b>Generar contenido<\/b>, la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L382\">funci\u00f3n <code>onGenerate()<\/code><\/a> usa <code>apiFetch()<\/code> para enviar una solicitud POST al endpoint de la API, incluyendo el ID del audio, entre otras cosas.<\/p>\n<pre><code class=\"language-javascript\">const onGenerate = async function () {\n\n\t...\n\n\ttry {\n\t\tconst response = await apiFetch( {\n\t\t\tpath: AICBData.restPath,\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'X-WP-Nonce': AICBData.nonce,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\taudio_id: audioId,\n\t\t\t},\n\t\t} );\n\t\t...\n\t}\n\t...\n}<\/code><\/pre>\n<ul>\n<li><code>await<\/code> pausa la funci\u00f3n temporalmente para evitar que el navegador se cuelgue mientras espera la respuesta de la IA.<\/li>\n<li>Una vez recibido, el objeto JSON se guarda temporalmente en la variable <code>response<\/code> .<\/li>\n<\/ul>\n<p>El contenido de la variable <code>response<\/code>\u00a0ser\u00e1 un objeto estructurado de la siguiente manera:<\/p>\n<pre><code class=\"language-json\">{\n\ttitle: \"Two Wheels to the Medina: ...\",\n\tsections: [\n\t\t{\n\t\t\theading: \"A Well-Deserved Rest in the Red City\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"On April 24th, our group of seven motorcyclists...\" ],\n\t\t\tbullet_points: []\n\t\t},\n\t\t{\n\t\t\theading: \"Diving into the Medina and Jemaa el-Fnaa\",\n\t\t\tlevel: 2,\n\t\t\tparagraphs: [ \"We spent the day exploring the historic Medina...\" ],\n\t\t\tbullet_points: [ \n\t\t\t\t\"Navigating the vibrant, maze-like alleys of the ancient Medina\", \n\t\t\t\t\"Tasting traditional Berber tagines and Moroccan mint tea\",\n\t\t\t\t\"Shopping for handmade leather goods, spices, and lanterns in the souks\" \n\t\t\t]\n\t\t},\n\t\t{...}\n\t],\n\tcontent: \"Fallback plain text...\",\n\ttranscript: \"Full transcript...\"\n}<\/code><\/pre>\n<p>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\u00f3n antes de extraer los datos para la generaci\u00f3n de bloques:<\/p>\n<pre><code class=\"language-javascript\">const normalizedSections = normalizeSectionsPayload( response.sections );<\/code><\/pre>\n<ul>\n<li>La funci\u00f3n <code>normalizeSectionsPayload()<\/code> normaliza los payloads de <code>sections<\/code> con valores inciertos y las convierte en un array. (Echa un vistazo <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L171\" target=\"_blank\" rel=\"noopener noreferrer\">al c\u00f3digo en GitHub<\/a>.)<\/li>\n<\/ul>\n<p>A continuaci\u00f3n, la variable <code>normalizedSections<\/code>\u00a0se pasa como argumento a la <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">funci\u00f3n que convierte<\/a> los campos de <code>sections<\/code> en bloques nativos de Gutenberg:<\/p>\n<pre><code class=\"language-javascript\">const structuredBlocks = buildBlocksFromSections( normalizedSections );<\/code><\/pre>\n<p>A continuaci\u00f3n tienes un fragmento de la funci\u00f3n <code>buildBlocksFromSections()<\/code>:<\/p>\n<pre><code class=\"language-javascript\">function buildBlocksFromSections( sections ) {\n\tif ( ! Array.isArray( sections ) ) {\n\t\treturn [];\n\t}\n\n\tconst blocks = [];\n\n\tsections.forEach( function ( section ) {\n\t\tif ( ! section || 'object' !== typeof section ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst heading =\n\t\t\t\t( 'string' === typeof section.heading )\n\t\t\t\t\t? section.heading.trim()\n\t\t\t\t\t: '';\n\n\t\t\tconst level = ( 3 === section.level ) ? 3 : 2;\n\n\t\t\tif ( heading ) {\n\t\t\t\tblocks.push(\n\t\t\t\t\tcreateBlock( 'core\/heading', {\n\t\t\t\t\t\tcontent: heading,\n\t\t\t\t\t\tlevel: level,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t...\n\n\t\t} );\n\treturn blocks;\n}<\/code><\/pre>\n<p>En el c\u00f3digo anterior, el bucle <code>forEach()<\/code> recorre el array de datos, extrayendo <code>section.heading<\/code> y <code>section.level<\/code>\u00a0para que los utilice la funci\u00f3n nativa <code>createBlock()<\/code>.<\/p>\n<p>Para ver la correspondencia entre <code>section.paragraphs<\/code>\u00a0y <code>section.bullet_points<\/code>, echa un vistazo al <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder\/blob\/35ef318c10768969e235c89617a59cc4b6b38eb4\/editor.js#L60\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo fuente en GitHub<\/a>.<\/p>\n<h2>Posibilidades de ampliaci\u00f3n infinitas<\/h2>\n<p>La incorporaci\u00f3n de la IA en WordPress abre nuevos horizontes tanto para los administradores de sitios web como para los desarrolladores. Antes ten\u00edas 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\u00f1adir funcionalidades basadas en IA se ha vuelto incre\u00edblemente sencillo.<\/p>\n<p>El plugin de ejemplo que se muestra en la segunda parte de este art\u00edculo solo ilustra un caso de uso concreto. Sin embargo, deja claro c\u00f3mo ahora puedes crear herramientas que simplifican much\u00edsimo la gesti\u00f3n de tu sitio y la edici\u00f3n de contenidos. Adem\u00e1s, esta arquitectura te abre las puertas a funciones avanzadas que antes resultaban demasiado complejas de implementar o demasiado caras.<\/p>\n<p>Y, sin embargo, esto no es m\u00e1s que el principio. La inteligencia artificial es una realidad en constante evoluci\u00f3n que, sin duda, va a desencadenar una oleada de innovaci\u00f3n a gran escala.<\/p>\n<p>Hablando de innovaci\u00f3n\u2026 \u00bfYa has probado el alojamiento de Kinsta? Si quieres potenciar tu sitio web con la mejor tecnolog\u00eda disponible hoy en d\u00eda para WordPress, <a href=\"https:\/\/kinsta.com\/es\/precios\/\">prueba Kinsta sin compromiso<\/a> o <a href=\"https:\/\/kinsta.com\/es\/contactar-con-ventas\/\">ponte en contacto con nuestro equipo de ventas<\/a> para saber m\u00e1s.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Antes de WordPress 7.0, los plugins que a\u00f1ad\u00edan funcionalidades de IA ten\u00edan que solicitar y gestionar una clave API para comunicarse con un proveedor de IA. &#8230;<\/p>\n","protected":false},"author":36,"featured_media":83938,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1345],"class_list":["post-83937","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-desarrollo-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Integraci\u00f3n de la IA en WordPress: arquitectura y un ejemplo real<\/title>\n<meta name=\"description\" content=\"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real\" \/>\n<meta property=\"og:description\" content=\"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T12:45:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-28T13:51:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"32 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real\",\"datePublished\":\"2026-07-22T12:45:27+00:00\",\"dateModified\":\"2026-07-28T13:51:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\"},\"wordCount\":4954,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\",\"name\":\"Integraci\u00f3n de la IA en WordPress: arquitectura y un ejemplo real\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"datePublished\":\"2026-07-22T12:45:27+00:00\",\"dateModified\":\"2026-07-28T13:51:30+00:00\",\"description\":\"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desarrollo WordPress\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/desarrollo-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integraci\u00f3n de la IA en WordPress: arquitectura y un ejemplo real","description":"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/","og_locale":"es_ES","og_type":"article","og_title":"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real","og_description":"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.","og_url":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2026-07-22T12:45:27+00:00","article_modified_time":"2026-07-28T13:51:30+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Carlo Daniele","Tiempo de lectura":"32 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real","datePublished":"2026-07-22T12:45:27+00:00","dateModified":"2026-07-28T13:51:30+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/"},"wordCount":4954,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/","url":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/","name":"Integraci\u00f3n de la IA en WordPress: arquitectura y un ejemplo real","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","datePublished":"2026-07-22T12:45:27+00:00","dateModified":"2026-07-28T13:51:30+00:00","description":"Explora la infraestructura de IA nativa en WordPress. Analizamos su arquitectura, flujos internos y un caso pr\u00e1ctico de audio a texto.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2026\/07\/wordpress-ai-integration-a-deep-dive-into-architecture-and-a-real-world-use-case.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/ia-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Desarrollo WordPress","item":"https:\/\/kinsta.com\/es\/secciones\/desarrollo-wordpress\/"},{"@type":"ListItem","position":3,"name":"Integraci\u00f3n de la IA en WordPress: Un an\u00e1lisis en profundidad de la arquitectura y un caso pr\u00e1ctico real"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/83937","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=83937"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/83937\/revisions"}],"predecessor-version":[{"id":84027,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/83937\/revisions\/84027"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/translations\/es"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/83937\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/83938"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=83937"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=83937"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=83937"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}